在引入copula時,你們廣泛認爲copula頗有趣,由於它們容許分別對邊緣分佈和相依結構進行建模。html
copula建模邊緣和相依關係給定一些邊緣分佈函數和一個copula,那麼咱們能夠生成一個多元分佈函數,其中的邊緣是前面指定的。算法
> library(mnormt) > set.seed(1) > Z=exp(rmnorm(25,MU,SIGMA))
咱們能夠從邊緣分佈開始。app
meanlog sdlog 1.168 0.930 (0.186 ) (0.131 ) meanlog sdlog 2.218 1.168 (0.233 ) (0.165 )
基於這些邊緣分佈,並考慮從該僞隨機樣本得到的copula參數的最大似然估計值,從數值上講,咱們獲得ide
> 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() 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的樣本,google
barplot(counts, axes=FALSE,col="light blue"
若是邊緣分佈被很好地設定時,咱們能夠清楚地看到相依結構依賴於邊緣分佈,code
copula模擬股市中相關隨機遊走
接下來咱們用copula函數模擬股市中的相關隨機遊走orm
#***************************************************************** # 載入歷史數據 #****************************************************************** 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
FBhtm
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模型擬合和預測實證研究