拓端數據tecdat|R語言Copula函數股市相關性建模:模擬Random Walk(隨機游走)


原文鏈接:http://tecdat.cn/?p=19688 

 

在引入copula時,大家普遍認為copula很有趣,因為它們允許分別對邊緣分布和相依結構進行建模。

copula建模邊緣和相依關系

給定一些邊緣分布函數和一個copula,那么我們可以生成一個多元分布函數,其中的邊緣是前面指定的。

考慮一個二元對數正態分布

  1.  
     
  2.  
    > library(mnormt)
  3.  
    > set.seed(1)
  4.  
    > Z=exp(rmnorm(25,MU,SIGMA))

我們可以從邊緣分布開始。

  1.  
     
  2.  
    meanlog sdlog
  3.  
    1 .168 0.930
  4.  
    (0 .186 ) (0.131 )
  5.  
     
  6.  
    meanlog sdlog
  7.  
    2 .218 1.168
  8.  
    (0 .233 ) (0.165 )

基於這些邊緣分布,並考慮從該偽隨機樣本獲得的copula參數的最大似然估計值,從數值上講,我們得到

  1.  
     
  2.  
    > library(copula)
  3.  
     
  4.  
    > Copula() estimation based on 'maximum likelihood'
  5.  
    and a sample of size 25.
  6.  
    Estimate Std. Error z value Pr(>|z|)
  7.  
    rho.1 0.86530 0.03799 22.77

但是,由於相依關系是邊緣分布的函數,因此我們沒有對相依關系進行單獨處理。如果考慮全局優化問題,則結果會有所不同。可以得出密度

  1.  
     
  2.  
    > optim(par=c(0,0,1,1,0),fn=LogLik)$par
  3.  
    [ 1] 1.165 2.215 0.923 1.161 0.864

差別不大,但估計量並不相同。從統計的角度來看,我們幾乎無法分別處理邊緣和相依結構。我們應該記住的另一點是,邊際分布可能會錯誤指定。例如,如果我們假設指數分布,

  1.  
     
  2.  
    fitdistr( Z[,1],"exponential")
  3.  
    rate
  4.  
    0.222
  5.  
    ( 0.044 )
  6.  
    fitdistr( Z[,2],"exponential"
  7.  
    rate
  8.  
    0.065
  9.  
    ( 0.013 )

高斯copula的參數估計

  1.  
     
  2.  
    Copula() estimation based on 'maximum likelihood'
  3.  
    and a sample of size 25.
  4.  
    Estimate Std. Error z value Pr(>|z|)
  5.  
    rho.1 0.87421 0.03617 24.17 <2e-16 ***
  6.  
    ---
  7.  
    Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  8.  
    The maximized loglikelihood is 15.4
  9.  
    Optimization converged
 

由於我們錯誤地指定了邊緣分布,因此我們無法獲得統一的邊緣。如果我們使用上述代碼生成大小為500的樣本,

  1.  
     
  2.  
    barplot(counts, axes= FALSE,col="light blue"

 

如果邊緣分布被很好地設定時,我們可以清楚地看到相依結構依賴於邊緣分布,

 

copula模擬股市中相關隨機游走

接下來我們用copula函數模擬股市中的相關隨機游走

 

  1.  
    #*****************************************************************
  2.  
    # 載入歷史數據
  3.  
    #******************************************************************
  4.  
     
  5.  
    load.packages( 'quantmod')
  6.  
     
  7.  
    data $YHOO = getSymbol.intraday.google('YHOO', 'NASDAQ', 60, '15d')
  8.  
    data $FB = getSymbol.intraday.google('FB', 'NASDAQ', 60, '15d')
  9.  
    bt.prep(data, align= 'remove.na')
  10.  
     
  11.  
     
  12.  
    #*****************************************************************
  13.  
    # 生成模擬
  14.  
    #******************************************************************
  15.  
     
  16.  
    rets = diff( log(prices))
  17.  
     
  18.  
    # 繪制價格
  19.  
    matplot(exp(apply(rets,2,cumsum)), type='l')

 

  1.  
    # 可視化分布的輔助函數
  2.  
     
  3.  
    # 檢查Copula擬合的Helper函數
  4.  
    # 模擬圖與實際圖
  5.  
     
  6.  
    plot(rets[,1], rets[,2], xlab=labs[1], ylab=labs[2], col='blue', las=1)
  7.  
    points(fit.sim[,1], fit.sim[,2], col='red')
  8.  
     
  9.  
    # 比較模擬和實際的統計數據
  10.  
    temp = matrix(0,nr=5,nc=2)
  11.  
     
  12.  
    print(round(100*temp,2))
  13.  
     
  14.  
    # 檢查收益率是否來自相同的分布
  15.  
    for (i in 1:2) {
  16.  
    print(labs[i])
  17.  
    print(ks.test(rets[,i], fit.sim[i]))
  18.  
     
  19.  
     
  20.  
    # 繪制模擬價格路徑
  21.  
    matplot(exp(apply(fit.sim,2,cumsum)), type='l', main='Simulated Price path')
  22.  
     
  23.  
     
  24.  
    # 擬合Copula
  25.  
    load.packages('copula')

 

  1.  
     
  2.  
    # 通過組合擬合邊緣和擬合copula創建自定義分布
  3.  
    margins=c( "norm","norm")
  4.  
    apply(rets, 2,function(x) list(mean=mean(x), sd=sd(x)))
  5.  
     
  6.  
     
  7.  
    # 從擬合分布模擬
  8.  
    rMvdc(4800, fit)
  9.  
     

  1.  
    Actual Simulated
  2.  
    Correlation 57.13 57.38
  3.  
    Mean FB -0.31 -0.47
  4.  
    Mean YHOO -0.40 -0.17
  5.  
    StDev FB 1.24 1.25
  6.  
    StDev YHOO 1.23 1.23

FB

  1.  
    Two-sample Kolmogorov-Smirnov test
  2.  
     
  3.  
    data: rets[, i] and fit.sim[i]
  4.  
    D = 0.9404, p-value = 0.3395
  5.  
    alternative hypothesis: two-sided
  6.  
     

HO

  1.  
    Two-sample Kolmogorov-Smirnov test
  2.  
     
  3.  
    data: rets[, i] and fit.sim[i]
  4.  
    D = 0.8792, p-value = 0.4222
  5.  
    alternative hypothesis: two-sided
  6.  
     

 

 visualize.rets(fit.sim)

 

  1.  
    # qnorm(runif(10^8)) 和 rnorm(10^8) 是等價的
  2.  
    uniform.sim = rCopula(4800, gumbelCopula(gumbel@estimate, dim=n))
  3.  
     

  1.  
    Actual Simulated
  2.  
    Correlation 57.13 57.14
  3.  
    Mean FB -0.31 -0.22
  4.  
    Mean YHOO -0.40 -0.56
  5.  
    StDev FB 1.24 1.24
  6.  
    StDev YHOO 1.23 1.21

FB

  1.  
    Two-sample Kolmogorov-Smirnov test
  2.  
     
  3.  
    data: rets[, i] and fit.sim[i]
  4.  
    D = 0.7791, p-value = 0.5787
  5.  
    alternative hypothesis: two-sided
  6.  
     

HO

  1.  
    Two-sample Kolmogorov-Smirnov test
  2.  
     
  3.  
    data: rets[, i] and fit.sim[i]
  4.  
    D = 0.795, p-value = 0.5525
  5.  
    alternative hypothesis: two-sided
  6.  
     

 

 

	vis(rets)

 

標准偏差相對於均值而言非常大,接近於零;因此,在某些情況下,我們很有可能獲得不穩定的結果。


 

最受歡迎的見解

1.R語言基於ARMA-GARCH-VaR模型擬合和預測實證研究

2.r語言實現copula算法建模依賴性案例

3.R語言COPULAS和金融時間序列數據VaR分析

4.R語言多元COPULA GARCH 模型時間序列預測

5.GARCH(1,1),MA以及歷史模擬法的VaR比較

6.matlab使用Copula仿真優化市場風險數據分析

7.R語言實現向量自動回歸VAR模型

8.R語言隨機搜索變量選擇SSVS估計貝葉斯向量自回歸(BVAR)模型

9.R語言VAR模型的不同類型的脈沖響應分析

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM