1. 程式人生 > 實用技巧 >R語言Markowitz馬克維茨投資組合理論分析和視覺化

R語言Markowitz馬克維茨投資組合理論分析和視覺化

原文連結:http://tecdat.cn/?p=14200

之前我們在關於投資組合優化相關的內容中已經看到了Markowitz的理論,其中給出了預期收益和協方差矩陣

  1. > pzoo = zoo ( StockIndex , order.by = rownames ( StockIndex ) )
  2. > rzoo = ( pzoo / lag ( pzoo , k = -1) - 1 ) * 100
  3. >
  4. ans <- do.call ( method , list ( x = x , ... ) ) + return ( getCov ( ans ) )} > covmat=Moments(as.matrix(rzoo),"CovClassic")
  5. > (covmat=round(covmat,1))
  6. SP500 N225 FTSE100 CAC40 GDAX HSI
  7. SP500 17.8 12.7 13.8 17.8 19.5 18.9
  8. N225 12.7 36.6 10.8 15.0 16.2 16.7
  9. FTSE100 13.8 10.8 17.3 18.8 19.4 19.1
  10. CAC40 17.8 15.0 18.8 30.9 29.9 22.8
  11. GDAX 19.5 16.2 19.4 29.9 38.0 26.1
  12. HSI 18.9 16.7 19.1 22.8 26.1 58.1

現在,我們可以視覺化下面的有效邊界(和可接受的投資組合)

  1. > points(sqrt(diag(covmat)),er,pch=19,col="blue")
  2. > text(sqrt(diag(covmat)),er,names(er),pos=4, col="blue",cex=.6)
  3. > polygon(u,v,border=NA,col=rgb(0,0,1,.3))

實際上很難在該圖上將重要的東西視覺化:收益之間的相關性。它不是點(單變數,具有預期收益和標準差),而是有效邊界。例如,這是我們的相關矩陣

  1. SP500 N225 FTSE100 CAC40 GDAX HSI
  2. SP500 1.00 0.50 0.79 0.76 0.75 0.59
  3. N225 0.50 1.00 0.43 0.45 0.43 0.36
  4. FTSE100 0.79 0.43 1.00 0.81 0.76 0.60
  5. CAC40 0.76 0.45 0.81 1.00 0.87 0.54
  6. GDAX 0.75 0.43 0.76 0.87 1.00 0.56
  7. HSI 0.59 0.36 0.60 0.54 0.56 1.00

我們實際上可以更改FT500和FTSE100之間的相關性(此處為.786)

  1. courbe=function(r=.786){
  2. ef
  3. plot(ef$sd,ef$er,type="l",xlab="Standard Deviation",ylab="Expected Return",
  4. points(sqrt(diag(covmat)),er,pch=19,col=c("blue","red")[c(2,1,2,1,1,1)])
  5. polygon(u,v,border=NA,col=rgb(0,0,1,.3))
  6. }

例如,相關係數為0.6,我們得到以下有效邊界

> courbe(.6)

並具有更強的相關性

> courbe(.9)

很明顯,相關性很重要。但更重要的是,期望收益和協方差不是給出而是估計的。以前,我們確實將標準估計量用於方差矩陣。但是可以考慮使用另一個更可靠的估計器

  1. covmat=Moments(as.matrix(rzoo),"CovSde")
  2. points(sqrt(diag(covmat)),er,pch=19,col="blue")
  3. text(sqrt(diag(covmat)),er,names(er),pos=4,col="blue",cex=.6)
  4. polygon(u,v,border=NA,col=rgb(0,0,1,.3))

它確實影響了點的(水平)位置,因為方差現在以及有效邊界都不同,而方差明顯更低。

為了說明最後一點,說明我們確實有基於觀察到的收益的估計量,如果我們觀察到不同的收益怎麼辦?瞭解可能發生的情況的一種方法是使用載入程式,例如每日收益。

  1. > 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)
  2. > polygon(u,v,border=NA,col=rgb(0,0,1,.3))
  3. > for(i in 1:100){
  4. +
  5. +
  6. + er=apply(as.matrix(rzoo)[id,],2,mean)
  7. + points(sqrt(diag(covmat))[k],er[k],cex=.5)
  8. + }

或其他資產

這是我們在(估計的)有效邊界上得到的

  1. > polygon(u,v,border=NA,col=rgb(0,0,1,.3))
  2. > for(i in 1:100){
  3. +
  4. +
  5. +
  6. + ef <- efficient.frontier(er, covmat, alpha.min=-2.5, alpha.max=2.5, nport=50)
  7. + lines(ef$sd,ef$er,col="red")
  8. + }

因此,至少在統計學的角度上,要評估一個投資組合是否最優是很困難的。


參考文獻

1.用機器學習識別不斷變化的股市狀況—隱馬爾科夫模型(HMM)的應用

2.R語言GARCH-DCC模型和DCC(MVT)建模估計

3.R語言實現 Copula 演算法建模依賴性案例分析報告

4.R語言使用ARIMA模型預測股票收益

5.r語言中對LASSO迴歸,Ridge嶺迴歸和Elastic Net模型實現

6.用R語言實現神經網路預測股票例項

7.r語言預測波動率的實現:ARCH模型與HAR-RV模型

8.R語言如何做馬爾科夫轉換模型markov switching model