Hook:5 年沪深300 日收益,你能不能贴出「风险开关」标签
上海某私募的初级量化研究员张昊把过去 5 年的沪深300 日收益拉成一张表——列是 20 日已实现波动率(realized volatility)、申万一级行业截面收益离散度(cross-sectional dispersion)、60 日市值加权平均成对相关,1,200 多个交易日。组长甩话:「把每天打成 risk-on / risk-off / crisis 三档,别先验定义阈值,让数据自己说话。」
他立刻意识到这不是 2.6.1 的监督设定——手上只有 x x x ,没有 y y y 。本课给的工具是聚类 (clustering)与密度估计 (density estimation):前者把 x x x 划进若干互斥群组,后者直接估出 p ( x ) p(x) p ( x ) 。但「没有标签」一直在:验证只能靠类簇稳定性与经济解释,没有留存集准确率 (held-out accuracy)可言。
一、从监督到无监督:目标函数换了张脸
监督学习最小化 E ( x , y ) [ L ( h ( x ) , y ) ] \mathbb{E}_{(x,y)}[L(h(x), y)] E ( x , y ) [ L ( h ( x ) , y )] ;无监督只剩 { x 1 , … , x n } ∼ P X \{x_1, \dots, x_n\} \sim P_X { x 1 , … , x n } ∼ P X ,「损失」失去原义,改用三类问题相关的代理目标(surrogate objective):
类内散度 (within-cluster scatter)——驱动 k-means;
对数似然 (log-likelihood)——驱动高斯混合模型(GMM)与密度估计;
重构误差 (reconstruction error)——驱动 PCA 与自编码器(下一课)。
监督世界的「损失函数」量化预测错值的代价;无监督这边它只是「划分多紧 / 密度多贴」的优化代理。术语相同,语义已换。
二、k-means:类内散度上的坐标下降
把 n n n 个样本划进 K K K 个互斥子集 C 1 , … , C K \mathcal{C}_1, \dots, \mathcal{C}_K C 1 , … , C K ,每子集配一个聚类中心 μ k ∈ R d \mu_k \in \mathbb{R}^d μ k ∈ R d 。类内散度目标
J ( C 1 , … , C K , μ 1 , … , μ K ) = ∑ k = 1 K ∑ x ∈ C k ∥ x − μ k ∥ 2 . J(\mathcal{C}_1, \ldots, \mathcal{C}_K, \mu_1, \ldots, \mu_K) = \sum_{k=1}^K \sum_{x \in \mathcal{C}_k} \| x - \mu_k \|^2. J ( C 1 , … , C K , μ 1 , … , μ K ) = k = 1 ∑ K x ∈ C k ∑ ∥ x − μ k ∥ 2 .
Lloyd 算法(Lloyd 1957/1982)是 J J J 上的坐标下降 ——固定 μ \mu μ 解 C \mathcal{C} C ,固定 C \mathcal{C} C 解 μ \mu μ :
C k = { x : k = arg min j ∥ x − μ j ∥ 2 } , μ k = 1 ∣ C k ∣ ∑ x ∈ C k x . \mathcal{C}_k = \{ x : k = \arg\min_j \| x - \mu_j \|^2 \}, \qquad \mu_k = \frac{1}{|\mathcal{C}_k|} \sum_{x \in \mathcal{C}_k} x. C k = { x : k = arg j min ∥ x − μ j ∥ 2 } , μ k = ∣ C k ∣ 1 x ∈ C k ∑ x .
两步交替,J J J 单调不增;可能的划分总数有限,必在有限步收敛到局部 极小,不 保证全局。初始化敏感由 k-means++ (Arthur-Vassilvitskii 2007)的距离加权采样矫正,给出期望 O ( log K ) O(\log K) O ( log K ) 近似比。K K K 自己定不出来,是模型选择问题 :工业上用肘部图、轮廓系数、Gap 统计量、BIC 等启发式。
三、高斯混合模型:把硬指派变软
k-means 暗含「类簇是各向同性球状」的几何假设。放松成「每个类簇是带均值 μ k \mu_k μ k 与协方差矩阵 (covariance matrix)Σ k \Sigma_k Σ k 的多元正态分布 (Gaussian distribution)」即得高斯混合模型 :
p ( x ∣ π , μ , Σ ) = ∑ k = 1 K π k N ( x ∣ μ k , Σ k ) , π k ≥ 0 , ∑ k π k = 1. p(x \mid \pi, \mu, \Sigma) = \sum_{k=1}^K \pi_k \, \mathcal{N}(x \mid \mu_k, \Sigma_k), \quad \pi_k \geq 0, \; \sum_k \pi_k = 1. p ( x ∣ π , μ , Σ ) = k = 1 ∑ K π k N ( x ∣ μ k , Σ k ) , π k ≥ 0 , k ∑ π k = 1.
对数似然 ∑ i log ∑ k π k N ( x i ∣ μ k , Σ k ) \sum_i \log \sum_k \pi_k \mathcal{N}(x_i \mid \mu_k, \Sigma_k) ∑ i log ∑ k π k N ( x i ∣ μ k , Σ k ) 因 log-sum 无闭式解。EM 算法 (Dempster-Laird-Rubin 1977)引入隐变量 z i ∈ { 1 , … , K } z_i \in \{1, \dots, K\} z i ∈ { 1 , … , K } 表示「x i x_i x i 由哪个分量生成」,用 Jensen 不等式构造下界 L ( θ , q ) ≤ log p ( x ∣ θ ) \mathcal{L}(\theta, q) \leq \log p(x \mid \theta) L ( θ , q ) ≤ log p ( x ∣ θ ) ,交替最大化即可。
E 步 算响应度(responsibility)γ i k \gamma_{ik} γ ik ——它是指示函数 1 { z i = k } \mathbb{1}\{z_i = k\} 1 { z i = k } 在当前参数下的条件期望 (conditional expectation),即后验概率:
γ i k = π k N ( x i ∣ μ k , Σ k ) ∑ j π j N ( x i ∣ μ j , Σ j ) . \gamma_{ik} = \frac{\pi_k \mathcal{N}(x_i \mid \mu_k, \Sigma_k)}{\sum_j \pi_j \mathcal{N}(x_i \mid \mu_j, \Sigma_j)}. γ ik = ∑ j π j N ( x i ∣ μ j , Σ j ) π k N ( x i ∣ μ k , Σ k ) .
M 步 把参数更新为响应度加权矩:
π k = 1 n ∑ i γ i k , μ k = ∑ i γ i k x i ∑ i γ i k , Σ k = ∑ i γ i k ( x i − μ k ) ( x i − μ k ) ⊤ ∑ i γ i k . \pi_k = \frac{1}{n} \sum_i \gamma_{ik}, \quad \mu_k = \frac{\sum_i \gamma_{ik} x_i}{\sum_i \gamma_{ik}}, \quad \Sigma_k = \frac{\sum_i \gamma_{ik} (x_i - \mu_k)(x_i - \mu_k)^\top}{\sum_i \gamma_{ik}}. π k = n 1 i ∑ γ ik , μ k = ∑ i γ ik ∑ i γ ik x i , Σ k = ∑ i γ ik ∑ i γ ik ( x i − μ k ) ( x i − μ k ) ⊤ .
每次迭代单调提升 的是观测数据 (observed-data)对数似然,而非完整数据对数似然——Bishop §9.3 反复提的细节,容易写错。
四、k-means 是 GMM 的硬指派极限
固定 Σ k = ϵ I \Sigma_k = \epsilon I Σ k = ϵ I 并令 ϵ → 0 \epsilon \to 0 ϵ → 0 ,响应度 γ i k \gamma_{ik} γ ik 塌缩成 one-hot 指示——每个 x i x_i x i 完全归到最近的 μ k \mu_k μ k ,M 步退化成 k-means 的算术平均更新。「硬指派 vs 软指派」其实是连续统的两端。
Formula Explorer
exp(-0.5*x^2) + exp(-0.5*(x-2)^2)
(把上式看作一维 GMM 在 0 与 2 处两个分量的密度叠加。改动间距,你能直观看到密度从「双峰可分」过渡到「单峰难分」——这正是聚类难度随重叠度上升的几何来源。)
五、密度估计与带宽的偏差—方差取舍
GMM 是参数式密度估计 (parametric)的一种;若不愿假设参数族,核密度估计 (KDE)给出非参数方案:
p ^ ( x ) = 1 n h d ∑ i = 1 n K ( x − x i h ) . \widehat{p}(x) = \frac{1}{n h^d} \sum_{i=1}^n K\!\left( \frac{x - x_i}{h} \right). p ( x ) = n h d 1 i = 1 ∑ n K ( h x − x i ) .
核 K K K 常取高斯或 Epanechnikov,带宽 (bandwidth)h h h 是关键旋钮:h h h 太小,p ^ \widehat{p} p 退化成经验测度上的 n n n 个尖刺(方差爆掉);h h h 太大,所有数据被抹成一个核形状的鼓包(偏差爆掉)。即便没有 y y y ,2.6.1 的偏差—方差 框架仍以同一方式作用——容量取舍不挑监督场景。
六、量化场景:沪深300 风险开关与异常检测
回到张昊那张表。三维特征上跑 k-means(K=3),典型得到「低波—低相关」「中波—中相关」「高波—高相关」三组质心,贴上 risk-on / risk-off / crisis 即可作为头寸开关。但请记住三件事:类簇编号不稳定 (换种子会重排;2020 年 3 月、2024 年初等极端日把高波质心拉得更远);前视偏差 (若标准化用了全样本统计量,等于偷看未来,实盘必须 point-in-time);没有标签可对 ——验证只能靠稳定性、外推一致性、经济解释。
KDE 在国内私募更常出现在订单簿不平衡度与签名订单流(signed order flow)的异常检测——某分钟的 p ^ ( x t ) \widehat{p}(x_t) p ( x t ) 低于阈值即触发限仓,把低密度事件当肥尾候选(fat-tail candidate)管理,而不是当 alpha 信号。聚类与密度估计几乎不直接出 alpha,它们给因子模型 (factor model)上游的特征工程、下游的风险与执行环节服务——九坤、明汯、幻方等头部私募皆是如此。
Interactive Widget
该交互组件的正式实现会随课程交互层一起接入。当前 beta 先保留正文、公式和练习内容。
七、手算:6 个点跑两步 Lloyd,再跑一步 EM
设 6 个二维点 x 1 = ( 0 , 0 ) x_1 = (0,0) x 1 = ( 0 , 0 ) 、x 2 = ( 1 , 0 ) x_2 = (1,0) x 2 = ( 1 , 0 ) 、x 3 = ( 0 , 1 ) x_3 = (0,1) x 3 = ( 0 , 1 ) 、x 4 = ( 5 , 5 ) x_4 = (5,5) x 4 = ( 5 , 5 ) 、x 5 = ( 6 , 5 ) x_5 = (6,5) x 5 = ( 6 , 5 ) 、x 6 = ( 5 , 6 ) x_6 = (5,6) x 6 = ( 5 , 6 ) ,K = 2 K = 2 K = 2 ,初始中心 μ 1 = ( 0 , 0 ) \mu_1 = (0,0) μ 1 = ( 0 , 0 ) 、μ 2 = ( 1 , 1 ) \mu_2 = (1,1) μ 2 = ( 1 , 1 ) 。
Exercise
(i) 跑一轮 Lloyd:写出指派、更新 μ 1 , μ 2 \mu_1, \mu_2 μ 1 , μ 2 ,并计算更新后的 J J J 。
(ii) 再跑一轮,确认 J J J 不增,并说明此后任何一轮都不再改变划分——算法已稳态。
(iii) 改用 EM:初始化 μ 1 = μ 2 = ( x ˉ , y ˉ ) \mu_1 = \mu_2 = (\bar{x}, \bar{y}) μ 1 = μ 2 = ( x ˉ , y ˉ ) 、Σ 1 = Σ 2 = I \Sigma_1 = \Sigma_2 = I Σ 1 = Σ 2 = I 、π 1 = π 2 = 0.5 \pi_1 = \pi_2 = 0.5 π 1 = π 2 = 0.5 。算第一轮 E 步的 γ i , 1 \gamma_{i, 1} γ i , 1 ,解释为什么所有样本的 γ i , 1 \gamma_{i, 1} γ i , 1 都等于 0.5,这对工程实践意味着什么。
提示 先做指派:
x 1 , x 2 , x 3 x_1, x_2, x_3 x 1 , x 2 , x 3 到
μ 1 = ( 0 , 0 ) \mu_1=(0,0) μ 1 = ( 0 , 0 ) 的平方距离为
0 , 1 , 1 0,1,1 0 , 1 , 1 ,到
μ 2 = ( 1 , 1 ) \mu_2=(1,1) μ 2 = ( 1 , 1 ) 为
2 , 1 , 1 2,1,1 2 , 1 , 1 ,同距按下标归
μ 1 \mu_1 μ 1 ;
x 4 , x 5 , x 6 x_4, x_5, x_6 x 4 , x 5 , x 6 显著近
μ 2 \mu_2 μ 2 。更新得
μ 1 = ( 1 3 , 1 3 ) \mu_1=(\tfrac{1}{3},\tfrac{1}{3}) μ 1 = ( 3 1 , 3 1 ) 、
μ 2 = ( 16 3 , 16 3 ) \mu_2=(\tfrac{16}{3},\tfrac{16}{3}) μ 2 = ( 3 16 , 3 16 ) 。
J J J 是两簇各 3 点到自身质心的平方距离之和,直接代入。
提示 EM 的 E 步:两分量起点完全重合,
π 1 = π 2 \pi_1 = \pi_2 π 1 = π 2 且
Σ \Sigma Σ 相等,响应度公式分子分母逐项相消,
γ i , 1 = γ i , 2 = 0.5 \gamma_{i, 1} = \gamma_{i, 2} = 0.5 γ i , 1 = γ i , 2 = 0.5 对所有
i i i 成立。要让二者拉开,工程上要么对
μ 1 , μ 2 \mu_1, \mu_2 μ 1 , μ 2 加轻微扰动,要么先跑一步 k-means 当 warm start——这正是 EM 对初始化敏感的根由。
八、过渡:发现谁抱团之外,还得给 x x x 换坐标系
聚类与密度估计告诉你哪些 点相互靠近,但它们假设 x x x 的坐标已经「值得欧氏距离去丈量」。当 x ∈ R 1000 x \in \mathbb{R}^{1000} x ∈ R 1000 ——一张宽因子面板、一个订单簿 snapshot——维数灾难下所有点彼此都很远,k-means 与 KDE 都会失效。下一课要解决的就是:在做聚类之前,先用 PCA、自编码器、t-SNE / UMAP 把 x x x 嵌进一个低维、有意义的坐标系。坐标对了,本课的算法才真的能用。