業界別最適化Example集: ポートフォリオ最適化問題 (金融)
nAG数値計算ライブラリ > 業界別最適化Example集 > ポートフォリオ最適化問題 (金融)

Keyword: 金融工学, ポートフォリオ最適化, リスク管理, 投資戦略, QP

金融分野の最適化問題:ポートフォリオ最適化

問題の概要

farming

ポートフォリオ最適化は、金融工学における重要な問題の一つです。この問題は、投資家が所与のリスク水準の下で期待リターンを最大化するか、または所与の期待リターンの下でリスクを最小化するように、資産への投資配分を決定することを目的としています。

ポートフォリオ最適化を行うことで、投資家はリスクとリターンのバランスを取りながら、自身の投資目的に合致したポートフォリオを構築することができます。この問題を解決することは、効率的な資産運用や投資戦略の立案に役立ちます。

主要な制約条件としては、投資比率の合計が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%とします。

問題の定式化

パラメータ

パラメータ 説明
μi 資産 i の期待リターン 上記の表を参照
σi 資産 i のリスク(標準偏差) 上記の表を参照
ρij 資産 i と資産 j の相関係数 上記の表を参照
rtarget 目標とする期待リターン 0.06

決定変数

変数 説明 範囲
wi 資産 i への投資比率 liwiui

ここで、liui は、それぞれ資産 i への投資比率の下限と上限を表します。

目的関数

目的
ポートフォリオの分散を最小化 mini=1nj=1nwiwjσiσjρij

制約条件

制約 説明
投資比率の合計 i=1nwi=1 投資比率の合計は1でなければならない
目標期待リターン i=1nwiμi=rtarget ポートフォリオの期待リターンは目標値と等しくなければならない
投資比率の下限 wili,i 各資産への投資比率は下限以上でなければならない
投資比率の上限 wiui,i 各資産への投資比率は上限以下でなければならない

ここで、liui は、それぞれ資産 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%になります。

まとめ

ここでは、金融分野におけるポートフォリオ最適化問題について、二次計画法を用いた定式化とその解法を示しました。今回は、目標とする期待リターンを達成しつつ、ポートフォリオのリスクを最小化する問題を取り上げましたが、同じ二次計画法の枠組みを使って、期待リスクの範囲内でリターンを最大化する問題にも容易に応用することができます。

具体的には、目的関数をポートフォリオの期待リターンの最大化に変更し、ポートフォリオのリスク(分散)に関する制約を追加することで、期待リスクの範囲内でリターンを最大化する問題を定式化できます。

このように、二次計画法を用いたポートフォリオ最適化の枠組みは、投資家の目的や制約条件に応じて柔軟に適用できる強力なツールであり、実務上の様々な問題解決に役立てることができます。

参考文献


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks