R語言Markowitz馬克維茨投資組合理論分析和視覺化
阿新 • • 發佈:2020-07-25
原文連結:http://tecdat.cn/?p=14200
之前我們在關於投資組合優化相關的內容中已經看到了Markowitz的理論,其中給出了預期收益和協方差矩陣
- > 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
現在,我們可以視覺化下面的有效邊界(和可接受的投資組合)
- > 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))
實際上很難在該圖上將重要的東西視覺化:收益之間的相關性。它不是點(單變數,具有預期收益和標準差),而是有效邊界。例如,這是我們的相關矩陣
- 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之間的相關性(此處為.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))
- }
例如,相關係數為0.6,我們得到以下有效邊界
> courbe(.6)
並具有更強的相關性
> courbe(.9)
很明顯,相關性很重要。但更重要的是,期望收益和協方差不是給出而是估計的。以前,我們確實將標準估計量用於方差矩陣。但是可以考慮使用另一個更可靠的估計器
- 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))
它確實影響了點的(水平)位置,因為方差現在以及有效邊界都不同,而方差明顯更低。
為了說明最後一點,說明我們確實有基於觀察到的收益的估計量,如果我們觀察到不同的收益怎麼辦?瞭解可能發生的情況的一種方法是使用載入程式,例如每日收益。
- > 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)
- + }
或其他資產
這是我們在(估計的)有效邊界上得到的
- > 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")
- + }
因此,至少在統計學的角度上,要評估一個投資組合是否最優是很困難的。
參考文獻
1.用機器學習識別不斷變化的股市狀況—隱馬爾科夫模型(HMM)的應用