文章目录
1. functPortfolioInsurance
function [Wealth,Floor] = functPortfolioInsurance(wealth,multiplier,floor,strategy,returnsStocks,returnsBills,volaStocks)
period = size(returnsStocks,1);
path = size(returnsStocks,2);
Wealth = ones(period+1,path) * wealth;
Stocks = ones(period+1,path);
Bills = ones(period+1,path);
Cushion = ones(period+1,path);
Exposure = ones(period+1,path);
Floor = ones(period+1,path) * floor * wealth;
CPPI
Constant Proportion Portfolio Insurance
固定比例投资组合保险策略
switch strategy
case 'CPPI'
for t = 1:period
% Adjust Asset allocation
Floor(t,:) = Floor(end,:)*exp(-returnsBills*(period -(t-1)));% discounted floor
Cushion(t,:) = Wealth(t,:) - Floor(t,:);
Exposure(t,:) = min(multiplier * (Cushion(t,:)),Wealth(t,:));
Stocks(t,:) = Exposure(t,:);
Bills(t,:) = Wealth(t,:) - Stocks(t,:);
Wealth(t,:) = Stocks(t,:) + Bills(t,:);
%Apply Asset Returns
Stocks(t+1,:) = Stocks(t,:).* exp(returnsStocks(t,:));
Bills(t+1,:) = Bills(t,:).* exp(returnsBills);
Wealth(t+1,:) = Stocks(t+1,:) + Bills(t+1,:);
end
TIPP
Time Invariant Portfolio Protection
时间不变性投资组合保险策略
case 'TIPP'
for t = 1:period
Cushion(t,:) = Wealth(t,:) - Floor(t,:);
Exposure(t,:) = min(multiplier * (Cushion(t,:)),Wealth(t,:));
Stocks(t,:) = Exposure(t,:);
Bills(t,:) = Wealth(t,:) - Stocks(t,:);
Wealth(t,:) = Stocks(t,:) + Bills(t,:);
Stocks(t+1,:) = Stocks(t,:) .*exp(returnsStocks(t,:));
Bills(t+1,:) = Bills(t,:) .*exp(returnsBills);
Wealth(t+1,:) = Stocks(t+1,:) + Bills(t+1,:);
Floor(t+1,:) = max( Wealth(t+1,:).* floor,Floor(t,:));
end
syntheticPut
复制性卖权策略
case 'syntheticPut'
StockPrice = ones(period+1,path) * wealth;
wStock = ones(period+1,path);
X = floor * wealth;
sigma = volaStocks;
T = period;
for t=1:period
Floor(t,:) = Floor(end,:)*exp(-returnsBills*(period -(t-1)));% discounted floor
Cushion(t,:) = Wealth(t,:) - Floor(t,:);
Exposure(t,:) = min(Cushion(t,:),Wealth(t,:));
d1(t,:) = (log(StockPrice(t,:)./X)+(returnsBills+0.5*sigma^2).*(T-t))./(sigma.*sqrt(T-t));
d2(t,:) = d1(t,:) - sigma.*sqrt(T-t);
wStock(t,:) = (StockPrice(t,:).* normcdf(d1(t,:)))./(StockPrice(t,:).* normcdf(d1(t,:)) + X.*exp(-returnsBills.*(T-t)).*(1-normcdf(d2(t,:))));
wStock(t,:) = min(wStock(t,:),1);
Stocks(t,:) = wStock(t,:).* Wealth(t,:);
Bills(t,:) = Wealth(t,:) - Stocks(t,:);
Wealth(t,:) = Stocks(t,:) + Bills(t,:);
Stocks(t+1,:) = Stocks(t,:) .*exp(returnsStocks(t,:));
Bills(t+1,:) = Bills(t,:) .*exp(returnsBills);
Wealth(t+1,:) = Stocks(t+1,:) + Bills(t+1,:);
StockPrice(t+1,:) = StockPrice(t,:).* exp(returnsStocks(t,:));
wStock(t+1,:) = Stocks(t+1,:)./Wealth(t+1,:);
end
otherwise
error('provide a portfolio insurance strategy')
end
2. functWienerProcess
function [returns] = functWienerProcess(mu,sigma,periods,paths)
returns = mu + sigma.*randn(periods,paths);
end
3. scriptPortfolioInsurance
clear all;close all;clc
cd('D:\学习\MMF\Introduction to Computational Finance\project')
rng(2021);
%% 3a load data
[DAX,~,dataRaw] = xlsread('Data.xlsx','Tabelle1');
logReturns = log(DAX(1:end-1)./DAX(2:end));
mu = mean(logReturns);
sigma = std(logReturns);
periods = 60;
paths = 100000;
simureturns = functWienerProcess(mu,sigma,periods,paths);
%% 3b
%input for 3 PF insuruance strategies
wealth = 100;
m = 5;
floor = 0.9;
returnsB = 0;
returnsS = simureturns;
volaStocks = sigma;
[WealthC,FloorC] = functPortfolioInsurance(wealth,m,floor,'CPPI',returnsS,returnsB,volaStocks);
[WealthT,FloorT] = functPortfolioInsurance(wealth,m,floor,'TIPP',returnsS,returnsB,volaStocks);
[WealthP,FloorP] = functPortfolioInsurance(wealth,m,floor,'syntheticPut',returnsS,returnsB,volaStocks);
% input for buy and hold
mB = 1;
floorB = 0;
[WealthB,FloorB] = functPortfolioInsurance(wealth,mB,floorB,'CPPI',returnsS,returnsB,volaStocks);
%% 3c Plot
%end Wealth of 3 strategies
endWealth = [WealthC(end,:);WealthT(end,:);WealthP(end,:)];
plot(WealthB(end,:),endWealth,'o')
legend('CPPI','TIPP','syntheticPut')
xlabel('Stock investment')
ylabel('Portfolio insurance strategy')
title('Relative Wealth at Maturity')
%% 3d
endWealth = [endWealth;WealthB(end,:)];
expectedW = mean(endWealth,2);
shortfall = endWealth<floor * wealth;
sp = sum(shortfall ,2)/paths;
se = mean(max(floor*wealth - endWealth,0),2);
xlswrite('Data.xlsx',[expectedW sp se],'Shortfall','B2:D5');