python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化

你可能会问,为什么是copulas?我们指的是数学上的概念。

由Kaizong Ye,Sherry Deng撰写

简单地说,copulas是具有均匀边际的联合分布函数。

最重要的是,它们允许你将依赖关系与边际分开研究。有时你对边际的信息比对数据集的联合函数的信息更多,而copulas允许你建立关于依赖关系的 “假设 “情景。

copulas可以通过将一个联合分布拟合到均匀分布的边际上而得到,这个边际是通过对你感兴趣的变量的cdf进行量化转换而得到的。 

×

从实际应用的角度讲,这样的分解大大简化了我们对金融问题的分析,以及对金融随机变量的刻画和模型的构建。在建模的过程中,我们可以分别估计各个随机变量的边缘分布,然后选取合适的Copula 并估计其参数。这二者是独立的。甚至我们可以根据我们的需要,选择不同边缘分布与 copula的任意组合。这一灵活性(flexibility) 使得Copula成为建模中一类强大的工具。

具体应用举例:

  1. CDO定价。 在 CDO 定价中,核心是得到标的资产池(underying portfolio) 的违约损失分布。为此,我们需要刻画每种标的资产的边缘违约损失分布,同时也需要对它们之间的关联性进行建模。边缘分布比较简单,我们可以通过对每种标的资产发行方的 CDS曲线,通过bootstrapping 得到其 hazard rate, 以及违约概率的期限结构(前提是选取给定的LGD). 关联性,最基础的出发点是Gaussian Copula, 其实质是用一个参数,也就是隐含相关系数(implied correlation)来刻画整个资产池的 dependence structure. 当然,类似 Black Schole公式中常数波动率的局限,实际当中我们不可能指望通过一个相关系数就 match 所有的市场上交易的 index tranche quote, 因此市场的惯例是对每个交易的index tranche (比如,5年到期CDX.NA.IG.8的[3%,7%]tranche), 根据 1-factor Gaussian Copula 得到一个隐含相关系数,所有的相关系数的集合称为 base correlation surface (固定期限)或 base correlation cube(允许期限变动).

  2. Composite Copula. 某些情况下,如 [公式] (这种产品在08年之后基本上逐渐绝迹)我们可能需要对不同的标的资产选取不同的边缘分布。比如对于某些较大的资产池选用正态分布,而对于较小的资产池选用更加准确的二项分布,甚至是通过卷积得到的理论上的精确分布。而dependence structure 依然选用Gaussian Copula. 这就产生了所谓的Composite Copula或者 Quasi Copula. 注意在这种情况下边缘分布可以是非参数或半参数的而非一定要有解析形式,比如 通过kernel得到的分布形式。

  3. 资产组合风险(Portfolio Risk). 通常是通过PCA将系统分解为几个主要的风险因子,对每个风险因子的边缘分布进行估计,然后通过Copula来对因子之间的dependence进行建模。注意,通常在这类应用中,因子的个数也就是Copula的维数不能太高,否则会引入过多参数从而影响模型的健壮性。另外,如果因子之间的关联偏离正态分布较明显,一个方法是使用 ICA来替代PCA,这样接下来就不用再次估计Copula, 因为ICA所得到的因子是相互独立的,或者说这时的Copula 退化为简单的乘积函数。

  4. Equity Basket Derivatives的定价。与CDO有些类似,只不过标的资产换成了一篮子股票而非债券或 CDS。这时依然可以用Copula来描述不同股票价格之间的关联性。



这篇文章是关于Python的(有numpy、scipy、scikit-learn、StatsModels和其他你能在Anaconda找到的好东西),但是R对于统计学来说是非常棒的。我重复一遍,R对统计学来说是非常棒的。

如果你是认真从事统计工作的,不管你是否喜欢R,你至少应该看看它,看看有哪些包可以帮助你。很有可能,有人已经建立了你所需要的东西。 而且你可以从python中使用R(需要一些设置)。

说了这么多关于R的好处,我们还是要发一篇关于如何在python中使用一个特定的数学工具的文章。因为虽然R很牛,但python确实有令人难以置信的灵活性,可以用来处理其他事务。

这篇文章中即将出现的大部分内容都会用Jupyter Notebooks来构建。

软件

我很惊讶,scikit-learn或scipy中没有明确的copula包的实现。

2D数据的Frank、Clayton和Gumbel copula

测试

第一个样本(x)是从一个β分布中产生的,(y)是从一个对数正态中产生的。β分布的支持度是有限的,而对数正态的右侧支持度是无穷大的。对数的一个有趣的属性。两个边际都被转换到了单位范围。

我们对样本x和y拟合了三个族(Frank, Clayton, Gumbel)的copulas,然后从拟合的copulas中提取了一些样本,并将采样输出与原始样本绘制在一起,以观察它们之间的比较。

独立(不相关)数据

我们将从β分布中抽取(x)的样本,从对数正态中抽取(y)的样本。这些样本是伪独立的(我们知道,如果你用计算机来抽取样本,就不会有真正的独立,但好在是合理的独立)。

相依性(相关)数据

自变量将是一个对数正态(y),变量(x)取决于(y),关系如下。初始值为1(独立)。然后,对于每一个点i, 如果 , 那么 , 其中c是从1的分数列表中统一选择的,否则, .


R语言实现 Copula 算法建模相依性案例分析报告

阅读文章



随时关注您喜欢的主题


拟合copula参数

没有内置的方法来计算archimedean copulas的参数,也没有椭圆elliptic copulas的方法。但是可以自己实现。选择将一些参数拟合到一个scipy分布上,然后在一些样本上使用该函数的CDF方法,或者用一个经验CDF工作。这两种方法在笔记本中都有实现。

因此,你必须自己写代码来为archimedean获取参数,将变量转化为统一的边际分布,并对copula进行实际操作。它是相当灵活的。

生成一些输入数据

在这个例子中,我们使用的是与之前相同的分布,探索copula 。如果你想把这段代码改编成你自己的真实数据,。

没有直接的构造函数用于高斯或t_Copulas_

可视化Copulas

可以为椭圆_Copulas_(_Elliptic_ _Copulas_)建立一个更通用的函数。

Frechét-Höffding边界可视化

根据定理,我们将copula画在一起,得到了Frechét-Höffding边界。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498