投資組合最佳化
用 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}%)")
更多實作範例
使用 PuLP 求解
from pulp import *
# 定義問題
prob = LpProblem("Constrained Optimization", LpMaximize)
# 決策變數
x = LpVariable("x", 0, 10)
y = LpVariable("y", 0, 10)
# 目標函數
prob += 3*x + 4*y
# 限制條件
prob += 2*x + y <= 8
prob += x + 2*y <= 8
# 求解
prob.solve()
print(f'Status: {LpStatus[prob.status]}')
print(f'x = {value(x)}, y = {value(y)}')
print(f'Objective = {value(prob.objective)}')
應用場景
- 資源分配:在有限預算下最大化產出
- 排程問題:最小化工廠閒置時間
- 投資組合:在風險限制下最大化報酬
まとめ
- ILP は線形計画法に整数制約を加えたもの
- 分枝限定法 が ILP の主要な解法
- PuLP は Python で ILP を解くためのライブラリ
- 実際の問題では、問題の規模が大きくなると求解時間が急増する
投資組合最佳化的實務限制
Markowitz 的均值-變異數模型是理論基礎,但真實世界的投資有更多限制。這章示範了如何在 ILP 中加入各種實務條件。
真實世界的投資限制
| 限制 | 為什麼需要 | ILP 怎麼加 |
|:----|:---------|:---------|
| 最低投資額 | 券商有最低下單限制 | w_i ≥ min_i × selected_i |
| 分散限制 | 避免太過集中 | sum(selected_i) ≥ 3 |
| 風險上限 | 符合投資人的風險承受度 | Σ σ_i × w_i ≤ max_risk |
| 做空限制 | 散戶通常不能放空 | w_i ≥ 0 |
為什麼用 ILP?
Excel 的 Solver 或簡單公式無法處理「至少投資 3 個資產」、「如果投資台積電就不能低於 100 萬」這類邏輯限制。ILP 的二元變數讓你可以模型化這些實務條件。
課程總結
這堂約束規劃課從資源分配、供應鏈網路到投資組合最佳化——你學會了用 ILP/CP-SAT 解決真實世界的商業問題。