python做var模型_【Python金融量化】VaR系列(五):Copula模型估计组合VaR-阿里云开发者社区...

1. 资产组合VaR建模方法回顾

文章中总结了通过DCC模型估计组合向前一日VaR的方法,整体思路如下:

●  通过Garch族模型估计各资产的波动率

●  通过DCC模型估计各资产间的相关系数,结合1得到资产组合的协方差矩阵

●  在各资产正态性假设的前提下,可以知道资产组合也服从正态分布,并且均值与协方差阵已在1,2中计算得到

●  在已知组合中各但资产权重w的情况下,根据下式计算组合VaR

文章中总结了通过蒙特卡洛方法估计组合向前K日VaR的方法,也可以仅计算组合向前一日VaR(本文只考虑向前1日的情况),文章中也对比了蒙特卡洛方法与DCC方法得到的结果,差异并不大。蒙特卡洛方法的思路如下:

●  根据Garch族模型估计资产的波动率

●  根据DCC模型估计组合的相关系数

●  在1,2的基础上,在正态性假设前提下,得到组合的分布函数,对组合收益率进行模拟,在给定各资产权重w的情况下,可以得到组合的总收益

●  重复1-3若干次,可以得到组合总收益的模拟序列,类似HS方法,取p分位数即可

可以看出不论是DCC模型还是蒙特卡洛方法,都是在正态性假设的前提下,得到组合的分布函数再进行求解。事实上,也可以类比多元正态的概念构建多元t分布和多元渐进t分布,假设组合服从这样的分布,求出分布的参数后,再用蒙特卡洛方法进行模拟,这些理论依据已经很成熟,推导过程见文献[1],这里不再赘述。

但需要说明的是,多元t分布和多元渐近t分布都没有边际分布和线性组合依然多元t或者多元渐近t的性质。回忆多元正态的情况下,为了生成多元正态随机数,实际上是先产生不相关的n组一元正态随机数向量,然后通过cholesky分解转换为符合给定相关系数矩阵的组合收益率模拟序列。如果组合的分布不具有类似多元正态的性质,要根据分布函数模拟组合收益就比较困难,必须直接通过多元分布函数产生随机数,不能分解成单个资产去做,虽然也有相关的方法可以生成给定分布函数下随机数,但都比较麻烦,这是之前方法的一个局限性。

此外,多元正态假设所有的单个资产都是正态分布,多元t分布和多元渐近t分布的边际分布并非t分布或者渐近t分布,而不同的资产可能服从不同的分布,需要用不同方法去建模,已有的多元分布都不能满足这一条件,这是之前方法的另一局限性。

比较理想的状态是,我们可以用不同的方法对不同的单资产进行建模,最终n各资产具有不同的分布函数

这种情况下,如果可以找到一个连接函数G,通过这n个边际分布得到组合的分布F,就可以解决上面所说的两种局限。

这也正是本文总结的Copula模型的逻辑。

2.Copula模型

Sklar定理

Copula模型整体来说比较复杂,这里只对关键的部分加以说明,模型中最重要的定理是Sklar定理,也就是上面所说的理想情况,具体叙述如下

G称为copula CDF,在sklar定义的假设下,如果我们已经通过一些单变量模型得到了单资产的分布函数,只需要确定出copula函数G,就相当于知道了组合的分布函数,从而把估计组合分布函数的问题转化为估计copula函数的问题。当然copula函数也不是靠猜,有一些常用的copula函数可以选择,在确定了copula函数之后,可以通过MLE等方法估计参数。

参数估计(MLE)

这里的C就是上文的G,见参考文献[2],二元情况下,可以细分为

其中,序号1称为Gumbel Copula函数,序号2称为Clayton Copula函数,序号3称为Frank Copula函数,之所以说明这三个,是因为这三个实际应用中比较多,python的copulalib包中也只提供这三种方法,不过本文并未尝试这几种方法,有兴趣的可以自己尝试下。

VaR估计思路

从之前的叙述中可以看出,通过copula函数得到的组合分布函数没有非常好的解析表达式,所以直接通过定义计算VaR的方法行不通,一般采取与蒙特卡洛方法相结合的方式,生成给定copula函数下的随机数,模拟资产组合的收益序列,再根据组合权重得到组合总收益,重复若干次,取p分位数。

随机数构造

使用蒙特卡洛方法的难点在于生成给定copula函数下的随机数,需要用到Nelsen定理,详见参考文献[2]

用Nelson定理构造随机数的方法如下

看了下copulib的源码,就是用这种方法构造的。而如果是多元正态copula或者多元t-copula的话, 有更简便的方法。以二元为例,可以往更高维推广

服从二元正态,可以直接模拟,然后再用标准正态分布函数作用,就可以得到符合给定多元正态copula的随机数,多元t-copula分布类似。

在得到符合给定copula分布的随机数u后,根据单个资产的分布F,可以得到单资产对应的随机数z

随后可以根据权重计算组合收益进而估计VaR。

综上,可以将Copula函数估计VaR的过程总结如下

选择copula函数,估计参数

第一步:根据单变量模型对所有单资产进行建模,估计分布函数F;

第二步:根据所有的分布函数F和给定copula函数,最大化对数似然函数估计参数;

蒙特卡洛模拟估计VaR

第一步:生成符合copula函数的随机数;

第二步:通过随机数得到各资产收益的模拟序列;

第三步:根据各资产权重得到组合收益序列,取p分位数作为VaR估计值

3.实证分析

数据:S&P500、US 10yr T-Note Fixed Term(同上一篇)

区间:2001-2010

蒙特卡洛模拟次数:10000次

数据和代码在后台回复“VaR5”获取

仅估计最后一天的VaR。代码中未给出太多注释,可以参见文献[1]第九章习题。

前两道题首先通过threshold correlation说明正态性假设并不符合实际,threshold correlation定义如下,r(p)表示r的p分位数

结果如下

蓝色线为真实收益序列的threshold correlation,红色为标准正态的,如果将真实收益序列转化为标准收益,结果如下

可以看出,二者相差很大,说明用多元正态进行建模并不符合实际。

1def getThre_cor(data,column1,column2,p):

2cor = pd.DataFrame(p,columns = ['p'])

3cor['thre_cor'] =0

4foriinrange(cor.shape[0]):

5ifp[i] <=0.5:

6condition1 = (data[column1] <= np.percentile(data[column1],p[i]*100))

7condition2 = (data[column2] <= np.percentile(data[column2],p[i]*100))

8else:

9condition1 = (data[column1] > np.percentile(data[column1],p[i]*100))

10condition2 = (data[column2] > np.percentile(data[column2],p[i]*100))

11datas = data.loc[condition1 & condition2,:]

12cor.loc[i,'thre_cor'] = np.corrcoef(datas[column1],datas[column2])[0,1]

13returncor

14

15def Thre_cor_norm(num,rou):

16np.random.seed(52)

17data = pd.DataFrame(index = range(num))

18data['r1'] = np.random.normal(size=(num,1))

19data['r2'] = np.random.normal(size=(num,1))

20

21data['r1_c'] = data['r1']

22data['r2_c'] = data.r1*rou + data.r2*(1- rou**2)**0.5

23returndata

24

25p = np.arange(0.15,0.90,0.05)

26rou = np.corrcoef(data1.Log_Return_SP,data1.Log_Return_US)[0,1]

27data_norm = Thre_cor_norm(30000,rou)

28cor_norm = getThre_cor(data_norm,'r1_c','r2_c',p)

29

30p = np.arange(0.15,0.86,0.01)

31cor = getThre_cor(data1,'Log_Return_SP','Log_Return_US',p)

32ax = plt.figure(figsize=(10,5))

33plt.plot(cor.p,cor.thre_cor,linewidth =2)

34plt.plot(cor_norm.p,cor_norm.thre_cor,linewidth =2,color ='red')

35plt.grid()

36plt.show()

第三道题为用t-garch分别对两个单资产进行建模,估计参数d,不再说明;

第四道题为用第三问的结果建立二元正态copula模型,估计组合VaR,过程前面已经说明,代码如下

估计copula函数的参数

1def getNegativeLoglikelihood_copula(rou,r):

2LogLikeLihood = -r.shape[0]*np.log(1- rou**2)/2- ((r.norm1**2+r.norm2**2-2*rou*r.norm1*r.norm2)/(2*(1- rou**2)) -

30.5*(r.norm1**2+ r.norm2**2)).sum()

4return-LogLikeLihood

5

6rou_best = optimize.fmin(getNegativeLoglikelihood_copula,rou0, \

7args=(copula_data,),ftol =0.000000001)

8print('估计结果为:',rou_best)

模拟

1data4['u1c'] = data4['u1']

2data4['u2c'] = data4.u1*rou + data4.u2*(1- rou**2)**0.5

3data4['F1'] = norm(0,1).cdf(data4['u1c'])

4data4['F2'] = norm(0,1).cdf(data4['u2c'])

5data4['z1'] = t(d_SP).ppf(data4.F1)*((d_SP-2)/d_SP)**0.5

6data4['z2'] = t(d_US).ppf(data4.F2)*((d_US-2)/d_US)**0.5

7data4['R1'] = data4.z1*sigma_SP**0.5

8data4['R2'] = data4.z2*sigma_US**0.5

9data4['R'] =0.5*data4.R1 +0.5* data4.R2

10VaR = -np.percentile(data4.R,1)

最终估计结果为VaR = 0.0101,可以与上篇文章最后一日的结果相对比,基本上是一致的。

原文发布时间为:2018-10-1

本文作者:量化小白H

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab从矩阵中取rp开头文件,matlab trainrp

Af ] train(net, P,T, Pi, Ai,VV ,TV ) 3 [Y, Pf , Af , E, perf ] sim(net, P, Pi, Ai,T ) {tansig,purelin},trainrp BP lr......traingdm、traingda、 traingdx 、 trainrp 、 ...traingdm traingda traingdx trainrp train...{tansig,purelin},trainrp BP 网络的训练函数 训…

手机浏览器网址_「效率集」自定义网址导航高级功能介绍

「效率集」是国内仅有的几家提供了个性自定义导航的网站&#xff0c;功能比hao123强&#xff0c;用户体验优于百度导航首页&#xff0c;且支持聚合搜索&#xff0c;方便用户从不同渠道&#xff08;网页&#xff0c;微博&#xff0c;微信公众号&#xff0c;知乎&#xff0c;维基…

属于服务器端运行的程序_生信分析云平台产品开发 - 5 生信分析pipeline服务器端运行...

在上文 [生信分析云平台产品开发 - 4 生信分析pipeline的图形化] 讨论了生信分析pipeline的图形化&#xff0c;如何用图形的方式显示生信pipeline&#xff0c;但是pipeline脚本按照变量的形式保存之后&#xff0c;如何运行&#xff0c;在什么环境下运行&#xff1f;是本文要解决…

c mysql 统计不重复数据库,MySQL_MySQL数据库中分组统计的问题,首先准备四张表A、B、C、D, - phpStudy...

MySQL数据库中分组统计的问题首先准备四张表A、B、C、D&#xff0c;--------------------------------A  | B  | C  | Da b | a c | a d | d e1 1 | 1 1 | 1 A | A 12 2 | 1 3 | 2 B | B 23 4 | …

TF卡里删掉文件后内存没变大_原来三星手机是这样清理内存的,难怪用好几年也不卡...

三星手机的耐用性一直都很高&#xff0c;而除了手机本身系统性能做的很好之外&#xff0c;手机的设置也是很人性化的。在三星手机使用了一段时间过后&#xff0c;手机里的内存会越来越大&#xff0c;手机里的垃圾也会越存越多&#xff0c;那么我们应该怎么清理手机中的内存呢&a…

拓扑排序排课系统_视频结构化人脸布控系统

一、平台背景在国家智慧城市的建设中的公共安全&#xff0c;对维稳防控、全城布控、预测预警、综合管理等提出了更高需求&#xff0c;针对这些需求我们作为识别领域的领先者&#xff0c;结合我们的识别技术&#xff0c;更全面、更智能提出了我们视频结构化黑名单布控系统解决方…

php数组转ini文件,php – 将数组转换为.ini文件

为了编写.ini文件,你需要创建自己的函数,因为除了阅读之外,PHP没有提供开箱即用的功能(可以在这里找到&#xff1a;http://php.net/manual/pl/function.parse-ini-file.php).可能将多维数组封装到.ini-syntax兼容字符串的函数示例可能如下所示&#xff1a;function arr2ini(arr…

win10去掉快捷方式小箭头_简单几步,教你怎么去掉win10电脑图标小箭头

Windows通过在桌面图标上增加“小箭头”&#xff0c;来区分它是属于正经的应用程序、文件还是快捷方式。好处能够一目了然的区分桌面显示的内容都是什么。坏处就是对有强迫症、要求统一的用户来说&#xff0c;这个小箭头实在是太碍眼了&#xff01;如果你属于后者&#xff0c;注…

python整形怎么切片_python 切片操作 slice

列表切片&#xff1a;list [start_index, end_index, step] step可正可负&#xff0c;为正时表示从左往右取&#xff0c;为负时表示从右往左取步长-1&#xff1a;表示从右往左取&#xff0c;开始1&#xff0c;结束3&#xff0c;表示从左往右取&#xff0c;两个互相矛盾&#x…

php实现双向队列详解,PHP实现一个双向队列例子

deque&#xff0c;全名double-ended queue&#xff0c;是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出&#xff0c;其限定插入和删除操作在表的两端进行。双向队列(双端队列)就像是一个队列&#xff0c;但是你可以在任何一端添加或移除元素。双端队列(de…

CIF进口货物流程图_上海关区对外承包工程货物进口报关公司【清关代理吧】

进口清关&#xff1a;退运/返修/一般贸易/对外承包工程专业、专心、专注提供服务上海港/上海海关&#xff1a;对外承包工程进口清关报关有需要看左边&#xff1a;←←←←←←←进口清关报关要注意哪些问题&#xff1a;(同行禁止抄袭及转载)首先&#xff1a;要找一家靠谱、值得…

月均数据_程序员月均薪多少,2019全国互联网行业程序员就业大数据报告

《2019全国互联网行业程序员就业大数据报告》&#xff0c;该报告针对程序员画像、专业背景、职能供需分布、城市分布特征和薪资优势等方面进行分析。作者&#xff1a;子瑜说IT下面&#xff0c;一起来看看&#xff0c;2019年1月-9月程序员的就业现状。01、程序员基础画像“程序媛…

php json 循环输出html,我要用js从json文件中取值,并输出的html页面,有个问题

json文件有多个 0.json 1.json 2.json 3.json ...现在的情况是js可以挨个读取json文件中的内容&#xff0c;但是每次读取新文件的时候之前的文件内容就没了&#xff0c;我想要加载新json文件内容时&#xff0c;保留之前的读出来的内容求大神&#xff01;&#xff01;&#xff0…

单分支 两路分支和多分支的if结构_JavaScript学习笔记(二)-- 分支结构

分支结构我们的 js 代码都是顺序执行的&#xff08;从上到下&#xff09;逻辑分支就是根据我们设定好的条件来决定要不要执行某些代码IF 条件分支结构if 语句通过一个 if 语句来决定代码执行与否a语法&#xff1a; if (条件) { 要执行的代码 }通过 () 里面的条件是否成立来决定…

php 时间格式化_3分钟短文 | PHP获取函数的代码片段,唯有反射最高效

引言为了演示上一篇我们所说的PHP中反射的应用&#xff0c;本篇接着讲反射的应用。因为其特性&#xff0c;是操作函数和方法的&#xff0c;是函数的操作者&#xff0c;类的操作者&#xff0c;所以显得格外重要。我们从一个小需求出发&#xff0c;假如有一段这样的代码&#xff…

文本解析 python 多行,关于python:基于文本的数据格式,支持多行字符串

我搜索支持多行字符串的基于文本的数据格式。JSON不允许多行字符串&#xff1a;>>> import json>>> json.dumps(dict(textfirst linesecond line)){"text":"first line\second line"}我想要的输出&#xff1a;{"text":"f…

电脑屏幕卡住了按什么都没反应_手机突然“死机”了关机也不行,怎么按都没反应,怎么办?...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。人有生老病死&#xff0c;手机也可能遇到死机黑屏的问题。在手机众多的“疑难杂症”中…

python中哪里用到缩进_建筑防火中各类门的总结归纳!乙级门?甲级门?都哪里用到了!...

大家在学习防火部分时&#xff0c;会遇到各种场所设置不同耐火性能的防火门&#xff0c;很杂乱的感觉&#xff0c;今天这里就好好总结一下&#xff0c;希望对大家能有帮助&#xff01;一&#xff1a;双设门1.防烟楼梯间&#xff1a;此处的防烟楼梯间分为两种&#xff1a;一种是…

linux 打开php服务器文件夹,Linux下如何查看文件和文件夹大小

《Linux下如何查看文件和文件夹大小》要点&#xff1a;本文介绍了Linux下如何查看文件和文件夹大小&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。相关主题&#xff1a;服务器配置1 Linux下查看文件和文件夹大小当磁盘大小超过标准时会有报警提示&#xff0c…

android media apex_APEX英雄主播即将登陆时代广场?人气十强介绍!

5月6日&#xff0c;在经过14天短暂而激烈的战斗后&#xff0c;由小葫芦星球联合海外fanx基金会共同举办的APEX英雄篇主播C位战「人气主播榜」率先顺利收官。而在明天即5月8日中午12点将准时开启本次APEX英雄篇主播C位战支线——「潜力主播榜」&#xff0c;前三强选手也同样能够…