ポートフォリオ最適化問題
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 cpimport numpy as npimport matplotlib.pyplot as pltbudget = 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 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軸は投資額 を示しています。
各バーの高さは、対応する資産に投資する量 を表しています。
このグラフを見ると、どの資産にどれだけ投資すべきかが一目瞭然にわかります。