M/05 · 策略流形
策略族群的 PCA + UMAP 幾何
將 100,000 個滾動前推策略由 90 維度量空間嵌入至 2 維,再追問穩健性究竟是一個連通的區域,還是一群孤立島嶼構成的星座。
數學原理
每個策略都是高維特徵空間中的一個點 x ∈ ℝᵈ,其分量為最近 6 個滾動前推視窗中 逐視窗的 (Sharpe, PF, MaxDD),並在 Daru Finance 的專有擾動套件下評估。當N = 100,000 個策略時,我們便有一個 N × d 矩陣 X。我們追問:在這個空間裡,穩健策略是否 群聚,若是,該群聚形成單一連通區域,還是許多孤立的島嶼?
主成分投影
將 X 的各欄置中,並取其奇異值分解:
即為投影至前兩個主方向的線性投影。在生產語料庫上 PC1 解釋了 16.6% 的變異而 PC2 解釋了 10.0%,也就是說,這個嵌入本質上 是低維的,兩個座標已能捕捉 90 維訊號中約四分之一。
UMAP 作為非線性透鏡
PCA 保留全域幾何但忽略鄰域。UMAP(McInnes & Healy 2018)在輸入空間擬合一個 模糊單純複形集 μ(每條 k-NN 邊以局部黎曼度量加權),並在 2 維中擬合相應的 集合 ν,然後最小化其交叉熵
在均勻黎曼流形的連續性假設下,這在撕裂全域幾何的同時保留了局部拓撲。 結果是一個能浮現 PCA 所抹平之緊密鄰域的版面。
連通性與模組度
在 2 維嵌入上建立 k-NN 圖(k = 15)。令 A 為其鄰接矩陣,k_i 為節點 i 的 度數,m 為邊數,c_i 為 {robust, fragile} 中的標籤。Newman 的模組度
衡量每個標籤內部的邊密度超出組態模型虛無假設的程度。我們採用一個 廉價的代理 Q̃ = 兩端共享同一標籤之邊的比例。機率基準 為 r̄² + (1−r̄)²;當 r̄ = 0.0687 時得 0.872。生產嵌入上的 實證值為 Q̃ ≈ 0.903,較機率有真實但微小的提升,與弱群聚一致。
實作範例
- 10 個最深滾動前推資產、100,000 個策略的分層子抽樣、6 視窗度量特徵。
- 穩健率
r̄= 6.87% → 6,869 個穩健 vs 93,131 個脆弱。 - UMAP 模組度代理 0.903(vs 基準 0.872);PCA 代理 0.911。
- 僅穩健策略 k-NN 子圖中的連通分量數:UMAP 為 1,229, PCA 為 938。平均每個島嶼約 5.6 個穩健策略。
下方的互動式示範會在你每次移動 τ 滑桿時重新計算連通性統計量, 往下拖動穩健集便會合併;往上拖動它便會碎裂。
Demo: synthetic strategy manifold
N points sampled from one diffuse fragile cloud + K tight robust islands. Sweep the robustness threshold τ; watch how the robust subset partitions.
Amber: r ≥ τ (robust). Grey: r < τ (fragile). Connectivity is computed on an 8-NN graph over the amber subset using union-find. Lift over baseline = +0.027. With the production corpus (N=100,000, real metrics) the analogous numbers are 6,869 robust points, ~1,229 components, Q̃ ≈ 0.903.
圖表
為何這對系統化策略很重要
許多在策略空間上的搜尋程序,在平滑分數上的梯度上升、演化式 交配、貝氏最佳化,都隱含假設穩健區域是局部凸的:即一個穩健策略的 微小擾動仍然穩健。連通性分析直接反駁了 此假設。在我們檢查過的任何尺度上,穩健族群都不是一個單一 連通流形;它是由約 5–8 個策略組成、被脆弱間隙隔開的島嶼星座。
在操作上有兩個後果。第一,邊際優勢無法藉由擾動一個已知 良好的策略而可靠地觸及,一個穩健策略的鄰居有很高機率是脆弱的。第二, 穩健子集必須在指標/轉換/匯合網格上以組合方式列舉,而非 靠局部搜尋回復。下游模型所消費的流程已經尊重了這點: 候選者以組合方式生成,並且只在之後才被過濾,從不朝其最佳化。
可重現性
DaruFinance / strategy-manifold
Python · 開源參考實作
最小調用
import numpy as np
from sklearn.decomposition import PCA
from sklearn.neighbors import kneighbors_graph
import umap
# X: N x d feature matrix (rows = strategies, cols = per-window metrics).
# r: length-N {0,1} vector, 1 = passed the proprietary robustness funnel.
N, d = X.shape
# 1) Linear baseline.
pca = PCA(n_components=2).fit(X)
T_pca = pca.transform(X)
print("PC1 var:", pca.explained_variance_ratio_[0])
# 2) Non-linear embedding.
emb = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=0).fit_transform(X)
# 3) Connectivity of the robust subset under the 15-NN graph.
A = kneighbors_graph(emb, n_neighbors=15, mode="connectivity")
A_robust = A[r == 1][:, r == 1]
from scipy.sparse.csgraph import connected_components
n_components, _ = connected_components(A_robust, directed=False)
print("robust components:", n_components)
參考文獻
- [1]Pearson, K. (1901). On Lines and Planes of Closest Fit to Systems of Points in Space. Philosophical Magazine 2(11), 559–572.
- [2]McInnes, L., Healy, J., & Melville, J. (2018). UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction. arXiv:1802.03426.
- [3]Newman, M. E. J. (2006). Modularity and community structure in networks. PNAS 103(23), 8577–8582.

