拓端tecdat|python中的copula:Frank、Clayton和Gumbel copula模型估計與可視化
原文鏈接:http://tecdat.cn/?p=23646?
原文出處:拓端數(shù)據(jù)部落公眾號
你可能會問,為什么是copulas?我們指的是數(shù)學(xué)上的概念。簡單地說,copulas是具有均勻邊際的聯(lián)合分布函數(shù)。最重要的是,它們允許你將依賴關(guān)系與邊際分開研究。有時你對邊際的信息比對數(shù)據(jù)集的聯(lián)合函數(shù)的信息更多,而copulas允許你建立關(guān)于依賴關(guān)系的 "假設(shè) "情景。copulas可以通過將一個聯(lián)合分布擬合到均勻分布的邊際上而得到,這個邊際是通過對你感興趣的變量的cdf進行量化轉(zhuǎn)換而得到的。?
這篇文章是關(guān)于Python的(有numpy、scipy、scikit-learn、StatsModels和其他你能在Anaconda找到的好東西),但是R對于統(tǒng)計學(xué)來說是非常棒的。我重復(fù)一遍,R對統(tǒng)計學(xué)來說是非常棒的。如果你是認(rèn)真從事統(tǒng)計工作的,不管你是否喜歡R,你至少應(yīng)該看看它,看看有哪些包可以幫助你。很有可能,有人已經(jīng)建立了你所需要的東西。?而且你可以從python中使用R(需要一些設(shè)置)。
說了這么多關(guān)于R的好處,我們還是要發(fā)一篇關(guān)于如何在python中使用一個特定的數(shù)學(xué)工具的文章。因為雖然R很牛,但python確實有令人難以置信的靈活性,可以用來處理其他事務(wù)。
這篇文章中即將出現(xiàn)的大部分內(nèi)容都會用Jupyter Notebooks來構(gòu)建。
軟件
我很驚訝,scikit-learn或scipy中沒有明確的copula包的實現(xiàn)。
2D數(shù)據(jù)的Frank、Clayton和Gumbel copula
測試
第一個樣本(x)是從一個β分布中產(chǎn)生的,(y)是從一個對數(shù)正態(tài)中產(chǎn)生的。β分布的支持度是有限的,而對數(shù)正態(tài)的右側(cè)支持度是無窮大的。對數(shù)的一個有趣的屬性。兩個邊際都被轉(zhuǎn)換到了單位范圍。
我們對樣本x和y擬合了三個族(Frank, Clayton, Gumbel)的copulas,然后從擬合的copulas中提取了一些樣本,并將采樣輸出與原始樣本繪制在一起,以觀察它們之間的比較。
#等同于ppf,但直接從數(shù)據(jù)中構(gòu)建
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 #對大多數(shù)分布來說是需要的
sc=0.5
y=lognorm.rvs(sc,loc=loc, size=sz)
獨立(不相關(guān))數(shù)據(jù)
我們將從β分布中抽?。▁)的樣本,從對數(shù)正態(tài)中抽?。▂)的樣本。這些樣本是偽獨立的(我們知道,如果你用計算機來抽取樣本,就不會有真正的獨立,但好在是合理的獨立)。
#不相關(guān)的數(shù)據(jù):一個β值(x)和一個對數(shù)正態(tài)(y)。
a= 0.45#2. #alpha
b=0.25#5. #beta
#畫出不相關(guān)的x和y
plt.plot(t, beta.pdf(t,a,b), lw=5, alpha=0.6, label='x:beta')
#繪制由不相關(guān)的x和y建立的共線性圖
title='來自不相關(guān)數(shù)據(jù)的共線性 x: beta, alpha {} beta {}, y: lognormal, mu {}, sigma dPlot(title,x,y,pseudoobs)


?

?

相依性(相關(guān))數(shù)據(jù)
自變量將是一個對數(shù)正態(tài)(y),變量(x)取決于(y),關(guān)系如下。初始值為1(獨立)。然后,對于每一個點i, 如果?

, 那么?

, 其中c是從1的分?jǐn)?shù)列表中統(tǒng)一選擇的,否則,?

.
#相關(guān)數(shù)據(jù):一個對數(shù)正態(tài)(y)。
#畫出相關(guān)數(shù)據(jù)
np.linspace(0, lognorm.ppf(0.99, sc), sz)
plt.plot(t, gkxx.pdf(t), lw=5, alpha=0.6,

?

?

?

擬合copula參數(shù)
沒有內(nèi)置的方法來計算archimedean copulas的參數(shù),也沒有橢圓elliptic copulas的方法。但是可以自己實現(xiàn)。選擇將一些參數(shù)擬合到一個scipy分布上,然后在一些樣本上使用該函數(shù)的CDF方法,或者用一個經(jīng)驗CDF工作。這兩種方法在筆記本中都有實現(xiàn)。
因此,你必須自己寫代碼來為archimedean獲取參數(shù),將變量轉(zhuǎn)化為統(tǒng)一的邊際分布,并對copula進行實際操作。它是相當(dāng)靈活的。
#用于擬合copula參數(shù)的方法
# === Frank參數(shù)擬合
"""
對這個函數(shù)的優(yōu)化將給出參數(shù)
"""
#一階debye函數(shù)的積分值 ? ?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 參數(shù)方法
def Clayton(kTau):
try:
return 2.*kTau/(1.-kTau)
#Gumbel參數(shù)方法
def Gumbel(kTau):
try:
return 1./(1.-kTau)
#================
#copula生成
#得到協(xié)方差矩陣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,
生成一些輸入數(shù)據(jù)
在這個例子中,我們使用的是與之前相同的分布,探索copula?。如果你想把這段代碼改編成你自己的真實數(shù)據(jù),。
t = np.linspace(0, lognorm.ppf(0.99, sc), sz)
#從一些df中抽取一些樣本
X=beta.rvs(a,b,size=sz)
Y=lognorm.rvs(sc,size=sz)
#通過對樣本中的數(shù)值應(yīng)用CDF來實現(xiàn)邊緣分布
U=beta.cdf(X,a,b)
V=lognorm.cdf(Y,sc)
#畫出它們直觀地檢查獨立性
plt.scatter(U,V,marker='o',alpha=0.7)
plt.show()


可視化Copulas
沒有直接的構(gòu)造函數(shù)用于高斯或tCopulas,可以為橢圓Copulas(Elliptic?Copulas)建立一個更通用的函數(shù)。
Samples=700
#選擇用于抽樣的copula指數(shù)
np.random.choice(range(len(U)),Samples)
Plot(U,V)


<IPython.core.display.Javascript object>



Frechét-H?ffding邊界可視化
根據(jù)定理,我們將copula畫在一起,得到了Frechét-H?ffding邊界。
#建立邊界為copula的區(qū)域
plot_trisurf(U[樣本],V[樣本],copula['min'][樣本],
c='red') #上限
plot_trisurf(U[樣本],V[樣本],copula['max'][樣本],
c='green') #下限


最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預(yù)測
2.python中利用長短期記憶模型lstm進行時間序列預(yù)測分析
3.使用r語言進行時間序列(arima,指數(shù)平滑)分析
4.r語言多元copula-garch-模型時間序列預(yù)測
5.r語言copulas和金融時間序列案例
6.使用r語言隨機波動模型sv處理時間序列中的隨機波動
7.r語言時間序列tar閾值自回歸模型
8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類
9.python3用arima模型進行時間序列預(yù)測