以下代码段为每个索引返回系列创建一个paretotails类型的对象。这些Pareto尾部对象封装参数Pareto下尾部,非参数内核平滑内部和参数Pareto上尾部的估计,以为每个索引构建复合半参数CDF。
R
1
2
3
tailFraction=0.1;
marginal{i}=paretotails(return(:,i),tailFraction,1-tailFraction,'kernel');
SPY的边际分布:
分段分布有3个部分
R
1
2
3
4
5
-Inf
-0.0125822
0.01286
EEM的边际分布:
分段分布有3个部分
-Inf
-0.0186259
0.0185703
TLT的边际分布:
分段分布有3个部分
-Inf
-0.0132814
0.0128738
COY的边际分布:
分段分布有3个部分
-Inf
-0.0105025
0.011195
GSP的边际分布:
分段分布有3个部分
-Inf
-0.0161561
0.016506
RWR的边际分布:
分段分布有3个部分
-Inf
-0.0172097
0.0168041
得到的分段分布对象允许在CDF内部进行插值并在每个尾部进行外推(函数评估)。外推允许估计历史记录之外的分位数,这对于风险管理应用是非常宝贵的。在这里,我们将paretoTail分布产生的拟合与正态分布的拟合进行比较。
R
1
2
3
4
5
6
7
8
9
10
11
index=1;
dist=marginal{index};
CLF
h=probplot(gca,@dist.cdf);
set(h,'Color','r');
title(['Semi-Parametric / Piecewise Probability Plot:'names{index}])
Copula拟合
我们使用统计工具箱功能来校准和模拟数据。
使用每日索引返回,使用函数copulafit估计高斯和t copula的参数。由于在标量自由度参数(DoF)变得无限大时,copula变为高斯copula,因此两个copula实际上属于同一族,因此共享线性相关矩阵作为基本参数。
统计工具箱软件提供了两种在copula校准的技术:以下代码段首先通过上面导出的分段半参数CDF将每日居中的回报转换为均匀变量。然后它将Gaussian和t copula拟合到转换后的数据:
R
1
2
3
[〜,ax]=plotmatrix(U);title('拟合Copula之前的转换回报');
估算copula的参数。注意从t copula校准获得的相对较低的自由度参数,表明明显偏离高斯情况。
R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[rho,DoF]=copulafit('t',U,'ApproximateML')
rhoT=
10.88229-0.596930.408750.580270.81485
0.882291-0.523710.389060.631750.73608
-0.59693-0.523711-0.28404-0.37285-0.43114
0.408750.38906-0.2840410.29530.36207
0.580270.63175-0.372850.295310.47097
0.814850.73608-0.431140.362070.470971
DoF=
9.5014
估计的相关矩阵与线性相关矩阵相似但不相同
R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
corrcoef(return)每日收益的%线性相关矩阵
ans=
10.89745-0.610650.46770.591740.83717
0.897451-0.541670.456120.633220.76712
-0.61065-0.541671-0.30377-0.3918-0.44429
0.46770.45612-0.3037710.333120.43525
0.591740.63322-0.39180.3331210.49161
0.837170.76712-0.444290.435250.491611
Copula模拟
现在已经估计了copula参数,使用copularnd函数模拟联合依赖的均匀变量。
然后,通过外推Pareto尾部并对平滑后的内部进行插值,通过每个索引的逆CDF 将从copularnd导出的均匀变量转换为每日居中返回。这些模拟的居中回报与从历史数据集获得的回归一致。假设回报在时间上是独立的,但在任何时间点都具有由给定的copula引起的依赖性和等级相关性。
R
1
2
3
nPoints=10000;%#模拟观测值
计算单周期模拟VaR
来自copula模型的多变量模拟可用于计算样本组合的风险值和预期不足(CVaR)。
R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
%样本组合组件权重
wts=[.1.2.3.2.1.1]';
%从模拟组件返回生成组合返回
portReturns = R * wts;
%计算VaR
var = -prctile(portReturns,1);
cvar = -mean(portReturns(portReturns
%与正态分布比较
R2 = mvnrnd(mean(returns),cov(returns),10000);
normReturns = R2 * wts;
var2 = -prctile(normReturns,1);
cvar2 = -mean(normReturns(normReturns
disp('CopulaValue-at-Risk----------------------');
fprintf('99%%VaR:%0.2f%%\n99%%CVaR:%0.2f%%\n\n',var * 100,cvar * 100);
disp('多变量正常风险值---------');
fprintf('99%%VaR:%0.2f%%\n99%%CVaR:%0.2f%%\n\n',var2*100,cvar2*100);
Copula风险价值----------------------
99%的风险价值:1.78%
99%CVaR:2.58%
多变量正常风险值---------
99%VaR:1.49%
99%CVaR:1.71%
组合优化
以前,我们使用模拟回报来计算样本组合的风险。相反,我们可以找到一个最佳投资组合(权重),为我们提供一定的回报风险。我们可以使用PortfolioCVaR框架来完成此任务。
R
1
2
3
4
5
6
7
8
9
10
11
p=PortfolioCVaR('ProbabilityLevel',。99,'AssetNames',名称);
p=p.setScenarios(R);
portRet=p.estimatePortReturn(wts);
CLF
visualizeFrontier(p,portRisk,portRet);
以给定的回报水平计算投资组合
R
1
2
3
4
5
6
7
wt=p.estimateFrontierByReturn(.05/100);
TOC;
pRisk=p.estimatePortRisk(wt);
pRet=p.estimatePortReturn(wt);
经过的时间是0.635017秒。