Решите для ввода в моделировании Matlab, что приведет к получению результата - PullRequest
0 голосов
/ 12 марта 2019

У меня есть 8 активов, которые можно объединить в один портфель, и данные об их ожидаемой доходности, риске и корреляции. Для данной комбинации весов активов я написал ниже в Matlab функцию, которая будет запускать симуляцию Монте-Карло для объединенного портфеля и генерировать распределение возможных результатов доходности.

Моя цель - найти все возможные комбинации весов, которые приведут к тому, что 35-й процентиль этого распределения будет равен 3,5%.

Итак, с точки зрения кода, я хочу найти все комбинации ввода "весов" , которые приведут к выводу lookup , равному 35. В качестве альтернативы я бы также Я хочу найти вектор весов, который приводит к lookup = 35, а также максимизирует доходность портфеля. Есть ли простой способ выполнить любую из этих задач в Matlab?

См. Ниже код:

function [PortRisk, PortRet, dist, lookup] = stochopt(returns, vol, Corr, weights)

    % construct diagonal matrix

        AssetList = Corr.Properties.VariableNames;

        Corr = table2array(Corr);

        CorrMatrix = tril(Corr) + tril(Corr,-1)'  ; 

    % Create covariance matrix

       CovMatrix = corr2cov(vol, CorrMatrix)';

    %Convert arithmetric returns to   
    variance = vol.^2 ;
    returns = returns + (0.5.*variance);

    % Project annual correlated asset returns over 20 year period 

    StartPrice = 1; %this is arbitrary
    NumSim = 10000; %10000 trials
    NumObs = 20; %20 year horizon
    RetIntervals = 1; %1 year timestep  
    rng('default'); % make output reproducible
    AssetExpectedReturn = portsim(returns', CovMatrix, NumObs, RetIntervals, NumSim, 'Expected');

    tcov = CovMatrix(1:end-1,1:end-1);
    [PortRisk, PortRet] = portstats(returns(1:end-1)',tcov, MixO');

    for i = 1:NumSim
    RealAssetExpectedReturn(:,:,i) = AssetExpectedReturn(:,1:end-1,i) - AssetExpectedReturn(:,end,i);
    RealPortRet(:,i) = (RealAssetExpectedReturn(:,:,i)*MixO);

    end

    %Calculate PnL over horizon 
    PortPrice = ret2tick(RealPortRet, repmat(StartPrice, 1, NumSim));
    PnL = ((PortPrice(end,:))./StartPrice)-1;

    %annualize
    annualizedPnL = ((1+PnL).^(1/NumObs))-1;


    dist = prctile(annualizedPnL, 1:99)';

    vec = find(dist>=0.035);

    lookup = vec(1);

    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...