У меня есть 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