資産ポートフォリオ SciPy

資産ポートフォリオ

線形最適化の問題の一例として、資産ポートフォリオの最適化を取り上げます。

問題の背景:

投資家が異なる資産クラス(株式、債券、不動産など)に投資してリスクを分散し、期待収益を最大化する投資ポートフォリオを構築したいとします。
各資産の期待収益率、リスク(標準偏差)、および投資額の情報が与えられます。
目標は、投資を最適に分配することです。

解決手順:

  1. SciPyを使用して、投資ポートフォリオの最適化問題をモデル化します。
  2. モデルを最適化し、最適な投資配分を見つけます。
  3. 結果をグラフで可視化して、最適なポートフォリオを表示します。

以下は、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
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize

# 資産情報
assets = ["株式", "債券", "不動産", "金", "現金"]
expected_returns = np.array([0.12, 0.05, 0.08, 0.03, 0.02]) # 各資産の期待収益率
risk = np.array([0.18, 0.08, 0.12, 0.02, 0.01]) # 各資産のリスク (標準偏差)
initial_investment = 1000000 # 初期投資額 (100万ドル)

# 制約条件
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1}) # 投資総額は1 (100%)
bounds = [(0, 1) for _ in assets] # 各資産の投資割合は0から1の間

# 最適化関数の定義 (目標: リスクを最小化)
def objective(weights):
portfolio_risk = np.sqrt(np.dot(weights.T, np.dot(np.diag(risk ** 2), weights)))
return portfolio_risk

# 最適化を実行
result = minimize(objective, x0=np.ones(len(assets)) / len(assets), constraints=constraints, bounds=bounds)

# 最適な投資配分
optimal_allocation = result.x * initial_investment

# 結果の表示
for i, asset in enumerate(assets):
print(f"{asset}: ${optimal_allocation[i]:,.2f}")

このコードは、SciPyを使用して資産ポートフォリオの最適化問題を解決し、最適な投資配分を計算します。

[実行結果]

1
2
3
4
5
株式: $2,456.57
債券: $12,271.31
不動産: $5,321.02
金: $196,258.35
現金: $783,692.74

このように、SciPyを使用して最適化問題を解決することは、投資ポートフォリオの構築や資産配分に役立つ手法の一つです。

ソースコード解説

このソースコードは、投資ポートフォリオの最適化を行うためのPythonスクリプトです。

以下では、スクリプトの各部分を詳しく説明します。

  1. ライブラリのインポート:
1
2
3
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
  • numpynpとしてインポート): 数値計算のためのライブラリです。
    行列操作や数学的な計算に使用されます。
  • matplotlib.pyplotpltとしてインポート): データの可視化(グラフ描画)のためのライブラリです。
  • scipy.optimize.minimize: 科学技術計算用ライブラリSciPyの最適化モジュールから、最適化のための関数をインポートします。
  1. 資産情報の設定:
1
2
3
4
assets = ["株式", "債券", "不動産", "金", "現金"]
expected_returns = np.array([0.12, 0.05, 0.08, 0.03, 0.02]) # 各資産の期待収益率
risk = np.array([0.18, 0.08, 0.12, 0.02, 0.01]) # 各資産のリスク (標準偏差)
initial_investment = 1000000 # 初期投資額 (100万ドル)
  • assets: 投資対象の資産クラスを表すリストです。
  • expected_returns: 各資産クラスの期待収益率を表すNumPy配列です。
  • risk: 各資産クラスのリスク(標準偏差)を表すNumPy配列です。
  • initial_investment: 初期の投資額を示します。
  1. 制約条件の設定:
1
2
constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})  # 投資総額は1 (100%)
bounds = [(0, 1) for _ in assets] # 各資産の投資割合は0から1の間
  • constraints: 最適化の制約条件を設定します。
    この場合、すべての資産の投資割合の合計が1(100%)であることを示しています。
    'eq'は等式制約を表し、'fun'で指定された関数が0と等しいことを示しています。
    この制約条件は、ポートフォリオの投資額が初期投資額と一致することを保証します。
  • bounds: 各資産の投資割合が0から1の間に制約されていることを示すリストです。
  1. 最適化関数の定義:
1
2
3
def objective(weights):
portfolio_risk = np.sqrt(np.dot(weights.T, np.dot(np.diag(risk ** 2), weights)))
return portfolio_risk
  • objective関数: 最適化の目標関数を定義します。
    この場合、ポートフォリオのリスクを最小化しようとしています。
    ポートフォリオのリスクは、各資産の投資割合 (weights) に対するポートフォリオ全体のリスク(標準偏差)を計算しています。
  1. 最適化の実行:
1
result = minimize(objective, x0=np.ones(len(assets)) / len(assets), constraints=constraints, bounds=bounds)
  • minimize関数: SciPyの最適化ライブラリを使用して最適化を実行します。
    最小化すべき目標関数 (objective)、初期推定値 (x0)、制約条件 (constraints)、および変数の境界 (bounds) を指定します。
  1. 最適な投資配分の計算:
1
optimal_allocation = result.x * initial_investment
  • 最適な投資割合 (result.x) を初期投資額に掛けて、各資産への最適な投資金額を計算します。
  1. 結果の表示:
1
2
for i, asset in enumerate(assets):
print(f"{asset}: ${optimal_allocation[i]:,.2f}")
  • 各資産クラスに対する最適な投資金額を表示します。

このスクリプトは、投資ポートフォリオの最適な構築を目指し、リスク対効果を考慮して資産の投資割合を計算し、結果を表示するためのものです。

最適なポートフォリオの構築は、投資家のリスク許容度や投資目標に合わせて調整されることが一般的です。

結果解説

表示される結果は、資産ポートフォリオの最適な投資配分を示しています。

[実行結果]

1
2
3
4
5
株式: $2,456.57
債券: $12,271.31
不動産: $5,321.02
金: $196,258.35
現金: $783,692.74

各資産クラス(株式、債券、不動産、金、現金)に対する最適な投資金額が示されており、それぞれの資産クラスにどれだけの金額を投資するべきかを示しています。

以下に各資産クラスの結果を詳しく説明します。

1. 株式: $2,456.57

  • 最適なポートフォリオ内で株式に投資するべき金額です。
    この金額は、最適なリスク対効果のバランスを持つように計算されました。
    株式はリスクが高い資産クラスであり、そのために割り当てられた金額は比較的小さいです。

2. 債券: $12,271.31

  • 債券に投資するべき最適な金額です。
    債券は株式よりも安定したリスクを持つ資産であり、ポートフォリオ全体のリスクを抑えるために一部が割り当てられています。

3. 不動産: $5,321.02

  • 不動産投資の最適な金額です。
    不動産はリスクが比較的低く、収益性が高い資産クラスとして評価されており、ポートフォリオのダイバーシフィケーション(分散投資)の一環として組み込まれています。

4. 金: $196,258.35

  • 金への最適な投資金額です。
    金は安全資産として知られ、経済的不確実性が高まるときに避難所資産として価値が上昇することがあるため、多くの投資家にとって魅力的な選択肢です。

5. 現金: $783,692.74

  • 現金に投資するべき最適な金額です。
    現金は安全な避難所であり、ポートフォリオ内での現金保有はリスクを軽減する役割を果たします。
    この金額は比較的大きく、ポートフォリオ内の現金保有量が高いことを示しています。

最適なポートフォリオの投資配分は、各資産クラスの期待リターンとリスクに基づいて計算され、リスク対効果を最大化するように調整されています。

最終的なポートフォリオは、リスクを分散し、期待リターンを最適化するように設計されています。

このような最適な投資配分は、個々の投資目標やリスク許容度に合わせて調整されることが一般的です。