Code covered by the BSD License  

Highlights from
Analyzing Investment Strategies with CVaR Portfolio Optimization

image thumbnail

Analyzing Investment Strategies with CVaR Portfolio Optimization


Bob Taylor (view profile)


18 Dec 2012 (Updated )

Scripts and data to demonstrate the new PortfolioCVaR object in Financial Toolbox.

%% Analyzing Investment Strategies with CVaR Portfolio Optimization in MATLAB - Calibration
% Robert Taylor
% The MathWorks, Inc.

% Copyright (C) 2012 The MathWorks, Inc.

%% Stock Total Return Price Data

% The script starts with data from the file |BuyWriteStockUniverse.mat| that contains a fints
% object, Universe, with asset symbols and 15 years of daily total return prices for 26 stocks.

load BuyWriteStockUniverse Universe

% Extract information from fints object Universe.

Assets = fieldnames(Universe, 1);			% stock symbols
X = fts2mat(Universe);						% stock total return prices
Y = log(X);									% log stock total return prices
numassets = numel(Assets);					% number of stocks in universe


%% Calibrate Geometric Brownian Motion

% Under an assumption that stock prices are geometric Brownian motion processes, the next step
% calibrates a continuous multivariate geometric Brownian motion process based on discrete samples
% of total return prices.

t0 = busdate(Universe.dates(1), -1);		% first business day prior to first date in data
T = Universe.dates(end);					% last date in data

% Determine average number of days in a year for the historical period. In this example, the period
% is known and fixed to be 15 years.

average_days_per_year = (T - t0)/15;

% Form "dates" for data relative to t0 in years based on average number of days in a year

t = linspace(0, (T - t0), 1 + size(X,1))'/average_days_per_year;	% "dates" from t0 for data

% Calibrate the model with maximum likelihood estimation.


[x0, mu, gamma] = gbm_calibration(t(1), X, t(2:end));

toc_cal = toc;

fprintf('Time to calibrate gbm parameters %g\n',toc_cal);

% Form various ancillary statistics from the estimated diffusion matrix.

covar = gamma*gamma';
[sigma, rho] = cov2corr(covar);
sigma = sigma(:);

% List calibrated parameters.

fprintf('Calibrated multivariate geometric Brownian motion parameters ...\n');
fprintf('  %5s  %10s  %10s  %10s\n','Asset','Initial','Drift','Diffusion');
fprintf('  %5s  %10s  %10s  %10s\n','','Price','Parameter','Parameter');
for i = 1:numel(x0)
	fprintf('  %5s  %10.2f  %10.2f  %10.2f\n',Assets{i},x0(i),100*mu(i),100*sigma(i));

%% Check log total return prices with annualized approximate calibration

% Select 4 assets with indices between 1 and 26 and run this cell to see fits for the selected
% assets.

ii = [ 2, 4, 6, 8 ];

for i = 1:4
	Y1 = Y(:,ii(i));
	EY1 = log(x0(ii(i))) + (mu(ii(i)) - 0.5*sigma(ii(i))^2)*(t(2:end) - t(1));
	SY1 = sigma(ii(i))*sqrt(t(2:end) - t(1));

	plot(t(2:end), Y1, 'b', t(2:end), EY1, 'g', t(2:end), [EY1 - SY1, EY1 + SY1], ':r');
	title(['\bf' Assets{ii(i)}]);

%% Plot scatter diagram of estimated returns and risks

scatter(sigma, mu, 'Filled');
text(sigma + 0.005, mu, Assets, 'FontSize', 8);
title('\bfReturn versus Risk for Assets in Universe');
xlabel('Annualized Standard Deviation \sigma Derived from GBM Diffusion');
ylabel('Annualized Mean \mu Derived from GBM Drift');

Contact us