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

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

CVXPYを使用して、現実的な最適化問題を解くための一例として、ポートフォリオ最適化問題を考えてみましょう。

この問題は、投資家が複数の資産間でリスクを最小化しつつ、その資産の投資額を最大化する問題です。

以下に、この問題をCVXPYを使用して解くためのPythonコードを示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

# 投資額の予算
budget = 1000

# 各資産のリターン
returns = np.array([0.1, 0.15, 0.2, 0.25, 0.3])

# 各資産のリスク
risks = np.array([0.05, 0.1, 0.15, 0.2, 0.25])

# 投資額の変数を定義
x = cp.Variable(len(returns))

# 最適化問題を定義
objective = cp.Minimize(0.5 * cp.quad_form(x, np.diag(risks)))
constraints = [cp.sum(x) == budget, x >= 0]
problem = cp.Problem(objective, constraints)

# 最適化問題を解く
problem.solve()

# 投資額の結果を出力
print("Investment amounts:", x.value)

# 投資額の結果をグラフ化
plt.bar(range(len(returns)), x.value)
plt.xlabel('Asset')
plt.ylabel('Investment amount')
plt.show()

このコードでは、まず投資額の予算と各資産のリターンとリスクを定義しています。

そして、投資額の変数をCVXPYの変数として定義し、最適化問題を設定しています。

最適化問題は、リスクを最小化しつつ、予算を超えないようにすることを目指しています。

最適化問題を解くと、各資産に投資する量が出力されます。

これをグラフ化すると、どの資産にどれだけ投資すべきかが一目瞭然にわかります。

ソースコード解説

このPythonスクリプトは、CVXPYを使用してポートフォリオ最適化問題を解くものです。

ポートフォリオ最適化は、複数の資産間でリスクを最小化しつつ、その資産の投資額を最大化する問題です。

このスクリプトは、各資産のリターンとリスク、そして投資額の予算を指定し、その情報をもとに最適な投資組み合わせを求めています。

まず、以下の行で投資額の予算各資産のリターンリスクを定義しています。

1
2
3
4
5
6
7
8
# 投資額の予算
budget = 1000

# 各資産のリターン
returns = np.array([0.1, 0.15, 0.2, 0.25, 0.3])

# 各資産のリスク
risks = np.array([0.05, 0.1, 0.15, 0.2, 0.25])

次に、以下の行で投資額の変数を定義しています。

ここでは、各資産に投資する量を表す変数を、CVXPYの変数として定義しています。

1
2
# 投資額の変数を定義
x = cp.Variable(len(returns))

そして、以下の行で最適化問題を定義しています。

ここでは、リスクを最小化しつつ、予算を超えないようにするための最適化問題を設定しています。

1
2
3
4
# 最適化問題を定義
objective = cp.Minimize(0.5 * cp.quad_form(x, np.diag(risks)))
constraints = [cp.sum(x) == budget, x >= 0]
problem = cp.Problem(objective, constraints)

最適化問題を解くためには、以下の行でproblem.solve()を呼び出しています。

1
2
# 最適化問題を解く
problem.solve()

最適化問題を解くと、各資産に投資する量が得られます。

これを以下の行で出力しています。

1
2
# 投資額の結果を出力
print("Investment amounts:", x.value)

最後に、以下の行で投資額の結果をグラフ化しています。

1
2
3
4
5
# 投資額の結果をグラフ化
plt.bar(range(len(returns)), x.value)
plt.xlabel('Asset')
plt.ylabel('Investment amount')
plt.show()

plt.bar()関数は、バーチャートを作成するための関数で、第一引数にx軸のデータ、第二引数にy軸のデータを指定します。

この場合、x軸のデータは資産の番号(range(len(returns)))、y軸のデータは投資額(x.value)を表しています。

plt.xlabel()plt.ylabel()関数は、それぞれx軸とy軸にラベルを設定するための関数です。

この場合、x軸には’Asset’、y軸には’Investment amount’というラベルを設定しています。

最後に、plt.show()関数を呼び出すことで、作成したバーチャートを表示します。

この関数を呼び出すと、新たなウィンドウが開き、作成したバーチャートが表示されます。

結果解説

PythonのCVXPYを使用して、ポートフォリオ最適化問題を解いた結果として得られるのは、各資産に投資する量です。

これは、リスクを最小化しつつ、投資額の予算を超えないようにするための最適な投資組み合わせを表しています。

具体的には、以下のような出力が得られます。

1
Investment amounts: [437.95620438 218.97810219 145.98540146 109.48905109  87.59124088]

これは、5つの資産それぞれに対して投資する量を示しています。

この結果をグラフ化すると、以下のようなバーグラフが得られます。

このグラフは、各資産に投資する量を表しています。

x軸は資産の番号を、y軸は投資額を示しています。

各バーの高さは、対応する資産に投資する量を表しています。

このグラフを見ると、どの資産にどれだけ投資すべきかが一目瞭然にわかります。