1. 程式人生 > 其它 >使用R語言構造投資組合

使用R語言構造投資組合

原作者: 鄧一碩

來自: 格物堂

構造投資組合是金融投資分析中歷久彌新的問題。多年以來,學界、業界提出諸多對投資組合進行優化的方法。比如,最經典的基於收益率均值和 收益率波動性進行組合優化,由於馬克維滋提出用收益率方差表示收益率的波動性,所以,這種方法又稱為的$$ sum M-V $$方法,即 Mean-Variance 方法的縮寫;後來,又衍生出基於夏普比率(Sharp Ratio)的投資組合優化方法;近年來,隨著VaR (Value at Risk) 和 CVaR(Conditional Vaule at Risk) 概念的興起,基於 VaRCVaR 對投資組合進行優化的思路也開始勃興;除此之外,對衝基金屆還有一種非常有生命力的投資組合優化方法,即橋水公司(Bridge-Water

)公司提出的風險均攤方法( Risk Pairy ),這種方法的核心思路在於,估計組合中各個資產的風險度及其佔組合風險的比率,然後,按照該比例對組合頭寸進行分配。

幾種方法中,在學界和業界最收關注的還是 M-V 方法。而在 M-V 方法中最基本的一個知識點,就是構造投資組合的有效前沿。理論這裡不再贅述,簡單說一下其在 R 語言中的實現。構造有效前沿的步驟大致可按照獲取資料、將資料加工處理為收益率矩陣、以收益率矩陣為輸入計算得到有效前沿這三個步驟來完成。下面分佈來說一說。

第一步,獲取資料。最簡單的方法是使用 quantmod 中的 getSymbols 函式。因為要要做的事是構建資產組合,因此,得同時獲取多隻股票的交易資料,這裡取 QQQ/SPY/YHOO 三隻股票為例。需要執行的程式碼:

# 載入 quatnmod 包require(quantmod) # 下載 QQQ/SPY/YHOO 交易資料getSymbols(c('QQQ','SPY','YHOO')) 

第二步,將交易資料處理為收益率資料。這一步可以用 dailyReturn 函式來完成。

# 計算收益率序列QQQ_ret=dailyReturn(QQQ)  SPY_ret=dailyReturn(SPY)YHOO_ret=dailyReturn(YHOO)

第三步,合併收益率序列。

dat=merge(QQQ_ret,SPY_ret,YHOO_ret)

第四步,計算投資組合的有效前沿。這一步使用 portfolioFrontier 函式來完成。由於 portfolioFrontier 函式的輸入必須是 timeSeries 類,因而,得將資料型別進行轉化。

## 轉化為 timeSeries 類require(timeSeries)dat=as.timeSeries(dat)  ## 載入 fPortfoliorequire(fPortfolio)## 求frontier Frontier = portfolioFrontier(dat)Frontier

Title:
 MV Portfolio Frontier 
 Estimator:         covEstimator 
 Solver:            solveRquadprog 
 Optimize:          minRisk 
 Constraints:       LongOnly 
 Portfolio Points:  5 of 50 Portfolio Weights:
   daily.returns daily.returns.1 daily.returns.21         0.0000          1.0000          0.000013        0.2409          0.7541          0.005025        0.4853          0.5090          0.005737        0.7296          0.2640          0.006550        1.0000          0.0000          0.0000Covariance Risk Budgets:
   daily.returns daily.returns.1 daily.returns.21         0.0000          1.0000          0.000013        0.2355          0.7596          0.004925        0.4877          0.5065          0.005837        0.7390          0.2545          0.006550        1.0000          0.0000          0.0000Target Return and Risks:
     mean     mu    Cov  Sigma   CVaR    VaR1  0.0002 0.0002 0.0151 0.0151 0.0368 0.023313 0.0003 0.0003 0.0149 0.0149 0.0361 0.023025 0.0003 0.0003 0.0148 0.0148 0.0358 0.023437 0.0004 0.0004 0.0149 0.0149 0.0356 0.024150 0.0005 0.0005 0.0152 0.0152 0.0357 0.0249Description:
 Fri Aug 09 11:21:31 2013 by user: Owner 

上面結果中 title 部分表明的是本次操作過程中使用的相關方法。Portfolio Weights 部分返回的是三隻股票在投資組合中的頭寸比例,每一行的和都是 1 。對於第二行,它表示的是在投資組合中將總頭寸以 24.09% 、 75.41% 、 0.50% 的比例分散到三隻股票標的上。Covariance Risk Budgets 表示的是協方差風險預算矩陣。Target Return and Risks 表示目標組合的預期收益率和風險資料。

呼叫 plot 函式可以對上述結果進行繪圖,呼叫 plot 之後,R 控制檯會返回一組繪圖選項卡:

plot(Frontier)Make a plot selection (or 0 to exit):

 1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]

各選項卡對應的繪圖型別依次是:有效前沿、最小風險組合、切線組合、單個資產的風險/收益、等權重投資組合、兩資產投資組合的有效前沿(禁止賣空)、模特卡羅模擬得到的投資組合、夏普比率。依次,選擇可以看到相應的繪圖結果:

Selection: 1Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 2Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 3Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 4Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 5Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 6Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 7Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]
Selection: 8Make a plot selection (or 0 to exit): 1:   Plot Efficient Frontier2:   Add Minimum Risk Portfolio3:   Add Tangency Portfolio4:   Add Risk/Return of Single Assets5:   Add Equal Weights Portfolio6:   Add Two Asset Frontiers [LongOnly Only]7:   Add Monte Carlo Portfolios8:   Add Sharpe Ratio [Markowitz PF Only]