原文鏈接:http://tecdat.cn/?p=19688
在引入copula時,大家普遍認為copula很有趣,因為它們允許分別對邊緣分布和相依結構進行建模。
copula建模邊緣和相依關系
給定一些邊緣分布函數和一個copula,那么我們可以生成一個多元分布函數,其中的邊緣是前面指定的。
考慮一個二元對數正態分布
-
-
> library(mnormt)
-
> set.seed(1)
-
> Z=exp(rmnorm(25,MU,SIGMA))
我們可以從邊緣分布開始。
-
-
meanlog sdlog
-
1 .168 0.930
-
(0 .186 ) (0.131 )
-
-
meanlog sdlog
-
2 .218 1.168
-
(0 .233 ) (0.165 )
基於這些邊緣分布,並考慮從該偽隨機樣本獲得的copula參數的最大似然估計值,從數值上講,我們得到
-
-
> library(copula)
-
-
> Copula() estimation based on 'maximum likelihood'
-
and a sample of size 25.
-
Estimate Std. Error z value Pr(>|z|)
-
rho.1 0.86530 0.03799 22.77
但是,由於相依關系是邊緣分布的函數,因此我們沒有對相依關系進行單獨處理。如果考慮全局優化問題,則結果會有所不同。可以得出密度
-
-
> optim(par=c(0,0,1,1,0),fn=LogLik)$par
-
[ 1] 1.165 2.215 0.923 1.161 0.864
差別不大,但估計量並不相同。從統計的角度來看,我們幾乎無法分別處理邊緣和相依結構。我們應該記住的另一點是,邊際分布可能會錯誤指定。例如,如果我們假設指數分布,
-
-
fitdistr( Z[,1],"exponential")
-
rate
-
0.222
-
( 0.044 )
-
fitdistr( Z[,2],"exponential"
-
rate
-
0.065
-
( 0.013 )
高斯copula的參數估計
-
-
Copula() estimation based on 'maximum likelihood'
-
and a sample of size 25.
-
Estimate Std. Error z value Pr(>|z|)
-
rho.1 0.87421 0.03617 24.17 <2e-16 ***
-
-
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
-
The maximized loglikelihood is 15.4
-
Optimization converged
由於我們錯誤地指定了邊緣分布,因此我們無法獲得統一的邊緣。如果我們使用上述代碼生成大小為500的樣本,
-
-
barplot(counts, axes= FALSE,col="light blue"
如果邊緣分布被很好地設定時,我們可以清楚地看到相依結構依賴於邊緣分布,
copula模擬股市中相關隨機游走
接下來我們用copula函數模擬股市中的相關隨機游走
-
#*****************************************************************
-
# 載入歷史數據
-
#******************************************************************
-
-
load.packages( 'quantmod')
-
-
data $YHOO = getSymbol.intraday.google('YHOO', 'NASDAQ', 60, '15d')
-
data $FB = getSymbol.intraday.google('FB', 'NASDAQ', 60, '15d')
-
bt.prep(data, align= 'remove.na')
-
-
-
#*****************************************************************
-
# 生成模擬
-
#******************************************************************
-
-
rets = diff( log(prices))
-
-
# 繪制價格
-
matplot(exp(apply(rets,2,cumsum)), type='l')
-
# 可視化分布的輔助函數
-
-
# 檢查Copula擬合的Helper函數
-
# 模擬圖與實際圖
-
-
plot(rets[,1], rets[,2], xlab=labs[1], ylab=labs[2], col='blue', las=1)
-
points(fit.sim[,1], fit.sim[,2], col='red')
-
-
# 比較模擬和實際的統計數據
-
temp = matrix(0,nr=5,nc=2)
-
-
print(round(100*temp,2))
-
-
# 檢查收益率是否來自相同的分布
-
for (i in 1:2) {
-
print(labs[i])
-
print(ks.test(rets[,i], fit.sim[i]))
-
-
-
# 繪制模擬價格路徑
-
matplot(exp(apply(fit.sim,2,cumsum)), type='l', main='Simulated Price path')
-
-
-
# 擬合Copula
-
load.packages('copula')
-
-
# 通過組合擬合邊緣和擬合copula創建自定義分布
-
margins=c( "norm","norm")
-
apply(rets, 2,function(x) list(mean=mean(x), sd=sd(x)))
-
-
-
# 從擬合分布模擬
-
rMvdc(4800, fit)
-
-
Actual Simulated
-
Correlation 57.13 57.38
-
Mean FB -0.31 -0.47
-
Mean YHOO -0.40 -0.17
-
StDev FB 1.24 1.25
-
StDev YHOO 1.23 1.23
FB
-
Two-sample Kolmogorov-Smirnov test
-
-
data: rets[, i] and fit.sim[i]
-
D = 0.9404, p-value = 0.3395
-
alternative hypothesis: two-sided
-
HO
-
Two-sample Kolmogorov-Smirnov test
-
-
data: rets[, i] and fit.sim[i]
-
D = 0.8792, p-value = 0.4222
-
alternative hypothesis: two-sided
-
visualize.rets(fit.sim)
-
# qnorm(runif(10^8)) 和 rnorm(10^8) 是等價的
-
uniform.sim = rCopula(4800, gumbelCopula(gumbel@estimate, dim=n))
-
-
Actual Simulated
-
Correlation 57.13 57.14
-
Mean FB -0.31 -0.22
-
Mean YHOO -0.40 -0.56
-
StDev FB 1.24 1.24
-
StDev YHOO 1.23 1.21
FB
-
Two-sample Kolmogorov-Smirnov test
-
-
data: rets[, i] and fit.sim[i]
-
D = 0.7791, p-value = 0.5787
-
alternative hypothesis: two-sided
-
HO
-
Two-sample Kolmogorov-Smirnov test
-
-
data: rets[, i] and fit.sim[i]
-
D = 0.795, p-value = 0.5525
-
alternative hypothesis: two-sided
-
vis(rets)
標准偏差相對於均值而言非常大,接近於零;因此,在某些情況下,我們很有可能獲得不穩定的結果。
最受歡迎的見解
1.R語言基於ARMA-GARCH-VaR模型擬合和預測實證研究