効率的フロンティア最適化 PuLP

効率的フロンティア最適化

効率的フロンティアの最適化問題を定義します。

この問題では、与えられたリスクレベルで最大のリターンを達成する投資ポートフォリオを見つけることが目的です。

以下に示すように、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 np
import matplotlib.pyplot as plt

# 各投資商品のリターンとリスク
returns = {'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()
[実行結果]

このグラフは、リスクとリターンのトレードオフを視覚的に示しています。

効率的フロンティアは、与えられたリスクレベルで達成可能な最大のリターンを示しています。