R語言Copula函數股市相關性建模:模擬Random Walk(隨機遊走)

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

 

在引入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的參數估計

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模型擬合和預測實證研究

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模型的不一樣類型的脈衝響應分析

相關文章
相關標籤/搜索