効率的フロンティア最適化
効率的フロンティア の最適化問題を定義します。
この問題では、与えられたリスクレベルで最大のリターンを達成する投資ポートフォリオ を見つけることが目的です。
以下に示すように、PythonのPuLPライブラリを使用してこの問題を解くことができます。
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 33 from pulp import *import numpy as npimport matplotlib.pyplot as pltreturns = {'A' : 0.1 , 'B' : 0.12 , 'C' : 0.10 , 'D' : 0.07 } risks = {'A' : 0.05 , 'B' : 0.07 , 'C' : 0.06 , 'D' : 0.03 } assets = list (returns.keys()) risk_limit = 0.05 prob = LpProblem("Efficient Frontier" , LpMaximize) x = LpVariable.dicts("x" , assets, 0 ) prob += lpSum([returns[i]*x[i] for i in assets]) prob += lpSum([risks[i]*x[i] for i in assets]) <= risk_limit prob += lpSum([x[i] for i in assets]) == 1 prob.solve() for i in assets: print (f"Investment in asset {i} : {x[i].varValue} " )
このコードは、与えられたリスクレベルで最大のリターンを達成する投資ポートフォリオ を見つけます。
結果は、各投資商品に対する投資比率として表示されます。
[実行結果]
Investment in asset A: 1.0
Investment in asset B: 0.0
Investment in asset C: 0.0
Investment in asset D: 0.0
グラフ化
次に、効率的フロンティア をグラフ化します。
これは、可能なすべての投資ポートフォリオのリスクとリターンをプロットしたものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 risks_list = np.linspace(0.01 , 0.1 , 100 ) returns_list = [] for risk_limit in risks_list: prob = LpProblem("Efficient Frontier" , LpMaximize) x = LpVariable.dicts("x" , assets, 0 ) prob += lpSum([returns[i]*x[i] for i in assets]) prob += lpSum([risks[i]*x[i] for i in assets]) <= risk_limit prob += lpSum([x[i] for i in assets]) == 1 prob.solve() returns_list.append(value(prob.objective)) plt.plot(risks_list, returns_list) plt.xlabel('Risk' ) plt.ylabel('Return' ) plt.title('Efficient Frontier' ) plt.show()
[実行結果]
このグラフは、リスクとリターンのトレードオフを視覚的に示しています。
効率的フロンティア は、与えられたリスクレベルで達成可能な最大のリターンを示しています。