投資組合最佳化
用 ILP 做資產配置
import pulp
import numpy as np
# === 資產資料 ===
assets = ["台積電", "聯發科", "台達電", "中華電", "富邦金"]
expected_return = [0.15, 0.12, 0.10, 0.04, 0.08] # 預期年報酬
risk_score = [0.35, 0.30, 0.25, 0.10, 0.20] # 風險分數(標準差)
min_investment = [10, 5, 5, 10, 5] # 最低投資額(萬)
# 建立問題
prob = pulp.LpProblem("投資組合最佳化", pulp.LpMaximize)
# 變數:每個資產的投資比例(0-1 連續變數)
weights = {a: pulp.LpVariable(f"w_{a}", lowBound=0, upBound=1) for a in assets}
# 二元變數:是否投資該資產
selected = {a: pulp.LpVariable(f"sel_{a}", cat="Binary") for a in assets}
# 目標:最大化預期報酬
prob += pulp.lpSum(expected_return[i] * weights[assets[i]] for i in range(len(assets)))
# 限制 1:總比例為 1
prob += pulp.lpSum([weights[a] for a in assets]) == 1
# 限制 2:風險上限
max_risk = 0.25
prob += pulp.lpSum(risk_score[i] * weights[assets[i]] for i in range(len(assets))) <= max_risk
# 限制 3:如果投資某資產,比例不能低於最低要求
budget = 1000 # 總預算 1000 萬
for i, a in enumerate(assets):
min_ratio = min_investment[i] / budget
prob += weights[a] >= min_ratio * selected[a]
prob += weights[a] <= selected[a] # 沒選中就不能投資
# 限制 4:至少要投資 3 個資產
prob += pulp.lpSum([selected[a] for a in assets]) >= 3
# 求解
prob.solve()
print(f"\n=== 投資組合結果 ===")
print(f"求解狀態: {pulp.LpStatus[prob.status]}")
print(f"預期報酬率: {pulp.value(prob.objective)*100:.2f}%")
print(f"組合風險: {max_risk*100:.0f}% (上限)")
print(f"\n資產配置:")
for i, a in enumerate(assets):
w = weights[a].value()
if w and w > 0.001:
print(f" {a}: {w*100:.1f}% (報酬 {expected_return[i]*100:.0f}%, 風險 {risk_score[i]*100:.0f}%)")