はじめに:Riskfolio-Libとは?
Riskfolio-Libは、Pythonによるポートフォリオ最適化のためのオープンソースライブラリです。このライブラリは、現代ポートフォリオ理論(MPT)から最新の金融工学手法まで、投資ポートフォリオの構築と分析に必要な多様なツールを提供しています。
- オールインワンソリューション:データ分析からポートフォリオ構築、リスク測定、最適化まで一貫して実装可能
- 多彩なリスク指標:分散共分散だけでなく、CVaR、MAD、CDaRなど様々なリスク指標をサポート
- 柔軟な最適化:平均分散法、リスクパリティ、階層リスクパリティなど多様な最適化手法
- ビジュアライゼーション機能:効率的フロンティア、リスク寄与度など直感的なグラフ表示
同様の機能を持つPyPortfolioOptと比較すると、Riskfolio-Libはより多くのリスク指標と最適化モデルをサポートし、制約条件の設定も柔軟に行えます。特に、様々なリスク指標を使った最適化が簡単に実装できる点が大きな特徴です。
Riskfolio-Libのインストールと環境構築
この記事で紹介するコードはこちらのGoogleColabに記載しています。****
インストール手順
最も簡単なインストール方法はpipを使用する方法です:
pip install riskfolio-lib
インストール後は、以下のようにインポートして使用できることを確認しましょう:
import riskfolio as rp
from riskfolio import Portfolio
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
バージョン確認
インストールしたバージョンを確認するには:
import riskfolio as rp
print(f"Riskfolio-Lib version: {rp.__version__}")
データ準備:pandasデータからポートフォリオを構築
Riskfolio-Libでは、基本的にpandasのDataFrameを使ってデータを扱います。まずは分析対象となる株価データを取得し、リターンデータを準備しましょう。
株価データを取得(例:yfinance)
Yahoo! Financeから株価データを取得できるyfinance
ライブラリを使用します:
import yfinance as yf
import pandas as pd
import numpy as np
# 分析対象とする銘柄を選択
tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META', 'TSLA', 'NVDA', 'JPM']
# 株価データ(調整後終値)を取得
prices = yf.download(tickers, start="2020-01-01", end="2024-12-31")['Adj Close']
# リターン(収益率)を計算
returns = prices.pct_change().dropna()
# 基本統計量を確認
print("リターンの要約統計量:")
print(returns.describe())
# 相関行列を確認
print("\n相関行列:")
print(returns.corr())
ここでは4年間の日次データを使用していますが、実際の分析では期間や頻度(週次、月次など)を目的に応じて調整してください。
データをポートフォリオにセット
取得したリターンデータをRiskfolio-Libのポートフォリオオブジェクトに設定します:
import riskfolio as rp
# ポートフォリオオブジェクトを作成
port = rf.Portfolio(returns=returns)
# 資産の統計量を計算
# method_mu: リターン推定方法(hist=ヒストリカル)
# method_cov: 共分散行列推定方法(hist=ヒストリカル)
port.assets_stats(method_mu='hist', method_cov='hist')
# 計算された期待リターンを確認
print("期待リターン:")
print(port.mu)
# 計算された共分散行列を確認
print("\n共分散行列:")
print(port.cov)
assets_stats
メソッドでは、リターンと共分散の推定方法を指定できます:
- リターン推定:
hist
: 単純ヒストリカル平均ewma1
: 指数加重移動平均(EWMA)-
shrink
: シュリンケージ推定 -
共分散推定:
hist
: サンプル共分散行列ewma1
: 指数加重移動平均(EWMA)ledoit
: Ledoit-Wolfシュリンケージ推定gerber1
: Gerber統計的推定
これらの推定方法は、データの特性や分析の目的に応じて選択することが重要です。
最適化:平均分散法(Mean-Variance)
平均分散法の概要
平均分散法は、ハリー・マルコビッツが1952年に提唱したポートフォリオ最適化手法です。この理論は現代ポートフォリオ理論(MPT)の基礎となり、以下の特徴があります:
- リスクとリターンのトレードオフ: 投資家はリスク(分散)とリターン(期待収益率)のバランスを最適化
- 分散投資の効果: 相関の低い資産を組み合わせることでリスクを低減
- 効率的フロンティア: 同じリスクレベルで最大リターン(または同じリターンで最小リスク)を提供する最適なポートフォリオの集合
平均分散法では、ポートフォリオの期待リターン(μp)とリスク(分散σp²)は以下のように表されます:
- μp = Σ wi・μi (各資産のリターンを配分比率で加重平均)
- σp² = w’・Σ・w (wは資産配分ベクトル、Σは共分散行列)
最適化の目的関数
Riskfolio-Libでは、以下のような複数の最適化目的から選択できます:
- MinRisk: リスクを最小化
- MaxRet: リターンを最大化
- Utility: 効用関数(リターン – λ・リスク)を最大化
- Sharpe: シャープレシオを最大化
- MaxDiv: 分散率を最大化
実装ステップ
最も基本的な平均分散最適化(シャープレシオ最大化)を実装してみましょう:
# モデル定義と最適化実行
w = port.optimization(model='Classic', # モデルの種類(Classic=マルコビッツモデル)
rm='MV', # リスク指標(MV=分散)
obj='Sharpe', # 目的関数(シャープレシオ最大化)
)
# 最適化結果の表示
print("最適資産配分:")
w.T
グラフでの可視化
最適化結果をのウェイトグラフをパイチャートで確認します
# 円グラフで資産配分を表示
ax = rp.plot_pie(w=w, title='Mean-Variance Portfolio Allocation')
その他のリスク指標と最適化モデル
平均分散法以外にも、Riskfolio-Libでは様々なリスク指標と最適化モデルを使用できます。
代表的なリスク指標
- MV: 平均分散(標準偏差)
- MAD: 平均絶対偏差
- MSV: 半分散
- CVaR: 条件付きバリューアットリスク
- EVaR: エントロピーVaR
- CDaR: 条件付きドローダウンリスク
代表的な最適化モデル
- Classic: 従来の平均分散モデル
- BL: Black-Littermanモデル
- FM: ファクターモデル
- RP: リスクパリティ
- HRP: 階層的リスクパリティ
例えば、CVaRを最小化するポートフォリオを構築する場合:
# CVaRを最小化するポートフォリオ
w_cvar = port.optimization(model='Classic',
rm='CVaR', # リスク指標をCVaRに変更
obj='MinRisk', # リスク最小化を目的に
hist=True) # ヒストリカルシミュレーション使用
print("CVaR最小化ポートフォリオ:")
w_cvar.T
まとめ
Riskfolio-Libを使用した基本的なポートフォリオ最適化の流れを説明しました。このライブラリを使用することで、以下のような高度な分析も可能です:
- リスク寄与度分析: 各資産がポートフォリオリスクにどれだけ寄与しているかを分析
- リバランスシミュレーション: 定期的なリバランスを含むバックテスト
- 複数期間最適化: 将来の複数期間を考慮した最適化
Riskfolio-Libは、学術研究から実務まで幅広く活用できる強力なツールです。この入門記事を出発点として、より高度なポートフォリオ最適化手法に挑戦してみてください。