1. 程式人生 > 其它 >【視訊】Copula演算法原理和R語言股市收益率相依性視覺化分析|附程式碼資料

【視訊】Copula演算法原理和R語言股市收益率相依性視覺化分析|附程式碼資料

閱讀全文:http://tecdat.cn/?p=6193

最近我們被客戶要求撰寫關於Copula的研究報告,包括一些圖形和統計輸出。

copula是將多變數分佈函式與其邊緣分佈函式耦合的函式,通常稱為邊緣。在本視訊中,我們通過視覺化的方式直觀地介紹了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。


本文摘選 《 R語言實現 Copula 演算法建模相依性案例分析報告 》 ,點選“閱讀原文”獲取全文完整資料。


點選標題查閱往期內容

Copula估計邊緣分佈模擬收益率計算投資組合風險價值VaR與期望損失ES
MATLAB用COPULA模型進行蒙特卡洛(MONTE CARLO)模擬和擬合股票收益資料分析
python中的copula:Frank、Clayton和Gumbel copula模型估計與視覺化R語言中的copula GARCH模型擬合時間序列並模擬分析
matlab使用Copula模擬優化市場風險資料VaR分析
R語言多元Copula GARCH 模型時間序列預測
R語言Copula函式股市相關性建模:模擬Random Walk(隨機遊走)
R語言實現 Copula 演算法建模依賴性案例分析報告
R語言ARMA-GARCH-COPULA模型和金融時間序列案例
R語言基於copula的貝葉斯分層混合模型的診斷準確性研究
R語言COPULA和金融時間序列案例
matlab使用Copula模擬優化市場風險資料VaR分析
matlab使用Copula模擬優化市場風險
R語言多元CopulaGARCH模型時間序列預測
R語言Copula的貝葉斯非引數MCMC估計
R語言COPULAS和金融時間序列R語言乘法GARCH模型對高頻交易資料進行波動性預測
R語言GARCH-DCC模型和DCC(MVT)建模估計
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進行股價預測
R語言時間序列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語言多元Copula GARCH 模型時間序列預測
R語言使用多元AR-GARCH模型衡量市場風險
R語言中的時間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價格
R語言用Garch模型和迴歸模型對股票價格分析
GARCH(1,1),MA以及歷史模擬法的VaR比較
matlab估計arma garch 條件均值和方差模型
R語言ARMA-GARCH-COPULA模型和金融時間序列案例