投資組合最佳化

用 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 解決真實世界的商業問題。

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!