В этом примере показано, как смоделировать две стратегии хеджирования с помощью оптимизации портфеля CVaR с помощью PortfolioCVaR
объект. Во-первых, моделируется движение цен запаса при помощи gbm
объект с simByEuler
. Затем вы используете оптимизацию портфеля CVaR, чтобы оценить эффективную границу портфелей для возвратов на дату горизонта. Наконец, вы сравниваете портфель CVaR со средним портфелем отклонений, чтобы продемонстрировать различия между этими двумя типами мер риска.
Для определения и оценки портфеля CVaR требуются сценарии. Эти сценарии могут быть сгенерированы несколькими способами, а также получены из исторических наблюдений. Этот пример использует симуляцию Монте-Карло геометрического броуновского движения, чтобы сгенерировать сценарии. Симуляция Монте-Карло производит испытания цены акций через один год. Эти цены акций обеспечивают возвраты пяти различных инвестиционных стратегий, определяющих активы в портфеле CVaR. Эта стратегия генерации сценариев может быть дополнительно обобщена до симуляций с большим количеством запасов, инструментов и стратегий.
Определите профиль запаса.
% Price at time 0 Price_0 = 200; % Drift (annualized) Drift = 0.08; % Volatility (annualized) Vol = 0.4; % Valuation date Valuation = datetime(2012,1,1); % Investment horizon date Horizon = datetime(2013,1,1); % Risk-free rate RiskFreeRate = 0.03;
Моделируйте движение цен запаса от даты оценки до даты горизонта с помощью gbm
объект с simByEuler
.
% Number of trials for the Monte Carlo simulation NTRIALS = 100000; % Length (in years) of the simulation T = date2time(Valuation, Horizon, 1, 1); % Number of periods per trial (approximately 100 periods per year) NPERIODS = round(100*T); % Length (in years) of each time step per period dt = T/NPERIODS; % Instantiate the gbm object StockGBM = gbm(Drift, Vol, 'StartState', Price_0); % Run the simulation Paths = StockGBM.simByEuler(NPERIODS, 'NTRIALS', NTRIALS, ... 'DeltaTime', dt, 'Antithetic', true);
Постройте график симуляции запаса. Для эффективности постройте график только некоторых сценариев.
plot(squeeze(Paths(:,:,1:500))); title('Simulation of a Stock'); xlabel('Time'); ylabel('Price');
Вычислим цены на различные опции размещения с помощью модели Блэка-Скоулза с blsprice
функция.
% Put option with strike at 50% of current underlying price Strike50 = 0.50*Price_0; [~, Put50] = blsprice(Price_0, Strike50, RiskFreeRate, T, Vol); % Put option with strike at 75% of current underlying price Strike75 = 0.75*Price_0; [~, Put75] = blsprice(Price_0, Strike75, RiskFreeRate, T, Vol); % Put option with strike at 90% of current underlying price Strike90 = 0.90*Price_0; [~, Put90] = blsprice(Price_0, Strike90, RiskFreeRate, T, Vol); % Put option with strike at 95% of current underlying price Strike95 = 0.95*Price_0; % Same as strike [~, Put95] = blsprice(Price_0, Strike95, RiskFreeRate, T, Vol);
Цель состоит в том, чтобы найти эффективную границу портфеля для возвратов на дату горизонта. Следовательно, получите сценарии из испытаний симуляции Монте-Карло в конце периода симуляции.
Price_T = squeeze(Paths(end, 1, :));
Сгенерируйте матрицу сценария с помощью пяти стратегий. Первая стратегия - стратегия только для акций; остальная часть стратегий - акции, хеджированные с опциями пут на различных уровнях цены стрима. Чтобы вычислить возвраты от цен, полученных в результате симуляции Монте-Карло для стратегии только для акций, разделите изменение цены акций (Price_T - Price_0)
по начальной цене Price_0
. Чтобы вычислить возвраты акции с различными опциями пут, сначала вычислите «наблюдаемую цену» на дату горизонта, то есть цену акции с учетом приобретённой опции пут. Если цена акций на дату горизонта меньше цены страйка, то наблюдаемая цена является ценой страйка. В противном случае наблюдаемая цена является истинной ценой акций. Эта наблюдаемая цена представлена формулой
Затем можно вычислить «начальную стоимость» запаса с помощью опции размещения, которая определяется начальной ценой запаса Price_0
плюс цена опции пут. Наконец, чтобы вычислить возврат стратегий put option, разделите наблюдаемую цену за вычетом начальных затрат на начальные затраты.
AssetScenarios = zeros(NTRIALS, 5); % Strategy 1: Stock only AssetScenarios(:, 1) = (Price_T - Price_0) ./ Price_0; % Strategy 2: Put option cover at 50% AssetScenarios(:, 2) = (max(Price_T, Strike50) - (Price_0 + Put50)) ./ ... (Price_0 + Put50); % Strategy 2: Put option cover at 75% AssetScenarios(:, 3) = (max(Price_T, Strike75) - (Price_0 + Put75)) ./ ... (Price_0 + Put75); % Strategy 2: Put option cover at 90% AssetScenarios(:, 4) = (max(Price_T, Strike90) - (Price_0 + Put90)) ./ ... (Price_0 + Put90); % Strategy 2: Put option cover at 95% AssetScenarios(:, 5) = (max(Price_T, Strike95) - (Price_0 + Put95)) ./ ... (Price_0 + Put95);
Веса портфеля, сопоставленные с каждым из пяти ранее определенных активов, представляют собой процент от общего объема инвестиций в каждую стратегию. Например, рассмотрим портфолио с весами [0.5 0 0.5 0]
. Веса показывают, что лучшее распределение - это инвестировать 50% в стратегию только для акций, а оставшиеся 50% - в опцию под 75%.
Постройте график распределения возвратов для стратегии только для акций и опции пут на 95% стратегии. Заметьте, что возвраты обычно не распределяются. Для портфеля средних дисперсий отсутствие симметрии в нанесенных на график возвратах обычно указывает на плохую эффективность портфеля средних дисперсий, поскольку отклонение как мера риска не чувствительно к искаженным распределениям.
% Create histogram figure; % Stock only subplot(2,1,1); histogram(AssetScenarios(:,1),'Normalization','probability') title('Stock-Only Distribution') xlabel('Return') ylabel('Relative Probability') % Put option cover subplot(2,1,2); histogram(AssetScenarios(:,2),'Normalization','probability') title('Put Option at 95% Distribution') xlabel('Return') ylabel('Relative Probability')
Создайте PortfolioCVaR
объект с использованием AssetScenarios
из симуляции.
p = PortfolioCVaR('Name','CVaR Portfolio Five Hedging Levels',... 'AssetList',{'Stock','Hedge50','Hedge75','Hedge90','Hedge95'},... 'Scenarios', AssetScenarios, 'LowerBound', 0, ... 'Budget', 1, 'ProbabilityLevel', 0.95); % Estimate the efficient frontier to obtain portfolio weights pwgt = estimateFrontier(p); % Plot the efficient frontier figure; plotFrontier(p, pwgt);
Создайте Portfolio
объект. Использование AssetScenarios
из симуляции, чтобы оценить моменты активов. Заметьте, что, в отличие от PortfolioCVaR
объект, для полного определения портфеля средних дисперсий требуется только оценка моментов активов.
pmv = Portfolio('Name','Mean-Variance Portfolio Five Hedging Levels',... 'AssetList',{'Stock','Hedge50','Hedge75','Hedge90','Hedge95'}); pmv = estimateAssetMoments(pmv, AssetScenarios); pmv = setDefaultConstraints(pmv); % Estimate the efficient frontier to obtain portfolio weights pwgtmv = estimateFrontier(pmv); % Plot the efficient frontier figure; plotFrontier(pmv, pwgtmv);
Выберите целевой возврат. В этом случае целевой возврат является доходностью средней точки на эффективной границе портфеля CVaR.
% Achievable levels of return pretlimits = estimatePortReturn(p, estimateFrontierLimits(p)); TargetRet = mean(pretlimits); % Target half way up the frontier
Постройте график эффективного портфеля CVaR для возврата TargetRet
на эффективной границе CVaR.
% Obtain risk level at target return pwgtTarget = estimateFrontierByReturn(p,TargetRet); % CVaR efficient portfolio priskTarget = estimatePortRisk(p,pwgtTarget); % Plot point onto CVaR efficient frontier figure; plotFrontier(p,pwgt); hold on scatter(priskTarget,TargetRet,[],'filled'); hold off
Постройте график эффективного портфеля CVaR для возврата TargetRet
на средней дисперсионной эффективной границе. Заметьте, что эффективный портфель CVaR ниже эффективной границы со средним отклонением.
% Obtain the variance for the efficient CVaR portfolio pmvretTarget = estimatePortReturn(pmv,pwgtTarget); % Should be TargetRet pmvriskTarget = estimatePortRisk(pmv,pwgtTarget); % Risk proxy is variance % Plot efficient CVaR portfolio onto mean-variance frontier figure; plotFrontier(pmv,pwgtmv); hold on scatter(pmvriskTarget,pmvretTarget,[],'filled'); hold off
Постройте график эффективного портфеля средних дисперсий для возврата TargetRet
на эффективной границе CVaR. Заметьте, что эффективный портфель средних дисперсий ниже эффективной границы CVaR.
% Obtain the mean-variance efficient portfolio at target return pwgtmvTarget = estimateFrontierByReturn(pmv,TargetRet); % Obtain the CVaR risk for the mean-variance efficient portfolio pretTargetCVaR = estimatePortReturn(p,pwgtmvTarget); % Should be TargetRet priskTargetCVaR = estimatePortRisk(p,pwgtmvTarget); % Risk proxy is CVaR % Plot mean-variance efficient portfolio onto the CVaR frontier figure; plotFrontier(p,pwgt); hold on scatter(priskTargetCVaR,pretTargetCVaR,[],'filled'); hold off
Поскольку среднее отклонение и CVaR являются двумя различными показателями риска, этот пример показывает, что эффективный портфель для одного типа измерения риска не является эффективным для другого.
Исследуйте веса портфеля порфолио, которые составляют каждый эффективный рубеж, чтобы получить более подробное сравнение между средними дисперсионными и CVaR эффективными границами.
Постройте график весов, сопоставленных с эффективной границей портфеля средних дисперсий.
% Plot the mean-variance portfolio weights figure; area(pwgtmv'); legend(pmv.AssetList); axis([1 10 0 1]) title('Mean-Variance Portfolio Weights Five Hedging Levels'); xlabel('Portfolios from Minimum(1) to Maximum(10) Return'); ylabel('Contribution of each Asset');
Веса, связанные с портфелями средних дисперсий на эффективной границе, используют только две стратегии, 'Stock'
и 'Hedge95'
. Это поведение является эффектом корреляций среди пяти активов в портфеле. Поскольку корреляции между оценками близки к 1, стандартное отклонение портфеля является почти линейной комбинацией стандартного отклонения активов. Следовательно, поскольку активы с большей возвраты связаны с активами с большей отклонение, линейная комбинация только активов с самыми маленькими и самыми большими возвратами наблюдается на эффективной границе.
Постройте график весов, сопоставленных с эффективной границей портфеля CVaR.
% Plot the CVaR portfolio weights figure; area(pwgt'); legend(p.AssetList); axis([1 10 0 1]) title('CVaR Portfolio Weights Five Hedging Levels'); xlabel('Portfolios from Minimum(1) to Maximum(10) Return'); ylabel('Contribution of each Asset');
Для обоих типов портфелей, среднего отклонения и CVaR, портфель с максимально ожидаемой возвратом является тем, который распределяет весь вес стратегии только для запасов. Это имеет смысл, потому что не получаются опции put, что переводится в большие возвраты. Кроме того, портфель с минимальным отклонением является одинаковым для обеих мер риска. Этот портфель является тем, который все выделяет 'Hedge95'
потому что эта стратегия больше всего ограничивает возможные потери. Реальные различия между двумя типами порфолио наблюдаются для уровней возврата между минимальным и максимальным. Там, в отличие от эффективных портфелей, полученных с использованием отклонения в качестве меры риска, веса портфелей CVaR варьируются среди всех пяти возможных стратегий.
checkFeasibility
| estimateScenarioMoments
| getScenarios
| PortfolioCVaR
| setCosts
| setScenarios
| simulateNormalScenariosByData
| simulateNormalScenariosByMoments