ポートフォリオ最適化 PuLP

問題

2つの投資先があり、投資先1の期待リターンは10%、リスクが5%、投資先2の期待リターンは15%、リスクが8%とします。

また、ポートフォリオの全体的なリスクは6%未満にしたいと考えています。


この2つの投資先に関して、最適なポートフォリオを計算してください。

解き方・ソースコード

PythonのPuLPライブラリを使用してこの問題を解いてみます。

[Google Colaboratory]

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
# 必要なライブラリをインポートする
import pulp

# 投資先とそれぞれの期待リターンとリスクを定義する
assets = ['Asset 1', 'Asset 2']
returns = {'Asset 1': 0.1, 'Asset 2': 0.15}
risks = {'Asset 1': 0.05, 'Asset 2': 0.08}

# 最適化問題を定義する
prob = pulp.LpProblem('Portfolio Optimization', pulp.LpMaximize)

# 投資先の割合を決定する変数を作成する
weights = pulp.LpVariable.dicts('Weight', assets, lowBound=0, upBound=1)

# 目的関数を設定する
prob += pulp.lpSum([weights[a] * returns[a] for a in assets])

# 制約条件を設定する
prob += pulp.lpSum([weights[a] for a in assets]) == 1
prob += pulp.lpSum([weights[a] * risks[a] for a in assets]) <= 0.06

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

# 結果を表示する
print('Optimal Portfolio:')
for a in assets:
print('{}: {:.2%}'.format(a, weights[a].value()))

print('Expected Return: {:.2%}'.format(pulp.value(prob.objective)))
print('Risk: {:.2%}'.format(pulp.lpSum([weights[a] * risks[a] for a in assets]).value()))

このソースコードでは、投資先の割合を決定する変数を作成し、目的関数を最大化するように設定し、制約条件を設定しています。

最後に、prob.solve()を呼び出して問題を解決し、結果を表示しています。

[実行結果]

Optimal Portfolio:

Asset 1: 66.67%

Asset 2: 33.33%

Expected Return: 11.67%

Risk: 6.00%

投資先1に66.67%、投資先2に33.33%を割り当てると最適なポートフォリオとなり、期待リターンは11.67%、リスクは6.00%であることが確認できました。