halo 的技术博客

返回

大多数投资组合方法都活在「批处理」的世界里:先拿一段历史,估一个协方差矩阵,解一次优化,得到一组权重,然后拿去用。但真实的交易是逐日到来的——今天收盘,你必须为明天定好仓位,而你手里只有到今天为止的数据。这就是在线投资组合选择(Online Portfolio Selection, OLPS) 要解决的问题:把组合更新写成一个每天迭代一次的规则,不回头重算全历史。

我们之前聊过 OLPS 里最经典的 OLMAR——它把「均值回复」写成闭式更新。但 OLMAR 的灵魂是一个价格预测假设(价格向均线回复),一旦市场不是均值回复,它就反复被抽脸。本文换一个更「中性」的灵魂:跟随历史最优。名字叫 FTRL(Follow The Regularized Leader)—— McMahan 等人 2013 年为大规模在线学习(含广告 CTR 预估)提出的算法,今天被我们移植到投资组合。

它的核心信仰只有一句话:不预言未来,只跟随「到今天为止、累计表现最好的那个权重」,并且用正则项把权重「压稳」。我们在 6 只资产、756 个交易日(3 年)、带「赢家切换 + 一次系统性崩盘」的合成市场上把它跑成看得见的数据:FTRL 总收益 80.1%,年化 21.67%,Sharpe 0.94,日均换手率仅 3.9%,权重 41% 的时间被 L1 压成 0(天然稀疏)。它显著跑赢等权再平衡 UCRP 的 39.7% 和 OLMAR 的 36.5%;20 个种子里 12/20 跑赢 UCRP。

一、OLPS 的问题设定与 FTRL 的切入点#

设有 M 只资产,第 t 天的价格相对(price relative) 向量为

x_t = p_t / p_{t-1}   (逐元素相除,x_{t,i} > 1 表示第 i 只资产当天上涨)
plaintext

组合用权重向量 b_t 表示,落在单纯形 Δ_m = {b : b_i ≥ 0, Σ b_i = 1} 上(只做多、满仓)。第 t 天的组合收益倍数是 b_t · x_t,累计财富 S_n = Π_{t=1}^{n} (b_t · x_t)

OLPS 的目标:在不预知未来的前提下,逐日选 b_t,让最终 S_n 尽可能大。FTRL 的切入角度是把每天的「选 b_t」看成在线优化:第 t 天我们选的权重 w_t,应当最小化「到今天为止所有历史损失」的累计——也就是跟随历史累计最优的那个点,故曰 Follow The (Regularized) Leader。

二、为什么是 FTRL-Proximal:自适应学习率 + 近端正则#

直接「跟随历史最优」有一个残酷的问题:历史最优是一个被噪声反复拉扯的点,每来一个样本就剧烈跳动,权重天天大换仓。FTRL-Proximal 用三层设计把这种跳动「驯服」:

1) 自适应学习率(Per-coordinate Adaptive Learning Rate):每个资产 i 维护累计梯度平方 n_i += g_i²。第 i 个资产被噪声冲击得越凶,n_i 越大,该坐标的学习率就越小。直觉上——越不确定的资产,越别乱动

2) L1 正则(稀疏):直接把权重里「贡献不显著」的坐标压成 0。组合里常年不贡献的资产被自动剔除——这本身就是一种内生选股。

3) L2 正则(平滑):给权重一个温和的回归中心,抑制极端值。

把「每天的组合收益」写成损失 l_t(w) = -w·r_tr_t = x_t - 1 是净收益向量),梯度 g_t = -r_t。FTRL-Proximal 的逐坐标闭式更新是整篇文章的心脏:

n_i     += g_i²
σ_i      = (√(n_i + g_i²) - √n_i) / α
z_i     += g_i + σ_i · w_i^{prev}
w_i      = sign(z_i)·max(|z_i| - αλ₁, 0) / (α(β + √n_i) + λ₂)
plaintext

其中 α 是全局学习率(越大越敢跟随),λ₁ 是 L1 系数(越大越稀疏),λ₂ 是 L2 系数,β 是 L2 的记忆项(通常取 1)。w 是 FTRL 内部无约束权重;真正执行时再把它投影回单纯形 Δ_m(保证只做多、满仓)。投影只影响当天执行,不改变 FTRL 内部的 w 积累——这点很关键,下面会展开。

注意两点工程细节:(a) 梯度用净收益 1 - x_t 而非价格相对本身——价格相对常年 ≈1,直接当梯度会让 z 量级错乱、权重被数值问题打回均匀;(b) w 做了 ±2 的敞口截断,单纯防止单资产在极端日把组合拖到爆仓。

三、回测结果:在「赢家切换」市场里稳步超越等权#

把逐日更新串起来,跑完整 3 年。我们故意造了一个有结构的市场:资产 5 在前 400 天是赢家、资产 0 在第 400 天起接棒成为新赢家(赢家切换),中间还砸了一次系统性崩盘(第 500–515 天)。这样的市场里,单纯「等权不动」会错过赢家切换,「均值回复」策略会在崩盘里反复吃亏——正好是检验 FTRL「跟随历史最优」成色的试金石。

FTRL vs 基准:正则化跟随在「赢家切换」市场里稳步超越等权

主要数字(canonical seed,α=0.10, λ1=0.02, λ2=1.0):

策略总收益年化Sharpe波动最大回撤
FTRL80.1%21.67%0.9423.8%−24.8%
OLMAR36.5%10.93%0.4637.2%−42.6%
UCRP 等权再平衡39.7%11.78%0.6122.3%−21.5%
等权买入持有27.8%8.51%0.4722.4%−22.2%
事后最优单资产(作弊上界)106.2%27.28%0.8833.9%−25.4%

三个关键观察:

  1. FTRL 大幅跑赢等权:总收益 80.1% 是 UCRP 的 2.0 倍、买入持有的 2.9 倍,逼近「事后最优单资产」这个作弊上界(106.2%)的 75%。对一个不预知未来的在线算法,这相当可观——因为它真的跟上了赢家切换(先抱资产 5、后切到资产 0)。
  2. 风险调整后也赢:Sharpe 0.94 vs UCRP 0.61,且波动只略高于 UCRP(23.8% vs 22.3%)。这和 OLMAR 形成鲜明对比——OLMAR 的高收益是靠加大波动换来的(37.2% 波动),FTRL 则是靠「把权重放在对的资产上」。
  3. 回撤更浅:−24.8% vs OLMAR 的 −42.6%。FTRL 不赌反转,它只是「顺势跟随历史最优」,所以在崩盘里不会被「越跌越买」放大亏损。

四、FTRL 的两件武器:自适应学习率 + L1 稀疏#

FTRL 的两个超参数不是装饰。先看它的内部机制——累计梯度范数 √n_i 和 L1 稀疏度如何随时间演化:

自适应学习率与 L1 稀疏:√n 越大步长越小,L1 把四成仓位压成 0

左图:√n_i(累计梯度范数)随时间增长。资产 0(后段赢家)的 √n_0 稳步抬升,意味着 FTRL 对它的「信心」(累计证据)越来越强、学习率越来越小、权重越来越稳。右图:平均每天有 41% 的资产权重被 L1 压成 0——FTRL 自动把常年不贡献的资产剔出组合,相当于内嵌了一层动态选股。

五、权重演化:前段抱资产 5、后段切到资产 0、崩盘后回补#

看权重演化热力图,能清楚看到 FTRL「跟随引领历史」的行为:

FTRL 组合权重演化:前段抱资产 5、后段切到资产 0、崩盘后回补

三条虚线分别是「赢家切换点(400)」「崩盘起点(500)」「崩盘反弹点(540)」。在 400 天之前,权重集中在资产 5;400 之后平滑切换到资产 0;崩盘窗口里,被砸的资产 z 转负、权重被压低,崩盘结束后再度回补。整个过程没有预言未来,纯粹是「历史累计谁好就跟谁」——这正是 FTRL 名字的含义。

六、超参数敏感性:L1 与 α#

FTRL 对两个超参数敏感。先看 L1 稀疏强度:

L1 与 α 敏感性:适度 L1 提升稳健,过强饿死仓位;α 太小跟不动、太大追噪声

  • L1 太强(λ1 > 1):几乎把所有权重压成 0,组合退化成均匀、收益塌回 UCRP 水平;
  • L1 = 0:没有稀疏,权重被噪声反复拉扯、换手上升,Sharpe 略降;
  • 适度 L1(λ1 ≈ 0.02):在「跟随」和「稳健」间取得平衡,正是我们用的点。

再看学习率 α:

  • α 太小(≈0.02):z 增长被学习率压住,FTRL「跟不动」,收益贴近 UCRP;
  • α ≈ 0.1~0.2:跟随力度刚好,Sharpe 冲到 0.91.0,且换手仍只有 45%;
  • α 太大(>0.5):每天都拼命追历史最优,噪声主导,Sharpe 反而回落。

这给了我们一个稳健的超参区间:α∈[0.1, 0.2]、λ1∈[0.01, 0.05]。

七、鲁棒性:20 个种子#

单次结果可能侥幸。跑 20 个不同种子的合成市场确认:

  • FTRL Sharpe 均值 0.73 ± 0.27,UCRP 0.62 ± 0.03
  • FTRL > UCRP:12/20 个种子。

一个有信息量的细节:FTRL 的 Sharpe 标准差(±0.27)高于 UCRP(±0.03)——它是高方差策略,赢的时候靠赢家切换赚很多,但在少数「市场没有清晰赢家、纯随机游走」的种子里,跟随历史最优反而被噪声带偏。12/20 的胜率说明「跟随历史最优」在多数有结构的市场里有效,但在纯噪声市场里优势有限。这和真实世界一致:FTRL 在「存在可学习赢家」的 regime 里封神,在「谁都差不多」的平盘市里只是略赢等权。

八、六大真实陷阱#

  1. 梯度必须用净收益而非价格相对:这是头号坑。直接拿 x_t ≈ 1 当梯度,会让 z 量级错乱、权重被数值问题打回均匀,FTRL 退化成 UCRP(我们调试时正是这个 bug 让收益塌成 39.7%)。正确写法是 g = 1 - x_t
  2. 内部权重 vs 执行权重的分离:FTRL 的 w 是无约束的,只在执行时投影回单纯形。若把投影后的 b 直接喂回 z 的更新(即让 σ·w_prev 用投影后的权重),会引入隐性再平衡、扭曲自适应学习率。务必让 w_prev 是 FTRL 内部那个无约束的 w
  3. 交易成本:FTRL 的日换手只有 3.9%,比 OLMAR 的 104% 温和得多,但仍是正成本。纸面 80.1% 扣掉双边 10bps 后会缩水,实盘必须把成本写进梯度或叠加最小调仓阈值。
  4. L1 过强饿死组合:λ1 太大时组合退化成均匀,等于白跑;太小则失去稀疏选股的好处且换手上升。务必在 walk-forward 里选 λ1,而不是在单一历史段上调到最优。
  5. 与 OLMAR 的假设差异:FTRL 不假设均值回复,它假设「历史累计最优有延续性」。遇到结构突变(赢家突然换人、regime 切换),FTRL 会因为 √n 积累的惯性而反应滞后——它需要时间把旧赢家的 √n 冲淡、新赢家的 z 涨上来。我们的市场里切换发生在 400 天这个较慢的尺度,FTRL 跟得上;若是几天内的急切换,它会吃瘪。
  6. 合成数据的局限:我们的市场是带「赢家切换 + 崩盘」的自洽合成,目的是演示 FTRL 机制。真实市场的赢家切换更频繁、噪声更高、且伴随跳空和停牌。落地必须接入真实价格、扣真实成本、叠加 regime 判断,并用样本外 / walk-forward 验证。

九、结语#

FTRL 的价值不在于它是「最赚钱的算法」——在「存在清晰赢家」的合成里它赢很多,但在纯噪声市场里只是略赢等权。它的价值在于范式:把「跟随历史最优」这一朴素直觉,写成一个带自适应学习率 + L1/L2 正则的、逐坐标闭式更新的在线规则,天然适配流式数据和实盘节奏,且不依赖任何市场方向假设(不像 OLMAR 押注均值回复)。

对量化研究者而言,FTRL 最该记住的三件事:

  • 它靠「跟随」赚钱,不靠「预言」:只要市场存在可学习的赢家(哪怕赢家会切换),它就能跟上;纯噪声市场里优势有限;
  • 两个超参要调对:α 控制跟随力度(太小跟不动、太大追噪声),λ1 控制稀疏(太大饿死组合、太小失去选股);
  • 内部/执行权重分离 + 净收益梯度 是它的两个工程命门,写错任何一个都会让它静默退化成 UCRP。

它和之前聊过的 OLMAR、风险平价再平衡是同一套「在线组合」思想的不同灵魂:OLMAR 信均值回复、FTRL 信历史延续、风险平价信结构分散。理解了这三者的分工,整个 OLPS 谱系就通了。

注:本文价格序列为带「赢家切换 + 系统性崩盘」的自洽合成数据,用于演示 FTRL-Proximal 算法机制;真实市场的赢家切换更频繁、噪声更高且常伴跳空/停牌,落地需接入真实价格、扣真实交易成本、叠加 regime 判断,并做样本外与 walk-forward 验证。

FTRL 在线学习组合:用正则化跟随引领历史
https://blog.halo26812.eu.org/blog/ftrl-online-portfolio
Author halo
Published at 2026年7月14日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨