阅读全文:http://tecdat.cn/?p=6193
copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。在本视频中,我们通过可视化的方式直观地介绍了Copula函数,并通过R软件应用于金融时间序列数据来理解它**(** 点击文末"阅读原文"获取完整代码数据******** )。
视频:Copula算法原理和R语言股市收益率相依性可视化分析
为什么要引入Copula函数?
当边缘分布(即每个随机变量的分布)不同的随机变量,互相之间并不独立的时候,此时对于联合分布的建模会变得十分困难。

让我们从一个示例问题案例开始。假设我们测量两个非正态分布且相关的变量。例如,我们查看各种河流,我们查看该河流在特定时间段内的最高水位。此外,我们还计算了每条河流造成洪水的月份。对于河流最高水位的概率分布,我们可以参考极值理论,它告诉我们最大值是Gumbel分布的。洪水发生的次数将根据Beta分布进行建模,该分布只是告诉我们发生洪水的概率是洪水与非洪水发生次数的函数。
假设洪水的最高水位和数量是相关的,这是非常合理的。然而,这里我们遇到了一个问题:我们应该如何对概率分布进行建模?上面我们只指定了各个变量的分布,而与另一个变量无关(即边缘分布)。实际上,我们正在处理这两者的联合分布。
此时,在已知多个已知 边缘分布的随机变量下,Copula函数则是一个非常好的工具来对其相关性进行建模。

copula 的主要吸引力在于,通过使用他们,您可以分别对相关结构和边缘分布(即每个随机变量的分布)进行建模。

因为对于某些边缘分布组合,没有内置函数来生成所需的多元分布。例如,在 R 中,很容易从多元正态分布中生成随机样本,但是对于边缘分别为 Beta、Gamma 和 Student 的分布来说,这样做并不容易。
copula 将边缘分布与研究它们的"关系"分开,因此您无需担心考虑可能的单变量分布类型的所有可能组合,从而大大简化了所需的代码量。
Copula可以同时处理多个变量,例如您可以在一个群组中处理多只股票,而不仅仅是一对,以创建最终交易组合,以在更高的维度上发现错误定价。
什么是copula
Copula 在拉丁语中的意思是"链接",copula 是将多元分布函数与其边缘分布函数耦合的函数,通常称为边缘或简称为边缘。Copulas 是用于建模和模拟相关随机变量的绝佳工具。
总的来说,copula 是一种统计方法,用于理解多元分布的联合概率。
Copula是模拟多元相关数据的流行方法,是一个表示多元均匀分布的概率模型,它检查许多变量之间的关联或依赖关系。
今天,copulas 被用于高级财务分析,以更好地理解涉及厚尾和偏度的结果。用于帮助识别市场风险、信用风险和操作风险。它依赖于两种或多种资产收益的相互依赖关系。相关性最适合 正态分布,而金融市场中的分布本质上通常是非正态分布。因此,copula 已应用于诸如期权定价和投资组合风险价值等金融领域,以处理偏斜或不对称分布。

如何使用copula 分析数据
回想一下,您可以使用累积分布函数将任何分布转换为均匀分布。同样,您可以使用逆累积分布函数将均匀分布转换为任何分布。例如要模拟来自高斯 copula 的相关多元数据,请执行以下三个步骤:
1.从相关矩阵模拟相关的多元正态数据。边缘分布都是标准正态分布。
2.使用标准正态累积分布函数将正态边缘转换为均匀分布。
3.使用逆累积分布函数将均匀边缘分布转换为 您想要的任何分布。
第二步和第三步中的转换是在数据矩阵的各个列上执行的。变换是单调的,这意味着它们不会改变列之间的等级相关性。因此,最终数据与第一步中的多元正态数据具有相同的秩相关性。
首先我们可以生成均匀分布的随机变量
下面,我们想要转化这些样本使他们变成正态分布。那么,我们只需要以 x为累积分布函数值,对正态分布求逆即可,

如果我们将 x 和转化后的x 的分布画在一张图中,就可以直观的看出逆累积分布函数的样子。

同理,我们也可以基于 beta 分布或者gumbel 分布来得到类似的图像,这种概率积分变换的本质是相同的。
而我们如果想要从一个任意的分布到均匀分布,那么我们只需要进行一次累积分布函数就可以了。这里我将 转换后的x 再做一次转化

简单的高斯Copula例子
我们构建一个简单的例子,来看如何利用概率积分变换来认识高斯copula。首先从二元正态分布中生成样本:

通过给 x1和x2的累积分布函数进行采样,我们可以将其转化成均匀分布。

现在,我们在上面的基础上(构建的高斯Copula函数),把边缘分布换成Beta分布和Gumbel分布:

那如果没有二者的耦合关系,这个图是怎样的呢?

两张图对比一下,还是很容易看出区别的吧!这就是我们使用copula函数内在的方法了,其核心还是通过均匀分布。
Copula的数学定义
它是一个多元分布C,边缘分布为均匀分布。它实际上只是一个具有均匀分布边缘属性的函数。它确实只有在与另一个变换结合以获得我们想要的边缘分布时才有用。

我们也可以更好地理解高斯 copula 的数学描述:
对于给定的R, 具有参数矩阵的高斯copula可以写成 ,其中Φ− 1是标准正态的逆累积分布函数,并且ΦR是平均向量为零且协方差矩阵等于相关矩阵的多元正态分布的联合累积分布函数R.
请注意,在上面的例子中,我们采用相反的方式从该分布创建样本。此处表示的高斯 copula 采用 均匀分布输入,将它们转换为高斯,然后应用相关性并将它们转换回均匀分布。
Copula函数主要应用在哪里呢?
该工具最初是用在金融衍生品领域,该函数建模作为衍生品风险度量的工作进行使用。在2008年金融危机中,这个工具被人广泛的提及,认为当时采用的高斯copula没有能够完整度量衍生品连带之间的风险,从而导致一系列的违约,进而引发次贷危机、经济危机。
也有人事后写了文章来介绍这个工具和现实社会经济的关系,包括很有名的电影《大空头》,也有这段的描写。
说回工具本身,除了金融领域,现在很多研究概率分布的领域都在使用copula,例如电力系统领域研究风电、光伏等间歇性能源,也在使用这种方法进行建模。
接下来我们在R软件中对金融时间序列进行copula建模。
copulas如何工作
首先,让我们了解copula的工作方式。
go
set.seed(100)
m < - 3
n < - 2000
z < - mvrnorm(n,mu = rep(0,m),Sigma = sigma,empirical = T)
我们使用cor()
和散点图矩阵检查样本相关性。
go
pairs.panels(Z)
\[,1\] \[,2\] \[,3\]
\[1,\] 1.0000000 0.3812244 0.1937548
\[2,\] 0.3812244 1.0000000 -0.7890814
\[3,\] 0.1937548 -0.7890814 1.0000000

go
pairs.panels(U)
这是包含新随机变量的散点图矩阵u
。
点击标题查阅往期内容


左右滑动查看更多

01

02

03

04


我们可以绘制矢量的3D图表示u
。

现在,作为最后一步,我们只需要选择边缘并应用它。我选择了边缘为Gamma,Beta和Student,并使用下面指定的参数。
go
x1 < - qgamma(u \[,1\],shape = 2,scale = 1)
x2 < - qbeta(u \[,2\],2,2)
x3 < - qt(u \[,3\],df = 5)
下面是我们模拟数据的3D图。

go
df < - cbind(x1,x2,x3)
pairs.panels(DF)
x1 x2 x3
x1 1.0000000 0.3812244 0.1937548
x2 0.3812244 1.0000000 -0.7890814
x3 0.1937548 -0.7890814 1.0000000
这是随机变量的散点图矩阵:

使用copula
让我们使用copula复制上面的过程。
现在我们已经通过copula(普通copula)指定了相依结构并设置了边缘,mvdc()
函数生成了所需的分布。然后我们可以使用rmvdc()
函数生成随机样本。
go
colnames(Z2)< - c("x1","x2","x3")
pairs.panels(Z2)
模拟数据当然非常接近之前的数据,显示在下面的散点图矩阵中:

简单的应用示例
现在为现实世界的例子。我们将拟合两个股票 ,并尝试使用copula模拟 。
让我们在R中加载 :
go
cree < - read.csv('cree_r.csv',header = F)$ V2
yahoo < - read.csv('yahoo_r.csv',header = F)$ V2
在直接进入copula拟合过程之前,让我们检查两个股票收益之间的相关性并绘制回归线:
我们可以看到 正相关 :

在上面的第一个例子中,我选择了一个正态的copula模型,但是,当将这些模型应用于实际数据时,应该仔细考虑哪些更适合数据。例如,许多copula更适合建模非对称相关,其他强调尾部相关性等等。我对股票收益率的猜测是,t-copula应该没问题,但是猜测肯定是不够的。本质上, 允许我们通过函数使用BIC和AIC执行copula选择 :
go
pobs(as.matrix(cbind(cree,yahoo)))\[,1\]
selectedCopula
$ PAR
\[1\] 0.4356302
$ PAR2
\[1\] 3.844534
拟合算法确实选择了t-copula并为我们估计了参数。
让我们尝试拟合建议的模型,并检查参数拟合。
go
t.cop
set.seed(500)
m < - pobs(as.matrix(cbind(cree,yahoo)))
COEF(FIT)
rho.1 df
0.43563 3.84453
我们来看看我们刚估计的copula的密度
go
rho < - coef(fit)\[1\]
df < - coef(fit)\[2\]

现在我们只需要建立Copula并从中抽取3965个随机样本。
go
rCopula(3965,tCopula( = 2, ,df = df))
\[,1\] \[,2\]
\[1,\] 1.0000000 0.3972454
\[2,\] 0.3972454 1.0000000
这是包含的样本的图:

t-copula通常适用于在极值(分布的尾部)中存在高度相关性的现象。
现在我们面临困难:对边缘进行建模。为简单起见,我们将假设正态分布 。因此,我们估计边缘的参数。
直方图显示如下:


现在我们在函数中应用copula,从生成的多变量分布中获取模拟观测值。最后,我们将模拟结果与原始数据进行比较。
这是在假设正态分布边缘和相依结构的t-copula的情况下数据的最终散点图:

正如您所看到的,t-copula导致结果接近实际观察结果 。
让我们尝试df=1
和df=8:
显然,该参数df
对于确定分布的形状非常重要。随着df
增加,t-copula倾向于正态分布copula。


本文中分析的数据、代码**** 分享到会员群,扫描下面二维码即可加群!


本文摘选**《** R语言实现 Copula 算法建模相依性案例分析报告 》 ,点击"阅读原文 "获取全文完整资料。


点击标题查阅往期内容
Copula估计边缘分布模拟收益率计算投资组合风险价值VaR与期望损失ES
MATLAB用COPULA模型进行蒙特卡洛(MONTE CARLO)模拟和拟合股票收益数据分析
python中的copula:Frank、Clayton和Gumbel copula模型估计与可视化
R语言中的copula GARCH模型拟合时间序列并模拟分析
R语言Copula函数股市相关性建模:模拟Random Walk(随机游走)
R语言ARMA-GARCH-COPULA模型和金融时间序列案例
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测
R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
matlab实现MCMC的马尔可夫转换ARMA - GARCH模型估计
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测
使用R语言对S&P500股票指数进行ARIMA + GARCH交易策略
R语言用多元ARMA,GARCH ,EWMA, ETS,随机波动率SV模型对金融时间序列数据建模
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析
R语言中的时间序列分析模型:ARIMA-ARCH / GARCH模型分析股票价格
R语言ARMA-GARCH-COPULA模型和金融时间序列案例


