§01學習重點
- 用一張地圖說出全課十二章的邏輯:橫斷面的監督式學習→時序學習→時序決策,以及各章之間誰依賴誰
- 解釋「感知」與「行動」為什麼是同一個迴圈的兩半:監督式學習在迴圈的上半圈做預測,強化學習在下半圈做決策
- 白話說出資訊瓶頸原理:壓縮輸入時保留「對決策有用」的資訊、丟掉其他,並親手在玩具資料上重現「壓縮反而泛化更好」
- 說明「特徵選擇應該服務長期目標」對傳統 alpha research 兩階段流程的顛覆,用實驗展示 IC 排名與淨 Sharpe 排名的翻轉
- 描述「市場本身是一個 agent」的反向建模思路:用強化學習的語言建市場動態模型,以及物理啟發方法(位能景觀、非平衡動力學)的直覺
- 用 Langevin 方程與雙井位能理解「常態與危機是兩個谷、崩盤是翻過山脊」,並以模擬估計翻谷機率對噪音與山脊高度的敏感性
- 回顧貫穿全課的三道限界——資料非平穩、訊噪比極低、反身性——並依自己的目標選出下一步路線:工程實作、量化研究或學術前沿
§02課程內容
一、三部曲走完之後:全課地圖
十二章走到最後一章,先把來時路攤開。這門課的骨架是三部曲,三部之間不是並列,而是一路「加維度」。
第一部(第 1–5 章):橫斷面的監督式學習。 資料被當成「同一時刻的一批樣本」:一批股票的特徵與下期報酬、一批貸款的屬性與違約與否。第 1 章立了全課的世界觀——統計建模與機器學習兩種文化、偏差–方差取捨、熵與交叉熵;第 2 章把「參數是待估的定值」升級成「參數本身有分布」的貝葉斯思維;第 3 章把貝葉斯思維推到迴歸與高斯過程,讓模型輸出自帶不確定性;第 4 章交付主力武器前饋神經網路與馴服它的正則化紀律;第 5 章直面金融業最在意的問題——這個模型憑什麼被信任——給出可解釋性工具。這一部的隱含假設是:樣本之間可以交換順序,時間不進場。
第二部(第 6–8 章):時序學習。 時間進場了。金融資料最不客氣的性質——自相關、波動聚集、制度切換——都住在時間軸上。第 6 章鋪計量地基:平穩性、AR/MA、波動模型;第 7 章引入隱狀態的語言,用隱馬可夫模型與粒子濾波追蹤「看不見的市場狀態」;第 8 章把神經網路接上時間軸——RNN、CNN 與自編碼器——並揭示它們與古典計量模型的家族關係。這一部的主角仍然是預測:模型看著世界,但不動手。
第三部(第 9–12 章):時序決策。 從「預測會怎樣」跳到「該怎麼做」。第 9 章建立馬可夫決策過程與價值函數的框架,並以最適下單出清為貫穿例;第 10 章把它開進金融主場——選擇權對沖與定價、動態投資組合配置;第 11 章反過來問:看著一個交易者的行為,能不能反推他心裡的目標函數(逆強化學習)?而本章要做的,是站在第三部的終點往前看:監督式學習與強化學習這兩套看似獨立的機器,其實是同一個迴圈的兩半——這是前沿研究正在收攏的方向。
第 1 章曾用一張「資料頻率×任務性質」的應用地圖告訴你:你的問題落在哪一格,決定了該用哪一章的武器。現在你把武器庫走完了,這張知識地圖是同一件事的另一面:不是「問題怎麼分類」,而是「工具怎麼相互依賴」。接下來的問題是:這些工具會往哪裡演化?
二、感知與行動:同一個迴圈的兩半
回想全課的分工:監督式學習負責「預測」,強化學習負責「決策」。教科書把它們放在不同章節、用不同的數學語言,久了容易以為是兩種動物。前沿研究的第一個大主題,就是把這道牆拆掉:預測與決策是同一個「感知–行動迴圈」的上下兩半。
迴圈長這樣。agent 從市場觀察到原始資料(報價、成交、新聞流),把它壓縮成內部表徵——這是感知,監督式學習的地盤:特徵工程、降維、預測模型全在這半圈。接著 agent 依表徵選擇行動——下單、調整部位、對沖——這是行動,強化學習的地盤。行動改變了世界(部位改變、價格被推動),新的世界產生新的觀察,迴圈回到起點。監督式學習是「把觀察變成有用的信念」,強化學習是「把信念變成有利的行動」,切開只是教學方便。
比喻: 學開車的人不會先修完三年「路況辨識學」、拿到辨識學位再碰方向盤。眼睛看路(感知)與手打方向盤(行動)從第一天起就是同一個迴圈:看到彎道所以轉向,轉向之後視野改變、又看到新的路況。而且眼睛很挑食——它只盯對開車有用的東西(車距、號誌),自動忽略路邊招牌的字體。感知從一開始就是為行動服務的,這正是「統一」的核心直覺。
這個統一觀不是哲學口號,它有數學骨架,而骨架來自你在第 1 章就見過的老朋友:資訊理論。把「感知該保留什麼」與「行動該最大化什麼」寫進同一條目標函數,兩半圈就真的縫起來了。強化學習這邊的縫法,是在第 9 章「最大化期望累積獎勵」的目標裡加一項策略的熵:
逐項拆解:第一項是熟悉的期望累積獎勵——\(r_t\) 是每期獎勵、\(\gamma\) 是折現因子、\(\pi\) 是策略;第二項的 \(H(\pi(\cdot\mid s_t))\) 是策略在狀態 \(s_t\) 的熵——策略越「猶豫」(各行動機率越平均)熵越高;\(\beta\) 控制兩項的相對重量,可以讀成「理性程度」:\(\beta\to\infty\) 時熵項消失,agent 是教科書式的完全理性最佳化者;\(\beta\) 有限時,agent 願意為了保留隨機性犧牲一點獎勵。為什麼要故意保留隨機性?三個理由:探索(第 9 章的探索–利用兩難有了原則性的解法)、穩健(不把所有籌碼壓在對環境模型的單一估計上)、以及建模真實市場的參與者——真人交易者處理資訊的頻寬有限,「有限理性」恰好由有限的 \(\beta\) 刻畫。這條路線在文獻裡叫最大熵強化學習,思想源頭之一是 Ortega 與 Braun 把決策理論寫成熱力學的工作:資訊處理是有成本的,理性是用資訊換獎勵的交易。
三、資訊瓶頸:只保留對決策有用的資訊
感知這半圈也有自己的資訊理論判準,叫資訊瓶頸(information bottleneck)。問題設定:輸入 \(X\)(高維市場資料)要壓縮成表徵 \(Z\)(低維特徵),下游要預測的目標是 \(Y\)(報酬、行動的價值)。壓縮就有取捨:丟太少,雜訊跟著進來;丟太多,訊號也沒了。Tishby、Pereira 與 Bialek 把這個取捨寫成一條乾淨的目標函數:
逐項拆解:\(I(X;Z)\) 是 \(X\) 與 \(Z\) 之間的互資訊——衡量表徵記住了多少輸入,這一項要最小化,它是「壓縮的力道」;\(I(Z;Y)\) 是表徵與目標之間的互資訊——衡量表徵對預測目標還有多少用,前面掛負號等於要最大化,它是「保留的訊號」;\(\beta\) 是兩股力量的匯率——你願意為了多留一位元對 \(Y\) 的資訊,付出幾位元對 \(X\) 的記憶。互資訊本身是第 1 章熵的直系後代:\(I(A;B) = H(A) - H(A \mid B)\),「知道 B 之後,A 的不確定性少了多少」。整條式子一句話:好的表徵不是保真度最高的表徵,而是對任務最省話的表徵。
比喻: 出國打包行李箱。你不是把衣櫃裡「最貴的東西」塞進去,而是看目的地決定——去北海道就帶羽絨衣、把昂貴的西裝留在家。行李箱的容量是 \(I(X;Z)\) 的上限,「這趟旅程用得到」是 \(I(Z;Y)\)。打包高手與新手的差別,從來不是箱子大小,而是他們心裡有沒有那張目的地的行程表。
金融場景裡「任務盲的壓縮」隨處可見:對幾百檔股票的報酬矩陣做主成分分析、留變異數最大的前幾個因子,就是標準操作。但變異數大不等於對你的目標有用——市場共同因子音量最大,對「選出誰跑贏誰」卻常常一毛錢資訊都沒有。跑個實驗,讓兩種壓縮哲學同台:
import numpy as np
rng = np.random.default_rng(12)
# 模擬 4000 個交易日:8 個特徵,其中 6 個被同一個「大盤共同因子」灌爆變異數,
# 真正能預測下期報酬的只有 2 個小變異數的訊號特徵
n_tr, n_te = 2000, 2000
def make_data(n):
g = rng.normal(size=n) # 共同因子(音量最大、對預測沒用)
Xn = 2.0 * g[:, None] + 0.8 * rng.normal(size=(n, 6)) # 6 個噪音特徵
Xs = 0.6 * rng.normal(size=(n, 2)) # 2 個訊號特徵(音量小)
X = np.hstack([Xn, Xs])
y = 0.9 * Xs[:, 0] + 0.6 * Xs[:, 1] + rng.normal(0.0, 0.8, n)
return X, y
X_tr, y_tr = make_data(n_tr)
X_te, y_te = make_data(n_te)
def ols_r2(Z_tr, Z_te):
A = np.hstack([Z_tr, np.ones((len(Z_tr), 1))])
w = np.linalg.lstsq(A, y_tr, rcond=None)[0]
pred = np.hstack([Z_te, np.ones((len(Z_te), 1))]) @ w
return 1.0 - np.mean((y_te - pred) ** 2) / np.var(y_te)
# 壓縮法一(任務盲):PCA 留前 k 個主成分——只看「哪裡變異數大」
mu = X_tr.mean(axis=0)
_, _, Vt = np.linalg.svd(X_tr - mu, full_matrices=False)
# 壓縮法二(任務覺察):按「與 y 的相關強度」排序留前 k 個特徵
rank = np.argsort(-np.abs(np.corrcoef(X_tr.T, y_tr)[-1, :-1]))
print(" k | PCA壓縮 R2 | 任務覺察 R2")
for k in (1, 2, 3, 4, 6, 8):
r2_pca = ols_r2((X_tr - mu) @ Vt[:k].T, (X_te - mu) @ Vt[:k].T)
r2_task = ols_r2(X_tr[:, rank[:k]], X_te[:, rank[:k]])
print(f" {k} | {r2_pca: .4f} | {r2_task: .4f}")
# 輸出:
# k | PCA壓縮 R2 | 任務覺察 R2
# 1 | -0.0018 | 0.2557
# 2 | -0.0058 | 0.4002
# 3 | -0.0056 | 0.3991
# 4 | -0.0052 | 0.3990
# 6 | -0.0122 | 0.3990
# 8 | 0.3950 | 0.3950結果值得盯著看三秒。任務盲的 PCA 壓縮到 6 維,樣本外 R² 還在零附近打轉——它忠實保留了音量最大的方向,偏偏訊號不住在那裡,直到 8 維全收才追上。任務覺察的壓縮 2 維就到 0.4002。更妙的是:2 維的表現比用滿 8 維(0.3950)還好——多餘的 6 個噪音維度不是中性的行李,每個都帶著要估的參數、每個參數都會吸收雜訊。壓縮不只是省空間,它本身就是正則化:這正是資訊瓶頸「最小化 \(I(X;Z)\)」那一項在做的事,與第 4 章用正則化對抗過擬合是同一枚硬幣的兩面。
四、當特徵選擇服務長期目標:alpha research 的顛覆
上一節的「任務覺察」還停在預測層:按「與下期報酬的相關」選特徵。前沿的主張更激進一步——連預測力都不該是最終判準,特徵選擇應該直接服務長期目標。
先看業界現況。傳統 alpha research 是兩階段流水線:第一階段,研究員各自挖「因子」,用 IC(因子值與未來報酬的相關係數)之類的預測力指標打分、排名、淘汰;第二階段,把活下來的因子交給組合建構與執行團隊,加上風險模型與交易成本去優化部位。這條流水線的隱含假設是:預測力好的因子,組合起來用也好。感知–行動統一的視角戳破了它——因子的價值不取決於它預測得多準,而取決於「按它行動、扣掉行動的代價之後,長期攢下多少獎勵」。預測是半圈,另外半圈的帳(換手率、市場衝擊、與現有部位的互動)在第一階段完全沒人記。
比喻: 餐廳採購自己上市場,按「食材品質」打分採買——和牛 A5、頂級海膽,樣樣是冠軍。主廚開菜單卻叫苦:本店是平價定食,和牛再好也上不了桌,成本先吃垮你。換成主廚先開菜單、採購按菜單買,同一個市場、同一筆預算,端出來的是完全不同的一桌菜。兩階段流水線是「採購說了算」,端到端是「菜單說了算」——因子研究員是採購,長期目標才是菜單。
把這件事做成最小實驗。兩個候選訊號:一個預測力強但天天翻面(換手率高),一個預測力平庸但部位穩定。兩階段流程按 IC 選,端到端按「扣成本後的長期 Sharpe」選——看排名會不會翻轉:
import numpy as np
rng = np.random.default_rng(2026)
T = 5000 # 約 20 年的日資料
def ar1(phi, n):
x = np.zeros(n)
for t in range(1, n):
x[t] = phi * x[t - 1] + np.sqrt(1 - phi ** 2) * rng.normal()
return x
f_fast = ar1(0.05, T) # 快訊號:預測力強、但天天翻面
f_slow = ar1(0.97, T) # 慢訊號:預測力弱、但部位穩定
ret = (0.10 * f_fast[:-1] + 0.05 * f_slow[:-1]
+ rng.normal(0.0, 1.0, T - 1)) * 0.01 # 下期報酬(日波動約 1%)
def evaluate(sig, cost_bp):
pos = np.sign(sig[:-1]) # 依訊號方向持 ±1 單位部位
gross = pos * ret
turn = np.abs(np.diff(np.concatenate([[0.0], pos])))
net = gross - cost_bp / 1e4 * turn # 每次翻面付出 cost_bp 基點
ann = np.sqrt(252)
ic = np.corrcoef(sig[:-1], ret)[0, 1]
return (ic, gross.mean() / gross.std() * ann,
net.mean() / net.std() * ann, turn.mean())
for name, sig in (("快訊號 f_fast", f_fast), ("慢訊號 f_slow", f_slow)):
ic, s_gross, s_net, tv = evaluate(sig, cost_bp=5.0)
print(f"{name}|IC {ic: .3f}|毛Sharpe {s_gross: .2f}|"
f"淨Sharpe(5bp) {s_net: .2f}|日換手 {tv:.2f}")
# 輸出:
# 快訊號 f_fast|IC 0.092|毛Sharpe 1.21|淨Sharpe(5bp) 0.44|日換手 0.96
# 慢訊號 f_slow|IC 0.048|毛Sharpe 0.74|淨Sharpe(5bp) 0.62|日換手 0.15翻轉發生了。按第一階段的所有指標——IC 0.092 對 0.048、毛 Sharpe 1.21 對 0.74——快訊號都是輾壓級冠軍,兩階段流程會毫不猶豫選它。但它平均每天翻面 0.96 次,每次翻面付 5 個基點,長期目標的帳一記:淨 Sharpe 只剩 0.44,反而輸給換手率僅 0.15 的慢訊號(0.62)。選特徵的判準從「預測得準」換成「行動之後淨賺」,最優解就換人。這不是成本調整的小修小補——成本只是「行動有後果」最簡單的一種;部位互動、市場衝擊、風險擠佔,每一項都會讓預測排名與行動排名進一步脫鉤。前沿版本的做法,是把特徵選擇整個搬進強化學習的目標函數裡(例如以第 2 章的貝葉斯語言給每個特徵一個「入選機率」,與策略一起優化),讓「該看什麼」與「該做什麼」在同一個迴圈裡互相塑造——這正是感知–行動統一在量化投資流程上的落地形態。附帶一提,統一的另一個方向——讓價值函數與規劃模型端到端一起學——在遊戲領域已經開花結果(predictron、MuZero 一系工作),金融版本仍是開放題。
五、市場本身是一個 agent:反向建模
第二個大主題把望遠鏡掉頭。前面十一章的預設姿勢是:我是 agent,市場是環境。現在反過來問——如果把市場整體當成一個 agent 呢?幾百萬名參與者各自最佳化,聚合成的價格動態,會不會像「一個超大 agent 在最佳化某個目標」?如果會,強化學習的語言(狀態、行動、獎勵、策略)就能反過來當市場動態模型用:觀察市場的「行為」(價格與流量),用第 11 章逆強化學習的思路反推它隱含的目標函數,再用推出來的目標去模擬市場接下來的動態。Halperin 與 Feldshteyn 的市場自學習模型走的正是這條路:市場被建成一個有限理性、帶資訊處理成本的集體 agent,訊號、衝擊與最適交易從同一條自由能目標裡長出來。
比喻: 高速公路上的幽靈塞車。沒有事故、沒有施工,車流卻無端出現一段走走停停的「震波」往後傳。每個駕駛都只做局部最適化——跟前車、踩剎車——沒有任何人「決定」塞車,但塞車作為集體現象真實存在,而且有自己的動力學:密度低時擾動自己消散,密度過了臨界值,一腳剎車就放大成震波。把每個駕駛換成交易者、把車距換成報價,你就有了「市場作為一個 agent」的畫面:個體理性,集體湧現出個體層面不存在的狀態——包括崩盤。
集體動態怎麼寫成數學?物理學家的標準語言是 Langevin 方程——一顆粒子在位能地形上滾動、同時被隨機力踢來踢去:
逐項拆解:\(x_t\) 是系統狀態(想成對數價格或偏離均衡的程度);\(U(x)\) 是位能景觀——一張地形圖,\(U'(x_t)\) 是地形在腳下的坡度,負號表示系統永遠被推向下坡(谷底=均衡點);\(\sigma\,dW_t\) 是隨機踢腳——新聞、訂單流、雜訊交易,\(\sigma\) 是踢腳的力道。這個框架的第一個驚喜是古典金融是它的特例:幾何布朗運動(GBM)——選擇權定價的地基——在對數座標下就是一條位能地形平坦(只剩固定漂移)的 Langevin 方程。地形平坦,所以 GBM 的世界裡沒有「均衡位置」,價格漂到哪算哪,也永遠不會「崩」——它根本沒有可以崩離的狀態。
Halperin 與 Dixon 的「量子均衡–失衡」(QED)模型的核心動作,就是把市場摩擦與資金流入流出這些非線性項加回漂移,位能地形因此彎出兩個谷:右谷是常態市場,左谷是危機狀態,中間隔一道山脊。系統平時在右谷附近晃(均衡附近的小波動,看起來就像普通的均值回歸),但隨機踢腳偶爾連續踢對方向,系統翻過山脊、滑進左谷——崩盤與違約不再是外生的「黑天鵝參數」,而是動力學的內生事件。翻谷的機率可以算,對噪音力道極度敏感。模擬看看:
import numpy as np
rng = np.random.default_rng(88)
# 雙井位能:U(x) = h (x^2 - 1)^2,兩個谷底在 x = ±1,中間隔一道高度 h 的山脊
h = 1.0
def dU(x): # 位能的斜率(恢復力來源)
return 4.0 * h * x * (x ** 2 - 1.0)
M, years, dt = 2000, 10, 1.0 / 252 # 2000 條路徑、10 年、日頻
steps = int(years / dt)
for sigma in (0.55, 0.75):
x = np.ones(M) # 全部從右谷(常態市場 x=+1)出發
escaped = np.zeros(M, dtype=bool)
first_t = np.full(M, np.nan)
for t in range(steps):
x = x - dU(x) * dt + sigma * np.sqrt(dt) * rng.normal(size=M)
newly = (~escaped) & (x < -0.5) # 翻過山脊、落進左谷(危機狀態)
first_t[newly] = (t + 1) * dt
escaped |= newly
print(f"噪音 σ={sigma}|10 年內翻谷比例 {escaped.mean():.1%}|"
f"翻谷者平均首次時間 {np.nanmean(first_t):.2f} 年")
# 輸出:
# 噪音 σ=0.55|10 年內翻谷比例 1.0%|翻谷者平均首次時間 5.09 年
# 噪音 σ=0.75|10 年內翻谷比例 20.6%|翻谷者平均首次時間 5.13 年噪音力道從 0.55 升到 0.75——不到四成的增幅——十年翻谷機率從 1.0% 暴增到 20.6%,二十倍。這種對參數的指數級敏感是物理裡逃逸問題的標誌性行為,對風險管理的含義很直白:平時的波動統計幾乎不含山脊的資訊。兩條 σ 不同的路徑,在右谷裡晃的樣子難以區分,尾部風險卻差一個量級——只用常態時期資料估計危機機率,正是第 1 章房貸故事的幾何版本。物理啟發方法在這裡的角色是提供一整箱現成工具:逃逸速率的解析近似、非平衡系統的路徑積分、把高維相互作用壓縮成可算形式的張量網路——原書把這些列為金融機器學習可能的下一批進口品,本課點到為止。
六、貫穿全課的三道限界
前沿講得再熱鬧,也要用全課反覆出現的三道限界冷卻一下。它們不是待修的 bug,是這個領域的物理定律。
限界一:資料非平穩。 從第 1 章房貸模型在 2008 年的失準,到第 7 章的制度切換模型,同一個幽靈貫穿全課:你訓練所用的分布,不保證是你將要面對的分布。交叉驗證管不到未來,這是認識論的限制。本章的雙井模型給了這個幽靈一張臉——系統在右谷的資料,天然不含左谷的統計性質——但給它畫像不等於降伏它。
限界二:訊噪比極低。 金融預測的樣本外 R² 以「百分之幾」為單位計量,與影像語音動輒九成的準確率是兩個世界。全課一半的篇幅——第 2、3 章的貝葉斯先驗、第 4 章的正則化、本章的資訊瓶頸——本質上都是同一句話:訊號稀薄時,少學一點反而學得好。誰若向你展示金融資料上的高 R²,第一反應該是查前視偏差,不是敬佩。
限界三:反身性。 模型不是市場的旁觀者。你的大單推動價格(第 9、10 章的市場衝擊)、你的放貸模型改變違約分布(第 1 章)、大家的模型相似則擁擠交易同時平倉互相踩踏。監督式學習從框架上就無法內生處理「預測改變被預測物」,這正是本章感知–行動迴圈的深層動機:行動的後果必須是模型的一級公民。而市場作為 agent 的視角把反身性推到極致——你建模的對象,本身也在學習。
七、從這裡出發:三條路線
課程給了你地圖,接下來看你要去哪裡。三條路線,按「離市場的距離」排序。
路線一:工程實作。 目標是把本課的紀律變成能跑在真實資料上的管線。下一步:把第 1 章的動量訊號分類器或第 6 章的波動模型接上真實市場資料重做一遍,強迫自己面對課堂上被簡化的髒活——除權息調整、停牌與下市股的存活偏差、時間對齊。工具鏈從本課的 numpy 升級到 scikit-learn 與任一回測框架;強化學習實作推薦從 OpenAI 的 Spinning Up 教材入手,它把第 9 章的理論接到能跑的代碼。檢驗標準只有一條:你的回測有沒有騙你——用第 1 章的前視偏差清單逐項自查。
路線二:量化研究。 目標是產生可信的投資研究。下一步:精讀「機器學習×實證資產定價」這一支文獻(第 1 章參考過的 Gu–Kelly–Xiu 是入口),然後把本章第四節的教訓制度化——先寫死評估協定(樣本切分、成本假設、多重檢定的懲罰),再開始跑模型,順序不能反。本章的翻轉實驗值得反覆回味:研究流程的每一個「代理指標」(IC、毛 Sharpe、回測年化)都可能與長期目標脫鉤,而你的職業生涯就建立在識別這些脫鉤上。
路線三:學術前沿。 目標是推進本章開箱的兩大主題。下一步:從本章參考資料的原始論文讀起——資訊瓶頸讀 Tishby 等人的原典,市場動態讀 QED 與市場自學習兩篇——然後挑一篇復現其核心實驗;復現是進入一個領域最誠實的門票。值得盯的開放問題包括:金融版的端到端「預測+規劃」架構(MuZero 的市場版)、資訊瓶頸在非平穩環境下的動態版本、以及把市場自學習模型帶到可證偽的實證檢驗上。這一帶的論文集中在 arXiv 的 q-fin 分區與機器學習會議的金融場次。
八、課程總結
十二章前,這門課從一個問題出發:金融為什麼需要機器學習。現在可以給出全課版本的回答。因為金融資料的規模與維度超出了古典工具的假設(第一部教你在橫斷面上馴服它),因為金融資料活在時間軸上且不肯平穩(第二部教你追蹤它),因為金融的終點不是預測而是決策、而決策會改變世界(第三部教你把後果納入目標)。最後一章告訴你:這三件事正在收攏成一件事——一個在低訊噪、非平穩、會還手的環境裡,用有限資訊頻寬感知並行動的 agent。工具會過時,這個問題形塑不會。剩下的路,用你自己的資料走。
§03原書對照
本章對應原書第十二章〈Frontiers of Machine Learning and Finance〉。特別說明:手上可核的原書素材不含本章正文,以下以主題結構對照方式整理,章節架構與頁碼取自原書草稿目錄(標示 pp.557–579)——(依原書草稿目錄概述,無出版頁碼可核),另附各主題的公開論文錨點供直接查證。原書該章分四節。其一,導論(草稿目錄 p.558),與原書前言的定位一致:從研究者視角綜述前沿,並預告統計物理的多個概念可能成為金融機器學習的下一批研究題目。其二,市場動態、逆強化學習與物理(pp.560–567):依序展開 QED 模型的完整數學、Langevin 方程、GBM 作為 Langevin 方程的特例、QED 的 Langevin 表述,收尾於對金融建模與對機器學習各一小節的啟示——本課第五節只取了「位能景觀+雙井+翻谷」的直覺版並自製模擬,完整的模型設定、對稱破缺(雙谷的出現正是對稱破缺的體現)與「違約作為耗散瞬子」的路徑積分計算,見 Halperin 與 Dixon 的原始論文(arXiv:1808.03607);市場作為自學習集體 agent 的自由能框架,見 Halperin 與 Feldshteyn(arXiv:1805.06126)。其三,物理與機器學習(pp.567–575):三個小節分別是深度學習的階層表徵與統計物理階層結構(重整化群一路)的類比、張量網路作為高維函數的壓縮表示(源自量子多體物理、被引入機器學習當高效參數化工具)、以及非平衡環境中的有限理性 agent——本課除了在第二節借用有限理性的 \(\beta\)(思想源頭見 Ortega 與 Braun,arXiv:1204.6481)之外,這一節全部未展開,是兩邊落差最大的區塊,數學背景到位的讀者宜直接讀原書。其四,機器學習的「大一統」(pp.575–579):三個小節分別是感知–行動迴圈、資訊理論遇上強化學習、強化學習遇上監督式學習(predictron 與 MuZero 一系端到端「學模型+做規劃」架構,arXiv:1612.08810、arXiv:1911.08265)——本課第二、三、四節把前兩個小節展開成白話與玩具實驗(資訊瓶頸原典為 arXiv:physics/0004057),第三個小節僅在第四節末尾點名。編排取捨說明:原書先講市場動態(§2)再講統一(§4),本課反轉為先統一、後市場——統一主題直接接續第九至十一章的強化學習語言,教學動線較順;兩大主題之下數學門檻明顯高於本課設定的小節(張量網路、瞬子計算、路徑積分),一律以直覺與指路代替展開,不降階轉述。
§04作業和解答
作業一:資訊瓶頸的完整掃描
延續第三節的實驗:(1) 把 k 從 1 掃到 8,補齊 PCA 壓縮在 k=5、7 的樣本外 R²;(2) 以「達到全特徵 R²(0.3950)的九成」為及格線,兩種壓縮各需要幾維?(3) 解釋為什麼任務覺察壓縮在 k=2 的 R²(0.4002)反而高於 k=8 用滿全部特徵。
解答 SOLUTION
import numpy as np
rng = np.random.default_rng(12)
def make_data(n):
g = rng.normal(size=n)
Xn = 2.0 * g[:, None] + 0.8 * rng.normal(size=(n, 6))
Xs = 0.6 * rng.normal(size=(n, 2))
return np.hstack([Xn, Xs]), 0.9 * Xs[:, 0] + 0.6 * Xs[:, 1] + rng.normal(0.0, 0.8, n)
X_tr, y_tr = make_data(2000)
X_te, y_te = make_data(2000)
def ols_r2(Z_tr, Z_te):
A = np.hstack([Z_tr, np.ones((len(Z_tr), 1))])
w = np.linalg.lstsq(A, y_tr, rcond=None)[0]
pred = np.hstack([Z_te, np.ones((len(Z_te), 1))]) @ w
return 1.0 - np.mean((y_te - pred) ** 2) / np.var(y_te)
mu = X_tr.mean(axis=0)
_, _, Vt = np.linalg.svd(X_tr - mu, full_matrices=False)
rank = np.argsort(-np.abs(np.corrcoef(X_tr.T, y_tr)[-1, :-1]))
for k in range(1, 9):
print(k, round(ols_r2((X_tr - mu) @ Vt[:k].T, (X_te - mu) @ Vt[:k].T), 4),
round(ols_r2(X_tr[:, rank[:k]], X_te[:, rank[:k]]), 4))
# 輸出(k|PCA|任務覺察):
# 1 -0.0018 0.2557 / 2 -0.0058 0.4002 / 3 -0.0056 0.3991 / 4 -0.0052 0.3990
# 5 -0.0125 0.3987 / 6 -0.0122 0.3990 / 7 0.3593 0.3951 / 8 0.3950 0.3950(1) PCA 在 k=5 是 −0.0125、k=7 跳到 0.3593——訊號方向被 PCA 按變異數排在第 7、8 位,前 6 個主成分全是共同因子與噪音殘差。(2) 及格線 0.9×0.3950≈0.3555:任務覺察 k=2 過線,PCA 要到 k=7。壓縮預算相同時,兩種哲學的效率差了三倍以上。(3) k=2 勝過 k=8 的原因是估計方差:多納入的 6 個噪音特徵對 \(y\) 的真實係數是零,但有限樣本下 OLS 會給它們非零的估計值,每個都在吸收訓練集的雜訊、在測試集上還債。丟掉它們等於把這些參數硬設為零——一次不花錢的正則化。這正是資訊瓶頸「壓縮項」的統計學面孔:\(I(X;Z)\) 罰的不只是儲存成本,還有跟著多餘資訊進門的過擬合風險。
作業二:翻轉點在哪裡——成本掃描
延續第四節的實驗:把單邊交易成本從 0 掃到 8 個基點,找出快慢訊號淨 Sharpe 排名翻轉的成本區間,並回答:(1) 成本為零時端到端選擇與兩階段選擇一致嗎?(2) 翻轉點對「哪個訊號該進組合」的實務含義是什麼?
解答 SOLUTION
import numpy as np
rng = np.random.default_rng(2026)
T = 5000
def ar1(phi, n):
x = np.zeros(n)
for t in range(1, n):
x[t] = phi * x[t - 1] + np.sqrt(1 - phi ** 2) * rng.normal()
return x
f_fast = ar1(0.05, T)
f_slow = ar1(0.97, T)
ret = (0.10 * f_fast[:-1] + 0.05 * f_slow[:-1] + rng.normal(0, 1, T - 1)) * 0.01
def net_sharpe(sig, c):
pos = np.sign(sig[:-1])
gross = pos * ret
turn = np.abs(np.diff(np.concatenate([[0.0], pos])))
net = gross - c / 1e4 * turn
return net.mean() / net.std() * np.sqrt(252)
print("c(bp) | 快訊號 | 慢訊號")
for c in (0, 1, 2, 3, 4, 5, 6, 8):
print(f" {c} | {net_sharpe(f_fast, c):5.2f} | {net_sharpe(f_slow, c):5.2f}")
# 輸出:
# 0→1.21/0.74、1→1.06/0.72、2→0.90/0.70、3→0.75/0.67、
# 4→0.60/0.65、5→0.44/0.62、6→0.29/0.60、8→-0.02/0.55翻轉發生在 3 到 4 個基點之間:c=3 時快訊號還小勝(0.75 對 0.67),c=4 起被反超(0.60 對 0.65),c=8 時快訊號整條策略轉負。(1) 成本為零時兩種選法一致——都選快訊號,因為沒有成本時「行動的代價」為零,預測排名就是行動排名;兩階段流程正是隱性地活在這個假設裡。(2) 實務含義:訊號的取捨取決於你的執行成本結構,而不是訊號自身的性質。同一個快訊號,對自營高頻商(成本近零)是冠軍資產,對成本 5 個基點的資產管理人是負資產——所以因子庫的排名表不該是全公司共用一張,而該按執行成本分層;更進一步,換手率懲罰應該在因子挖掘階段就進入目標函數,而不是等到組合建構階段才補課。
作業三:山脊的高度——位能形狀與危機機率
延續第五節的模擬:固定噪音 σ=0.75,把山脊高度 h 從 0.5 掃到 1.5,觀察十年翻谷比例的變化。回答:(1) h 在市場語境下對應什麼?(2) 翻谷機率對 h 的敏感性說明了什麼風險管理教訓?
解答 SOLUTION
import numpy as np
rng = np.random.default_rng(88)
M, dt = 2000, 1.0 / 252
steps = int(10 / dt)
for h in (0.5, 1.0, 1.5):
x = np.ones(M)
escaped = np.zeros(M, dtype=bool)
for t in range(steps):
x = x - 4.0 * h * x * (x ** 2 - 1.0) * dt \
+ 0.75 * np.sqrt(dt) * rng.normal(size=M)
escaped |= (x < -0.5)
print(f"h={h}|10 年內翻谷比例 {escaped.mean():.1%}")
# 輸出:
# h=0.5|10 年內翻谷比例 50.2%
# h=1.0|10 年內翻谷比例 20.6%
# h=1.5|10 年內翻谷比例 5.1%山脊高度砍半(1.0→0.5),十年危機機率從 20.6% 飆到 50.2%;抬高一半(1.0→1.5)則壓到 5.1%——關係遠非線性(物理上逃逸速率隨山脊高度指數衰減,模擬與此一致)。(1) h 對應系統把自己拉回常態均衡的恢復力深度:市場流動性的厚度、做市資本的充足度、系統性槓桿的低度、政策當局的緩衝空間,都在墊高這道山脊;反過來,高槓桿與流動性枯竭是在悄悄削低它。(2) 教訓:日常波動(右谷內的晃動幅度)由 σ 與谷底曲率決定,對 h 幾乎無感——兩個日常統計量相同的市場,可以因為山脊高度不同而有差十倍的危機機率。風險管理若只監控波動率一族的指標,等於盯著谷底的晃動猜山脊的高度;槓桿率、流動性深度這些「位能形狀」的變數,需要獨立的儀表板。
作業四:全課綜合題——新問題該用哪章的武器
以下三個新的金融問題,各自指出:最適合的章節工具、為什麼、以及最需要提防的失效模式。(a) 銀行想預測中小企業貸款在未來一年內的違約機率,資料是財報比率與繳款紀錄,主管要求每筆拒貸都能給出理由。(b) 資產管理公司要把一筆佔日均量三成的大額股票部位在五個交易日內出清,希望最小化整體執行成本。(c) 交易室懷疑某商品市場存在「平靜/動盪」兩種輪替的狀態,想在動盪狀態出現的早期減碼。
解答 SOLUTION
(a) 第 4 章+第 5 章(前饋網路+可解釋性),第 2 章作底。這是典型的橫斷面監督式分類:特徵是財報比率與繳款行為,標籤是一年內違約與否。「每筆拒貸都要有理由」使可解釋性從加分項變成硬需求——第 5 章的歸因工具(或直接退回可解釋的模型類)必須進管線;違約樣本稀少,第 2 章的貝葉斯思維可為小樣本類別提供先驗。最需提防:非平穩——信用循環轉向時,繁榮期訓練的模型系統性低估違約(第 1 章房貸教訓的中小企業版),應以跨循環資料訓練並常態監控輸入分布漂移。
(b) 第 9 章(馬可夫決策過程與最適下單出清),第 8 章可作感知端。這不是預測問題而是序列決策問題:狀態(剩餘部位、剩餘時間、限價簿形狀)、行動(每期下單量與方式)、獎勵(負的執行成本)。佔日均量三成意味著自己的單就是市場的主要擾動——市場衝擊是內生的,正是監督式框架處理不了、強化學習框架天生處理的反身性。最需提防:模擬器與真實市場的落差——策略在歷史資料或簡化模擬器上訓練,但你的下單會改變別人的行為(本章第五節:對手也是會學習的 agent),上線必須從小額開始灰度驗證。
(c) 第 7 章(隱馬可夫模型),第 6 章作底。「兩種狀態輪替、狀態本身看不見」正是隱馬可夫模型的原生問題形塑:觀察到的是報酬與波動,隱狀態是平靜/動盪,模型輸出每一天處於動盪狀態的濾波機率,「早期減碼」即對這個機率設門檻。最需提防:狀態數與轉移的錯設——真實市場未必只有兩態,且第五節的雙井故事提醒你:狀態切換的觸發機制可能隨槓桿與流動性改變,歷史轉移機率對未來不必然成立;門檻設定應搭配成本敏感度分析,避免在兩態邊界上頻繁進出把利潤磨光。
三題合起來的判準複習:先問任務性質(預測還是決策?行動改不改變環境?)、再問資料結構(橫斷面還是時序?狀態可見還是隱藏?)、最後問失效模式(非平穩從哪裡進來?訊噪比撐不撐得起模型複雜度?)——這三問正是第 1 章應用地圖、本章知識地圖與三道限界的濃縮。
§05參考資料
- Tishby, N., Pereira, F. C., & Bialek, W. (2000). The Information Bottleneck Method. arXiv:physics/0004057 — 資訊瓶頸原理的原典:壓縮輸入同時保留對目標有用資訊的正式框架,本章第三節的源頭。
- Halperin, I., & Feldshteyn, I. (2018). Market Self-Learning of Signals, Impact and Optimal Trading. arXiv:1805.06126 — 把市場建成自學習集體 agent 的自由能框架,「看不見的手」的逆強化學習推論,本章第五節主題的原始論文之一。
- Halperin, I., & Dixon, M. (2018). "Quantum Equilibrium-Disequilibrium": Asset Price Dynamics, Symmetry Breaking, and Defaults as Dissipative Instantons. arXiv:1808.03607 — QED 模型原始論文:以非線性 Langevin 動力學把崩盤與違約寫成內生事件,本章雙井直覺的完整數學版。
- Ortega, P. A., & Braun, D. A. (2012). Thermodynamics as a Theory of Decision-Making with Information Processing Costs. arXiv:1204.6481 — 把「有限理性」寫成資訊處理成本的熱力學決策理論,本章第二節 β 參數的思想源頭。
- Silver, D., et al. (2016). The Predictron: End-To-End Learning and Planning. arXiv:1612.08810 — 價值估計與多步規劃端到端合訓的架構,「強化學習遇上監督式學習」路線的代表作。
- Schrittwieser, J., et al. (2019). Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model. arXiv:1911.08265 — MuZero:不知規則、邊學模型邊規劃的里程碑,本章第四節末尾「金融版開放題」的參照系。
- OpenAI Spinning Up in Deep RL — 從理論到可跑代碼的深度強化學習教材,路線一(工程實作)的推薦起點。
- Dixon, M. F., Halperin, I., & Bilokon, P. (2020). Machine Learning in Finance: From Theory to Practice. Springer — 本課程對照之原書,第十二章〈Frontiers of Machine Learning and Finance〉。