Создайте PortfolioCVaR
возразите и включите список активов от CAPMUniverse.mat
. Используйте simulateNormalScenariosByData
симулировать сценарии для каждого из активов. Эти ограничения портфеля требуют полностью инвестированных длинно-единственных портфелей (неотрицательные веса, которые должны суммировать к 1
).
rng(1) % Set the seed for reproducibility. load CAPMuniverse p = PortfolioCVaR('AssetList',Assets(1:12)); p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true); p = setProbabilityLevel(p, 0.95); p = setDefaultConstraints(p); disp(p)
PortfolioCVaR with properties: BuyCost: [] SellCost: [] RiskFreeRate: [] ProbabilityLevel: 0.9500 Turnover: [] BuyTurnover: [] SellTurnover: [] NumScenarios: 20000 Name: [] NumAssets: 12 AssetList: {1x12 cell} InitPort: [] AInequality: [] bInequality: [] AEquality: [] bEquality: [] LowerBound: [12x1 double] UpperBound: [] LowerBudget: 1 UpperBudget: 1 GroupMatrix: [] LowerGroup: [] UpperGroup: [] GroupA: [] GroupB: [] LowerRatio: [] UpperRatio: [] MinNumAssets: [] MaxNumAssets: [] BoundType: [12x1 categorical]
Чтобы получить портфель, который максимизирует вознаграждение для коэффициента риска (который эквивалентен отношению Шарпа для портфелей среднего отклонения), поиск на границе эффективности итеративно для porfolio, который минимизирует отрицание вознаграждения для коэффициента риска:
Для этого используйте sratio
функция, заданная в разделе Local Functions, чтобы возвратить отрицательное вознаграждение для коэффициента риска за целевой возврат. Затем передайте эту функцию fminbnd
fminbnd
выполняет итерации через возможные возвращаемые значения и оценивает их связанное вознаграждение для коэффициента риска. fminbnd
возвращает оптимальный возврат, для которого максимальное вознаграждение для коэффициента риска достигается (или это минимизирует отрицание вознаграждения для коэффициента риска).
% Obtain the minimum and maximum returns of the portfolio. pwgtLimits = estimateFrontierLimits(p); retLimits = estimatePortReturn(p,pwgtLimits); minret = retLimits(1); maxret = retLimits(2); % Search on the frontier iteratively. Find the return that minimizes the % negative of the reward-to-risk ratio. fhandle = @(ret) iterative_local_obj(ret,p); options = optimset('Display', 'off', 'TolX', 1.0e-8); optret = fminbnd(fhandle, minret, maxret, options); % Obtain the portfolio weights associated with the return that achieves % the maximum reward-to-risk ratio. pwgt = estimateFrontierByReturn(p,optret)
pwgt = 12×1
0.0885
0
0
0
0
0.9115
0
0
0
0
⋮
Используйте plotFrontier
построить границу эффективности и estimatePortRisk
оценить максимальный портфель вознаграждения для коэффициента риска.
plotFrontier(p); hold on % Compute the risk level for the maximum reward-to-risk ratio portfolio. optrsk = estimatePortRisk(p,pwgt); scatter(optrsk,optret,50,'red','filled') hold off
Эта локальная функция, которая вычисляет отрицание вознаграждения для коэффициента риска за целевой уровень возврата.
function sratio = iterative_local_obj(ret, obj) % Set the objective function to the negative of the reward-to-risk ratio. risk = estimatePortRisk(obj,estimateFrontierByReturn(obj,ret)); if ~isempty(obj.RiskFreeRate) sratio = -(ret - obj.RiskFreeRate)/risk; else sratio = -ret/risk; end end
PortfolioCVaR
| getScenarios
| setScenarios
| estimateScenarioMoments
| simulateNormalScenariosByMoments
| simulateNormalScenariosByData
| setCosts
| checkFeasibility