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%とします。
問題の定式化
パラメータ
パラメータ | 説明 | 値 |
---|---|---|
資産 |
上記の表を参照 | |
資産 |
上記の表を参照 | |
資産 |
上記の表を参照 | |
目標とする期待リターン | 0.06 |
決定変数
変数 | 説明 | 範囲 |
---|---|---|
資産 |
ここで、
目的関数
目的 | 式 |
---|---|
ポートフォリオの分散を最小化 |
制約条件
制約 | 式 | 説明 |
---|---|---|
投資比率の合計 | 投資比率の合計は1でなければならない | |
目標期待リターン | ポートフォリオの期待リターンは目標値と等しくなければならない | |
投資比率の下限 | 各資産への投資比率は下限以上でなければならない | |
投資比率の上限 | 各資産への投資比率は上限以下でなければならない |
ここで、
資産 | 下限 | 上限 |
---|---|---|
米国株式 | 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
# 問題のパラメータ
= ['米国株式', 'ヨーロッパ株式', '日本株式', '新興市場株式', '国際債券', '米国債券', '企業債', 'REITs', 'コモディティ', '金']
assets = len(assets) # 資産の数
n = np.array([0.08, 0.07, 0.06, 0.10, 0.03, 0.02, 0.04, 0.07, 0.05, 0.03]) # 期待リターン
mu = np.array([0.20, 0.18, 0.22, 0.30, 0.08, 0.05, 0.10, 0.15, 0.25, 0.20]) # 標準偏差
sigma = 0.06 # 目標期待リターン
target_return = np.full(n, 1.0/n) # 初期ウェイト
initial_weights
# 相関行列
= np.array([
corr_matrix 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]
[
])
# 共分散行列
= np.outer(sigma, sigma) * corr_matrix
cov_matrix
# 線形制約行列
= np.zeros((2, n))
A 0, :] = mu # 期待リターン制約の係数
A[1, :] = np.ones(n) # ウェイトの合計が1になる制約の係数
A[
# 制約条件と変数の上下限
= np.zeros(n + 2) # 下限の初期化
bl = np.zeros(n + 2) # 上限の初期化
bu
# 変数の上下限の設定
0:n] = np.array([0.05, 0.03, 0.03, 0.02, 0.05, 0.05, 0.02, 0.02, 0.00, 0.00]) # 変数の下限
bl[0:n] = np.array([0.20, 0.15, 0.15, 0.10, 0.20, 0.20, 0.10, 0.10, 0.05, 0.05]) # 変数の上限
bu[
# 線形制約の上下限の設定
= target_return # 期待リターンの下限
bl[n] = target_return # 期待リターンの上限
bu[n] +1] = 1.0 # ウェイトの合計の下限
bl[n+1] = 1.0 # ウェイトの合計の上限
bu[n
# 問題の初期化
= opt.nlp1_init('qp_dense_solve') # QP問題の通信構造の初期化
comm
# 二次計画問題の解法
= opt.qp_dense_solve(bl, bu, cov_matrix, initial_weights, comm, a=A, cvec=np.zeros(n))
result
# 結果の出力
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%になります。
まとめ
ここでは、金融分野におけるポートフォリオ最適化問題について、二次計画法を用いた定式化とその解法を示しました。今回は、目標とする期待リターンを達成しつつ、ポートフォリオのリスクを最小化する問題を取り上げましたが、同じ二次計画法の枠組みを使って、期待リスクの範囲内でリターンを最大化する問題にも容易に応用することができます。
具体的には、目的関数をポートフォリオの期待リターンの最大化に変更し、ポートフォリオのリスク(分散)に関する制約を追加することで、期待リスクの範囲内でリターンを最大化する問題を定式化できます。
このように、二次計画法を用いたポートフォリオ最適化の枠組みは、投資家の目的や制約条件に応じて柔軟に適用できる強力なツールであり、実務上の様々な問題解決に役立てることができます。