python中Copula在多元联合分布建模可视化2实例合集|附数据代码

简介: python中Copula在多元联合分布建模可视化2实例合集|附数据代码

Copula是一个用于描述多个随机变量之间相关性的函数,它将这些变量的联合分布与其边缘分布连接起来。Copula函数由Sklar定理所定义,该定理指出,对于N个随机变量的联合分布,可以将其分解为这N个变量各自的边缘分布和一个Copula函数点击文末“阅读原文”获取完整代码数据


相关视频

image.png


这样,变量的随机性和耦合性就被分离开来,其中随机变量各自的随机性由边缘分布描述,而随机变量之间的耦合特性则由Copula函数描述。

本文旨在通过一系列实例,展示如何在Python中使用Copula进行多元联合分布建模和可视化。我们将从简单的二元Copula模型开始,逐步过渡到更复杂的多元模型,并介绍如何使用不同的Copula类型和参数来适应不同的数据特性。

1.Copula在多元联合分布建模

Copula函数在金融风险管理、精算学和统计推断等领域有广泛应用。它几乎包含了随机变量所有的相依信息,因此对于分析变量之间的相关关系非常有用,尤其是在传统的线性相关系数可能无法准确度量相关关系的情况下。

具体来说,Copula函数是一个从[0,1]^n到[0,1]的映射,用于链接n个随机变量的边缘累积分布函数。它用于描述多元随机变量之间的依赖关系,这些关系可以是正相关、负相关或无相关。


在建模系统时,经常会遇到涉及多个参数的情况。这些参数中的每一个都可以用给定的概率密度函数(PDF)来描述。如果想要生成一组新的参数值,就需要从这些分布(也称为边缘分布)中进行抽样。主要有两种情况: (i)  PDF是独立的; (ii)  存在依赖关系。一种建模依赖关系的方法是使用copula




Kaizong Ye

拓端分析师


从copula中抽样¶

让我们用一个双变量示例来说明,并假设首先我们有一个先验知识,并知道如何对两个变量之间的依赖关系进行建模。

在这种情况下,我们使用Gumbel copula并固定其超参数theta=2。我们可以可视化其二维PDF。

_ = copulot_pdf()  # 可视化

ec490eb74b7df554429fcfa4dbfafbdd.png

并且我们可以从该PDF中进行抽样。

rng = np.random.default_rng(seed)"

3be0982e66957299540b39bc80d8cc05.png

现在让我们再回到这两个变量上来。在这种情况下,我们考虑它们是服从伽马分布和正态分布的。如果它们彼此独立,我们可以单独从每个PDF中进行抽样。这里我们使用一个方便的类来执行相同的操作。


可重复性¶

从copula生成可重复的随机值需要显式地设置seed参数。seed接受一个已初始化的NumPy GeneratorRandomState,或者任何np.random.default_rng可以接受的参数,例如一个整数或一串整数。本例中使用的是一个整数。

直接暴露在np.random分布中的单例RandomState不会被使用,设置np.random.seed对生成的值没有影响。

_ = h.set_labels("X1", "X2", fontsize=16)

94f7c009a8c3700547b4ee437d88f269.png 现在,我们已经使用copula表达了变量之间的依赖关系,我们可以使用同一个方便的类从这个copula中抽样得到一组新的观测值。

# 使用一个已初始化的Generator对象  
  h = snjoind="scatter")

2f42c7ad220a782338a76e41687f9316.png

这里有两点需要注意。 (i)  就像独立情况一样,边缘分布正确地显示了伽马分布和正态分布; (ii)  两个变量之间的依赖关系可见。

估计copula参数¶

现在,假设我们已经有了实验数据,并且知道可以使用Gumbel copula来表达依赖关系。但是我们不知道copula的超参数值是多少。在这种情况下,我们可以估计这个值。

我们将使用刚才生成的样本,因为我们已经知道应该得到的超参数值:theta=2

fit_carm(sample)
print(theta)

7f34c1c696f9ec4bcb7003f9c2371509.png

我们可以看到,估计的超参数值接近之前设定的值。

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

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

软件

scikit-learn或scipy中没有明确的copula包的实现。

2D数据的Frank、Clayton和Gumbel copula

测试

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

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

#等同于ppf,但直接从数据中构建 
    sortedvar=np.sort(var)    
    #绘制
    for index,family in enumerate(['Frank', 'clayton', 'gumbel']):
            #获得伪观测值
            u,v = copula_f.generate_uv(howmany)
        #画出伪观测值
        axs[index][0].scatter(u,v,marker='o',alpha=0.7)
      
    plt.show()
#总样本与伪观测值的对比
sz=300
loc=0.0 #对大多数分布来说是需要的
sc=0.5
y=lognorm.rvs(sc,loc=loc, size=sz)

独立(不相关)数据

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

#不相关的数据:一个β值(x)和一个对数正态(y)。
a= 0.45#2. #alpha
b=0.25#5. #beta
#画出不相关的x和y 
plt.plot(t, beta.pdf(t,a,b), lw=5, alpha=0.6, label='x:beta')
#绘制由不相关的x和y建立的共线性图
title='来自不相关数据的共线性 x: beta, alpha {} beta {}, y: lognormal, mu {}, sigma dPlot(title,x,y,pseudoobs)

3c5ba1d9d381c2fe6977caa7aee45055.png

c227596f9c3a34735f54e967e2c23c4d.jpg

dcf4cad260ee8b33756077d3e259ec37.jpg

583ed2ec3dd4b032af7ce5efb63dc9b9.jpg

相依性(相关)数据

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

#相关数据:一个对数正态(y)。
#画出相关数据
 np.linspace(0, lognorm.ppf(0.99, sc), sz)
plt.plot(t, gkxx.pdf(t), lw=5, alpha=0.6,


2e0fa5f5f97ed4ec6b4239e7f5ff160e.png


c19b4983e4a31b1932bbe7dd4534dd5c.jpg

f4bf0274c0b74f3e19b253ad64526437.jpg

cfb02cb5b151482d9831b0d5f3ed6432.jpg

拟合copula参数

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

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

#用于拟合copula参数的方法 
# === Frank参数拟合
    """
    对这个函数的优化将给出参数 
    """
   #一阶debye函数的积分值    int_debye = lambda t: t/(npexp(t)-1.) 
    debye = lambda alphaquad(int_debye , 
                               alpha
                              )[0]/alpha
    diff = (1.-kTau)/4.0-(debye(-alpha)-1.)/alpha
#================
#clayton 参数方法
def Clayton(kTau):
    try:
        return 2.*kTau/(1.-kTau)
 
#Gumbel参数方法
def Gumbel(kTau):
    try:
        return 1./(1.-kTau)
#================
#copula生成
    #得到协方差矩阵P
    #x1=norm.ppf(x,loc=0,scale=1)
    #y1=norm.ppf(y,loc=0,scale=1)
    #return norm.cdf((x1,y1),loc=0,scale=P)
#================
#copula绘图
    fig = pylab.figure()
    ax = Axes3D(fig)
        ax.text2D(0.05, 0.95, label, transform=ax.transAxes)
        ax.set_xlabel('X: {}'.format(xlabel))
        ax.set_ylabel('Y: {}'.format(ylabel))
    #sample是一个来自U,V的索引列表。这样,我们就不会绘制整个copula曲线。
    if plot:
  
        print "绘制copula {}的样本".format(copulaName)
        returnable[copulaName]=copulapoints
        if plot:
            zeFigure=plot3d(U[样本],V[样本],copulapoints[样本], label=copulaName,

生成一些输入数据

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

t = np.linspace(0, lognorm.ppf(0.99, sc), sz)
#从一些df中抽取一些样本
X=beta.rvs(a,b,size=sz)
Y=lognorm.rvs(sc,size=sz)
#通过对样本中的数值应用CDF来实现边缘分布
U=beta.cdf(X,a,b)
V=lognorm.cdf(Y,sc)
#画出它们直观地检查独立性
plt.scatter(U,V,marker='o',alpha=0.7)
plt.show()


eda269c756849f016b60212d3c16d2ed.png

0817bf071c3528ddc811d66a2117f6c7.png


可视化Copulas

没有直接的构造函数用于高斯或tCopulas,可以为椭圆Copulas(Elliptic Copulas)建立一个更通用的函数。

Samples=700
#选择用于抽样的copula指数
np.random.choice(range(len(U)),Samples)
Plot(U,V)

f80a9e47162c6cea2d2bfd70101879f1.png

acc1b63624c8612119905a332c177ec6.png


<IPython.core.display.Javascript object>

d77aa929f89d5ed2ddfcb85ef83810c6.png

4ed92bda9d115c8e466a2c4bdfd91129.png

1a5dc3b0ca6c4cc77b549d5f89b063f0.png

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

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

#建立边界为copula的区域
plot_trisurf(U[样本],V[样本],copula['min'][样本],
          c='red') #上限
plot_trisurf(U[样本],V[样本],copula['max'][样本],
           c='green') #下限


1fe56aa57ff85cd56e92f00e3a1d1b4e.png

相关文章
|
26天前
|
数据采集 数据可视化 数据挖掘
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
本文探讨了金融资产波动率建模中的三种主流方法:GARCH、GJR-GARCH和HAR模型,基于SPY的实际交易数据进行实证分析。GARCH模型捕捉波动率聚类特征,GJR-GARCH引入杠杆效应,HAR整合多时间尺度波动率信息。通过Python实现模型估计与性能比较,展示了各模型在风险管理、衍生品定价等领域的应用优势。
230 66
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
|
4天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
1月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
108 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
1月前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
1月前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
41 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
2月前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
2月前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
112 15
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
172 5
|
2月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
2月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!

热门文章

最新文章