Keyword: 金融工学, ポートフォリオ最適化, リスク管理, 投資戦略, QP
金融分野の最適化問題:ポートフォリオ最適化
問題の概要
ポートフォリオ最適化は、金融工学における重要な問題の一つです。この問題は、投資家が所与のリスク水準の下で期待リターンを最大化するか、または所与の期待リターンの下でリスクを最小化するように、資産への投資配分を決定することを目的としています。
ポートフォリオ最適化を行うことで、投資家はリスクとリターンのバランスを取りながら、自身の投資目的に合致したポートフォリオを構築することができます。この問題を解決することは、効率的な資産運用や投資戦略の立案に役立ちます。
主要な制約条件としては、投資比率の合計が1であること、各資産への投資比率が非負であることなどが挙げられます。また、投資家のリスク許容度や投資目的に応じて、追加の制約条件を設定することもあります。
最小分散ポートフォリオの構築(具体例)
ここでは、10種類の資産からなるポートフォリオについて、目標とする期待リターンを達成しつつ、ポートフォリオのリスク(分散)を最小化する問題を考えます。この問題を解くことで、投資家は自身の目標リターンに対して最もリスクの低いポートフォリオを構築することができます。
以下に、問題を解くために必要なパラメータ値を提示します。
| 資産 | 期待リターン | リスク(標準偏差) |
|---|---|---|
| 米国株式 | 0.08 | 0.20 |
| ヨーロッパ株式 | 0.07 | 0.18 |
| 日本株式 | 0.06 | 0.22 |
| 新興市場株式 | 0.10 | 0.30 |
| 国際債券 | 0.03 | 0.08 |
| 米国債券 | 0.02 | 0.05 |
| 企業債 | 0.04 | 0.10 |
| 不動産投資信託(REITs) | 0.07 | 0.15 |
| コモディティ | 0.05 | 0.25 |
| 金 | 0.03 | 0.20 |
また、資産間の相関係数は以下の通りとします。
| 米国株式 | ヨーロッパ株式 | 日本株式 | 新興市場株式 | 国際債券 | 米国債券 | 企業債 | REITs | コモディティ | 金 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 米国株式 | 1.00 | 0.60 | 0.40 | 0.50 | 0.20 | 0.30 | 0.50 | 0.40 | 0.30 | 0.10 |
| ヨーロッパ株式 | 0.60 | 1.00 | 0.30 | 0.40 | 0.30 | 0.20 | 0.40 | 0.30 | 0.20 | 0.15 |
| 日本株式 | 0.40 | 0.30 | 1.00 | 0.20 | 0.10 | 0.05 | 0.20 | 0.15 | 0.10 | 0.05 |
| 新興市場株式 | 0.50 | 0.40 | 0.20 | 1.00 | 0.10 | 0.05 | 0.30 | 0.20 | 0.40 | 0.20 |
| 国際債券 | 0.20 | 0.30 | 0.10 | 0.10 | 1.00 | 0.80 | 0.60 | 0.30 | 0.10 | 0.30 |
| 米国債券 | 0.30 | 0.20 | 0.05 | 0.05 | 0.80 | 1.00 | 0.70 | 0.20 | 0.05 | 0.20 |
| 企業債 | 0.50 | 0.40 | 0.20 | 0.30 | 0.60 | 0.70 | 1.00 | 0.40 | 0.20 | 0.10 |
| REITs | 0.40 | 0.30 | 0.15 | 0.20 | 0.30 | 0.20 | 0.40 | 1.00 | 0.15 | 0.05 |
| コモディティ | 0.30 | 0.20 | 0.10 | 0.40 | 0.10 | 0.05 | 0.20 | 0.15 | 1.00 | 0.40 |
| 金 | 0.10 | 0.15 | 0.05 | 0.20 | 0.30 | 0.20 | 0.10 | 0.05 | 0.40 | 1.00 |
目標とする期待リターンは年率6%とします。
問題の定式化
パラメータ
| パラメータ | 説明 | 値 |
|---|---|---|
| \(\mu_i\) | 資産 \(i\) の期待リターン | 上記の表を参照 |
| \(\sigma_i\) | 資産 \(i\) のリスク(標準偏差) | 上記の表を参照 |
| \(\rho_{ij}\) | 資産 \(i\) と資産 \(j\) の相関係数 | 上記の表を参照 |
| \(r_{\text{target}}\) | 目標とする期待リターン | 0.06 |
決定変数
| 変数 | 説明 | 範囲 |
|---|---|---|
| \(w_i\) | 資産 \(i\) への投資比率 | \(l_i \leq w_i \leq u_i\) |
ここで、\(l_i\) と \(u_i\) は、それぞれ資産 \(i\) への投資比率の下限と上限を表します。
目的関数
| 目的 | 式 |
|---|---|
| ポートフォリオの分散を最小化 | \(\min \sum_{i=1}^{n} \sum_{j=1}^{n} w_i w_j \sigma_i \sigma_j \rho_{ij}\) |
制約条件
| 制約 | 式 | 説明 |
|---|---|---|
| 投資比率の合計 | \(\sum_{i=1}^{n} w_i = 1\) | 投資比率の合計は1でなければならない |
| 目標期待リターン | \(\sum_{i=1}^{n} w_i \mu_i = r_{\text{target}}\) | ポートフォリオの期待リターンは目標値と等しくなければならない |
| 投資比率の下限 | \(w_i \geq l_i, \forall i\) | 各資産への投資比率は下限以上でなければならない |
| 投資比率の上限 | \(w_i \leq u_i, \forall i\) | 各資産への投資比率は上限以下でなければならない |
ここで、\(l_i\) と \(u_i\) は、それぞれ資産 \(i\) への投資比率の下限と上限を表します。具体的な値は以下の通りです。
| 資産 | 下限 | 上限 |
|---|---|---|
| 米国株式 | 0.05 | 0.20 |
| ヨーロッパ株式 | 0.03 | 0.15 |
| 日本株式 | 0.03 | 0.15 |
| 新興市場株式 | 0.02 | 0.10 |
| 国際債券 | 0.05 | 0.20 |
| 米国債券 | 0.05 | 0.20 |
| 企業債 | 0.02 | 0.10 |
| REITs | 0.02 | 0.10 |
| コモディティ | 0.00 | 0.05 |
| 金 | 0.00 | 0.05 |
コード例
以下に、この二次計画問題を nAG Library for Python の QP ソルバー関数 qp_solve を用いて解くコード例を示します。
from naginterfaces.library import opt
import numpy as np
# 問題のパラメータ
assets = ['米国株式', 'ヨーロッパ株式', '日本株式', '新興市場株式', '国際債券', '米国債券', '企業債', 'REITs', 'コモディティ', '金']
n = len(assets) # 資産の数
mu = np.array([0.08, 0.07, 0.06, 0.10, 0.03, 0.02, 0.04, 0.07, 0.05, 0.03]) # 期待リターン
sigma = np.array([0.20, 0.18, 0.22, 0.30, 0.08, 0.05, 0.10, 0.15, 0.25, 0.20]) # 標準偏差
target_return = 0.06 # 目標期待リターン
initial_weights = np.full(n, 1.0/n) # 初期ウェイト
# 相関行列
corr_matrix = np.array([
[1.00, 0.60, 0.40, 0.50, 0.20, 0.30, 0.50, 0.40, 0.30, 0.10],
[0.60, 1.00, 0.30, 0.40, 0.30, 0.20, 0.40, 0.30, 0.20, 0.15],
[0.40, 0.30, 1.00, 0.20, 0.10, 0.05, 0.20, 0.15, 0.10, 0.05],
[0.50, 0.40, 0.20, 1.00, 0.10, 0.05, 0.30, 0.20, 0.40, 0.20],
[0.20, 0.30, 0.10, 0.10, 1.00, 0.80, 0.60, 0.30, 0.10, 0.30],
[0.30, 0.20, 0.05, 0.05, 0.80, 1.00, 0.70, 0.20, 0.05, 0.20],
[0.50, 0.40, 0.20, 0.30, 0.60, 0.70, 1.00, 0.40, 0.20, 0.10],
[0.40, 0.30, 0.15, 0.20, 0.30, 0.20, 0.40, 1.00, 0.15, 0.05],
[0.30, 0.20, 0.10, 0.40, 0.10, 0.05, 0.20, 0.15, 1.00, 0.40],
[0.10, 0.15, 0.05, 0.20, 0.30, 0.20, 0.10, 0.05, 0.40, 1.00]
])
# 共分散行列
cov_matrix = np.outer(sigma, sigma) * corr_matrix
# 線形制約行列
A = np.zeros((2, n))
A[0, :] = mu # 期待リターン制約の係数
A[1, :] = np.ones(n) # ウェイトの合計が1になる制約の係数
# 制約条件と変数の上下限
bl = np.zeros(n + 2) # 下限の初期化
bu = np.zeros(n + 2) # 上限の初期化
# 変数の上下限の設定
bl[0:n] = np.array([0.05, 0.03, 0.03, 0.02, 0.05, 0.05, 0.02, 0.02, 0.00, 0.00]) # 変数の下限
bu[0:n] = np.array([0.20, 0.15, 0.15, 0.10, 0.20, 0.20, 0.10, 0.10, 0.05, 0.05]) # 変数の上限
# 線形制約の上下限の設定
bl[n] = target_return # 期待リターンの下限
bu[n] = target_return # 期待リターンの上限
bl[n+1] = 1.0 # ウェイトの合計の下限
bu[n+1] = 1.0 # ウェイトの合計の上限
# 問題の初期化
comm = opt.nlp1_init('qp_dense_solve') # QP問題の通信構造の初期化
# 二次計画問題の解法
result = opt.qp_dense_solve(bl, bu, cov_matrix, initial_weights, comm, a=A, cvec=np.zeros(n))
# 結果の出力
print("最適ウェイト:")
for i in range(n):
print(f"{assets[i]}: {result.x[i]*100:.2f}%")
print("------------------------------------------------")
print(f"最適ポートフォリオの期待リターン: {np.dot(A[0, :], result.x)*100:.2f}%")
print(f"最適ポートフォリオの分散: {result.obj*2:.6f}")
print(f"最適ポートフォリオのリスク(標準偏差): {np.sqrt(result.obj*2)*100:.2f}%")結果例
上記のコードを実行すると、以下のような結果が得られます。
最適ウェイト:
米国株式: 18.13%
ヨーロッパ株式: 15.00%
日本株式: 10.60%
新興市場株式: 10.00%
国際債券: 20.00%
米国債券: 5.00%
企業債: 10.00%
REITs: 10.00%
コモディティ: 1.27%
金: 0.00%
------------------------------------------------
最適ポートフォリオの期待リターン: 6.00%
最適ポートフォリオの分散: 0.011704
最適ポートフォリオのリスク(標準偏差): 10.82%
この結果から、目標とする期待リターン6%を達成するためには、米国株式に18.13%、ヨーロッパ株式に15.00%、日本株式に10.60%、新興市場株式に10.00%、国際債券に20.00%、米国債券に5.00%、企業債に10.00%、REITsに10.00%、コモディティに1.27%を配分するのが最適であることがわかります。金への配分はありません。このとき、ポートフォリオの期待リターンは6.00%、リスク(標準偏差)は10.82%になります。
まとめ
ここでは、金融分野におけるポートフォリオ最適化問題について、二次計画法を用いた定式化とその解法を示しました。今回は、目標とする期待リターンを達成しつつ、ポートフォリオのリスクを最小化する問題を取り上げましたが、同じ二次計画法の枠組みを使って、期待リスクの範囲内でリターンを最大化する問題にも容易に応用することができます。
具体的には、目的関数をポートフォリオの期待リターンの最大化に変更し、ポートフォリオのリスク(分散)に関する制約を追加することで、期待リスクの範囲内でリターンを最大化する問題を定式化できます。
このように、二次計画法を用いたポートフォリオ最適化の枠組みは、投資家の目的や制約条件に応じて柔軟に適用できる強力なツールであり、実務上の様々な問題解決に役立てることができます。
