В этом примере показано, как смоделировать два использования стратегий хеджирования оптимизация портфеля 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');
Вычислите цены различных пут-опционов с помощью модели Black-Scholes с 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
плюс цена пут-опциона. Наконец, чтобы вычислить возврат стратегий пут-опциона, разделите наблюдаемую цену минус начальная буква, стоившая начальной стоимостью.
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 являются двумя различными мерами по риску, этот пример иллюстрирует, что эффективный портфель для одного типа меры по риску не эффективен для другого.
Исследуйте веса портфеля porfolios, которые составляют каждую границу эффективности, чтобы получить более подробное сравнение между границами эффективности 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, портфель с максимальным ожидаемым доходом является тем, который выделяет весь вес стратегии только для запаса. Это целесообразно, потому что никакие пут-опционы не получены, который переводит в большие возвраты. Кроме того, портфель с минимальным отклонением является тем же самым для обеих мер по риску. Этот портфель является тем, который выделяет все 'Hedge95'
потому что та стратегия ограничивает возможные потери больше всего. Реальные различия между двумя типами porfolios наблюдаются для уровней возврата между минимумом и максимумом. Там, в отличие от эффективных портфелей, полученных с помощью отклонения в качестве меры риска, веса портфелей CVaR располагаются среди всех пяти возможных стратегий.
PortfolioCVaR
| getScenarios
| setScenarios
| estimateScenarioMoments
| simulateNormalScenariosByMoments
| simulateNormalScenariosByData
| setCosts
| checkFeasibility