R語言Markowitz馬克維茨投資組合理論分析和可視化
原文鏈接:?http://tecdat.cn/?p=14200
之前我們在關(guān)于投資組合優(yōu)化相關(guān)的內(nèi)容中已經(jīng)看到了Markowitz的理論,其中給出了預(yù)期收益和協(xié)方差矩陣
> pzoo = zoo ( StockIndex , order.by = rownames ( StockIndex ) )
> rzoo = ( pzoo / lag ( pzoo , k = -1) - 1 ) * 100
>
ans <- do.call ( method , list ( x = x , ... ) ) + return ( getCov ( ans ) )} > covmat=Moments(as.matrix(rzoo),"CovClassic")
> (covmat=round(covmat,1))
SP500 N225 FTSE100 CAC40 GDAX HSI
SP500?? 17.8 12.7 13.8 17.8 19.5 18.9
N225 ?? 12.7 36.6 10.8 15.0 16.2 16.7
FTSE100 13.8 10.8 17.3 18.8 19.4 19.1
CAC40?? 17.8 15.0 18.8 30.9 29.9 22.8
GDAX??? 19.5 16.2 19.4 29.9 38.0 26.1
HSI???? 18.9 16.7 19.1 22.8 26.1 58.1
現(xiàn)在,我們可以可視化下面的有效邊界(和可接受的投資組合)
> points(sqrt(diag(covmat)),er,pch=19,col="blue")
> text(sqrt(diag(covmat)),er,names(er),pos=4, col="blue",cex=.6)
> polygon(u,v,border=NA,col=rgb(0,0,1,.3))

實際上很難在該圖上將重要的東西可視化:收益之間的相關(guān)性。它不是點(單變量,具有預(yù)期收益和標準差),而是有效邊界。例如,這是我們的相關(guān)矩陣
SP500 N225 FTSE100 CAC40 GDAX HSI
SP500?? 1.00 0.50 0.79 0.76 0.75 0.59
N225??? 0.50 1.00 0.43 0.45 0.43 0.36
FTSE100 0.79 0.43 1.00 0.81 0.76 0.60
CAC40?? 0.76 0.45 0.81 1.00 0.87 0.54
GDAX??? 0.75 0.43 0.76 0.87 1.00 0.56
HSI???? 0.59 0.36 0.60 0.54 0.56 1.00
我們實際上可以更改FT500和FTSE100之間的相關(guān)性(此處為.786)
courbe=function(r=.786){
ef
plot(ef$sd,ef$er,type="l",xlab="Standard Deviation",ylab="Expected Return",
points(sqrt(diag(covmat)),er,pch=19,col=c("blue","red")[c(2,1,2,1,1,1)])
polygon(u,v,border=NA,col=rgb(0,0,1,.3))
}
例如,相關(guān)系數(shù)為0.6,我們得到以下有效邊界
> courbe(.6)

并具有更強的相關(guān)性
> courbe(.9)

很明顯,相關(guān)性很重要。但更重要的是,期望收益和協(xié)方差不是給出而是估計的。以前,我們確實將標準估計量用于方差矩陣。但是可以考慮使用另一個更可靠的估計器
covmat=Moments(as.matrix(rzoo),"CovSde")
points(sqrt(diag(covmat)),er,pch=19,col="blue")
text(sqrt(diag(covmat)),er,names(er),pos=4,col="blue",cex=.6)
polygon(u,v,border=NA,col=rgb(0,0,1,.3))

它確實影響了點的(水平)位置,因為方差現(xiàn)在以及有效邊界都不同,而方差明顯更低。
為了說明最后一點,說明我們確實有基于觀察到的收益的估計量,如果我們觀察到不同的收益怎么辦?了解可能發(fā)生的情況的一種方法是使用引導(dǎo)程序,例如每日收益。
> plot(ef$sd,ef$er,type="l",xlab="Standard Deviation",ylab="Expected Return", xlim=c(3.5,11),ylim=c(0,2.5),col="white",lwd=1.5)
> polygon(u,v,border=NA,col=rgb(0,0,1,.3))
> for(i in 1:100){
+ ?
+ ?
+ er=apply(as.matrix(rzoo)[id,],2,mean)
+ points(sqrt(diag(covmat))[k],er[k],cex=.5)
+ }

或其他資產(chǎn)

這是我們在(估計的)有效邊界上得到的
> polygon(u,v,border=NA,col=rgb(0,0,1,.3))
> for(i in 1:100){
+
+ ?
+ ?
+ ef <- efficient.frontier(er, covmat, alpha.min=-2.5, alpha.max=2.5, nport=50)
+ lines(ef$sd,ef$er,col="red")
+ }

因此,至少在統(tǒng)計學(xué)的角度上,要評估一個投資組合是否最優(yōu)是很困難的。

參考文獻
1.用機器學(xué)習識別不斷變化的股市狀況—隱馬爾科夫模型(HMM)的應(yīng)用
2.R語言GARCH-DCC模型和DCC(MVT)建模估計
3.R語言實現(xiàn) Copula 算法建模依賴性案例分析報告
4.R語言使用ARIMA模型預(yù)測股票收益
5.r語言中對LASSO回歸,Ridge嶺回歸和Elastic Net模型實現(xiàn)
6.用R語言實現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測股票實例
7.r語言預(yù)測波動率的實現(xiàn):ARCH模型與HAR-RV模型
8.R語言如何做馬爾科夫轉(zhuǎn)換模型markov switching model