Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2009-07-12

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

| 17:35 | ポートフォリオ最適化・効率的フロンティアの作成(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)

ku77ku77 2012/04/08 10:46 を始めて3日目です(汗
素晴らしい、記事の数々に感激です。
質問させていただくのも大変気が引けるのですが、
下記、minvariancePortfolio(Data)とportfolio.optim(Data)の最適解が一致しません。
minvariancePortfolio(Data)の解は、自作の2次計画法ルーチンの解と有効数字4桁で一致します。

ヒントだけでも、ご教唆いただければ大変助かります。

library(tseries)
library(fPortfolio)

Data = SMALLCAP.RET
Data = Data[, c("BKE", "GG", "GYMB", "KRON")]
#class(Data)

#自作の2次計画法ルーチンの解と一致。こちらの解が正解のようです。
minvariancePortfolio(Data)
#一致しない?
portfolio.optim(Data)

teramonagiteramonagi 2012/04/09 07:12 >minvariancePortfolio(Data)
の方はその名の通り「最小分散ポートフォリオ」を結果として返している一方、
>portfolio.optim(Data)
の方はデフォルトだと
> mean(Data)
[1] 0.02430841
の値を期待リターンとして、このリターン制約の下で一番リスクを小さくするような最適化を行っているので、そこでずれてくるのかと。

最小分散の結果が返してくるリターンの値(この場合0.0265)
>Target Return and Risks:
> mean mu Cov Sigma CVaR VaR
>0.0265 0.0265 0.0931 0.0931 0.1324 0.0901
を指定して計算してやると(portfolio.optim(Data, 0.0265))
だいたいイイ感じに結果が合いまっせ。

ku77ku77 2012/04/09 23:03 ありがとうございます。

おかげ様でよく理解できました!!

teramonagiteramonagi 2012/04/10 20:04 どういたしまして〜!

トラックバック - http://d.hatena.ne.jp/teramonagi/20090712/1247387723