ポートフォリオ最適化問題 CVXPY

ポートフォリオ最適化問題

CVXPYを使用してポートフォリオ最適化問題を解く基本的なPythonコードを示します。

この例では、3つの異なる資産に対する投資の最適な割合を見つけることを目指しています。

まず、必要なライブラリをインポートします。

1
2
3
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

次に、各資産のリターンとリスク(ここでは標準偏差)を表すデータを作成します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 資産のリターン
returns = np.array([0.1, 0.2, 0.15])

# 資産のリスク(標準偏差)
risks = np.array([0.05, 0.1, 0.08])

# 資産間の相関係数
correlation = np.array([
[1, 0.2, 0.5],
[0.2, 1, 0.3],
[0.5, 0.3, 1]
])

# 共分散行列を計算
cov_matrix = np.outer(risks, risks) * correlation

次に、CVXPYを使用して最適化問題を定義します。

ここでは、リターンを最大化し、リスク(ここではポートフォリオの標準偏差)を制約としています。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 投資の割合を表す変数
weights = cp.Variable(len(returns))

# リターンを最大化する問題を定義
objective = cp.Maximize(weights @ returns)

# 制約条件を定義
constraints = [cp.sum(weights) == 1,
weights >= 0,
cp.quad_form(weights, cov_matrix) <= 0.05**2]

# 問題を定義
problem = cp.Problem(objective, constraints)

最後に、問題を解き、最適な投資の割合を表示します。

1
2
3
4
5
# 問題を解く
problem.solve()

# 最適な投資の割合を表示
print(weights.value)

このコードは、与えられたリターンとリスクに基づいて、3つの資産に対する最適な投資の割合を計算します。

制約条件は、全ての投資の割合の合計が1(つまり、全ての資産に対する投資の割合)であることと、ポートフォリオのリスクが特定の値以下であることを保証します。

最後に、各資産の投資の割合をグラフ化します。

1
2
3
4
plt.bar(range(len(weights.value)), weights.value)
plt.xlabel('Assets')
plt.ylabel('Investment proportion')
plt.show()

このグラフは、各資産に対する最適な投資の割合を視覚的に示しています。

[実行結果]