ポートフォリオ最適化・効率的フロンティアの作成(QP)

マーコヴィッツアプローチ、俗にいうMean-Variance最適化、数理計画的には二次計画法によるポートフォリオの最適化法をRmetricsで行う方法。

プログラム内部にデフォルトで定式化されている問題は
min_{w} w^{T} \Sigma w
s.t
w^{T} \hat{\mu} = r
w^{T} \vec{1} =1
w \geq 0
という空売りの許されないタイプの2次計画問題になっている。
これをスタートとしてさまざまな制約をユーザが課して行き、最終的な結果を取得する。
また、効率的フロンティア作成関数portfolioFrontierで作成されるfPORTFOLIOクラスのオブジェクトには最適化に使用された情報、および最適化結果が格納されている。

以下、コード

#ポートフォリオ用ライブラリのロード
library("fPortfolio")
#fPortfolioに用意されているSMALLCAPのリターンデータから6銘柄だけ抽出。(timeSeries型のオブジェクト)
data <- SMALLCAP.RET[,1:6]
#作成するフロンティアの条件設定.フロンティア上のポートフォリオを10個作成。
conditions <- portfolioSpec()
setNFrontierPoints(conditions) <- 10   
#データ、効率的フロンティアの作成
efficientFrontier <- portfolioFrontier(data ,conditions)
#効率的フロンティアを描画
plot(efficientFrontier,1)
#plot(efficientFrontier)後、選択画面から1を選択でも可能.
#そのほか
#最小リスクポートフォリオ(2)
#接点ポートフォリオ(3)
#各資産のリスクリターン平面での位置(4)
#等ウェイトで保有した場合のポートフォリオ(5)
#指定したデータの2資産ごとを保有した場合のフロンティア(6)
#モンテカルロシミュレーションで算出したポートフォリオ(7)
#シャープレシオ(8)
#が追記描画可能(0で終了)


#ウェイト制約を追加してみる。
#1、2番目の資産の最低保有ウェイトがそれぞれ10%,20%
#各資産の最大ウェイトが50%という意味
weightConstraints <- c("minW[1:2]=c(0.1,0.2)","maxW[1:6]=0.5")
efficientFrontier <- portfolioFrontier(data ,conditions,weightConstraints)
#ウェイト制約が満たされているか確認
print(efficientFrontier)
#効率的フロンティアを描画
plot(efficientFrontier,1)
#以下のような特殊な描画が可能な関数も用意されている。
#フロンティア上の点での資産ウェイトのプロット
weightsPlot(efficientFrontier)
#各資産が全体のリスクをどのくらい占めているかというリスクで見た資産配分プロット(リスクバジェッティング)
covRiskBudgetsPlot(efficientFrontier)
#接点ポートフォリオ、各資産の位置等がデフォルトで記述される効率的フロンティア描画関数
tailoredFrontierPlot(efficientFrontier)

#各資産を”グルーピング”して制約条件を課すことも可能
#1番目の資産と2番目の資産の投資ウェイトの合計が30%以上、3番目と4番目の資産の合計が50%以下
groupConstraints <- c("minsumW[c(1,2)]=0.3","maxsumW[c(3,4)]=0.5")
#個別資産の投資ウェイト制約も同時に適用し効率的フロンティアを記述
efficientFrontier <- portfolioFrontier(data ,conditions,c(weightConstraints,groupConstraints))
#結果確認
print(efficientFrontier)