【视频】Copula算法原理和R语言股市收益率相依性可视化分析

简介: 【视频】Copula算法原理和R语言股市收益率相依性可视化分析

原文链接: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的工作方式。

set.seed(100)
m < -  3
n < -  2000
 
z < -  mvrnorm(n,mu = rep(0,m),Sigma = sigma,empirical = T)

我们使用cor()和散点图矩阵检查样本相关性。

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

pairs.panels(U)

这是包含新随机变量的散点图矩阵u


点击标题查阅往期内容


R语言多元Copula GARCH 模型时间序列预测


01

02

03

04


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

现在,作为最后一步,我们只需要选择边缘并应用它。我选择了边缘为Gamma,Beta和Student,并使用下面指定的参数。

x1 < -  qgamma(u \[,1\],shape = 2,scale = 1

x2 < -  qbeta(u \[,2\],2,2

x3 < -  qt(u \[,3\],df = 5

下面是我们模拟数据的3D图。


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()函数生成随机样本。

colnames(Z2)< -  c(“x1”,“x2”,“x3”)

pairs.panels(Z2

模拟数据当然非常接近之前的数据,显示在下面的散点图矩阵中:

简单的应用示例


现在为现实世界的例子。我们将拟合两个股票 ,并尝试使用copula模拟 。

让我们在R中加载 :

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选择 :

pobs(as.matrix(cbind(cree,yahoo)))\[,1\]
  selectedCopula
 
$ PAR
\[1\] 0.4356302
$ PAR2
\[1\] 3.844534

拟合算法确实选择了t-copula并为我们估计了参数。

让我们尝试拟合建议的模型,并检查参数拟合。

t.cop  
set.seed(500)
m < -  pobs(as.matrix(cbind(cree,yahoo)))
 
COEF(FIT)
  rho.1 df 
0.43563 3.84453

我们来看看我们刚估计的copula的密度

rho < -  coef(fit)\[1\]

df < -  coef(fit)\[2\]

现在我们只需要建立Copula并从中抽取3965个随机样本。

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=1df=8:

显然,该参数df对于确定分布的形状非常重要。随着df增加,t-copula倾向于正态分布copula。

相关文章
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
3月前
|
数据可视化 数据挖掘 图形学
R语言基础可视化:使用ggplot2构建精美图形的探索
【8月更文挑战第29天】 `ggplot2`是R语言中一个非常强大的图形构建工具,它基于图形语法提供了一种灵活且直观的方式来创建各种统计图形。通过掌握`ggplot2`的基本用法和美化技巧,你可以轻松地将复杂的数据转化为直观易懂的图形,从而更好地理解和展示你的数据分析结果。希望本文能够为你探索`ggplot2`的世界提供一些帮助和启发。
|
3月前
|
数据可视化 数据挖掘 数据处理
R语言高级可视化技巧:使用Plotly与Shiny制作互动图表
【8月更文挑战第30天】通过使用`plotly`和`shiny`,我们可以轻松地创建高度互动的数据可视化图表。这不仅增强了图表的表现力,还提高了用户与数据的交互性,使得数据探索变得更加直观和高效。本文仅介绍了基本的使用方法,`plotly`和`shiny`还提供了更多高级功能和自定义选项,等待你去探索和发现。希望这篇文章能帮助你掌握使用`plotly`和`shiny`制作互动图表的技巧,并在你的数据分析和可视化工作中发挥更大的作用。
|
25天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
41 3
|
6月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
2月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
2月前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
3月前
|
数据可视化
R语言可视化设计原则:打造吸引力十足的数据可视化
【8月更文挑战第30天】R语言可视化设计是一个综合性的过程,需要综合运用多个设计原则来创作出吸引力十足的作品。通过明确目标、选择合适的图表类型、合理运用色彩与视觉层次、明确标注与引导视线以及引入互动性与动态效果等原则的应用,你可以显著提升你的数据可视化作品的吸引力和实用性。希望本文能为你提供一些有益的启示和帮助。
|
3月前
|
机器学习/深度学习 数据采集 数据可视化
R语言在数据科学中的应用实例:探索与预测分析
【8月更文挑战第31天】通过上述实例,我们展示了R语言在数据科学中的强大应用。从数据准备、探索、预处理到建模与预测,R语言提供了完整的解决方案和丰富的工具集。当然,数据科学远不止于此,随着技术的不断发展和业务需求的不断变化,我们需要不断学习和探索新的方法和工具,以更好地应对挑战,挖掘数据的潜在价值。 未来,随着大数据和人工智能技术的普及,R语言在数据科学领域的应用将更加广泛和深入。我们期待看到更多创新的应用实例,为各行各业的发展注入新的动力。
|
3月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。