跳转到内容

标签:三重障碍法

机器学习的标准做法是"预测未来 hh 天的收益方向/幅度",但固定窗口标签有两个金融特有的问题:

  1. 忽略路径:同样 +5% 的收益,先跌 20% 再涨回来(你会被止损)与单边上涨,标签却是同一个;
  2. 忽略波动率:平静期的 +5% 与恐慌期的 +5% 完全不是同一难度的事件,模型被迫去学"当下的波动率"而非信号本身。

López de Prado 的替代方案:给每个样本设三条"障碍",先碰到哪条,标签就是哪条:

标签={+1先触及止盈线 μ+b σ^t−1先触及止损线 μ−b σ^t0时间障碍 T 内两条价格线都未触及\text{标签} = \begin{cases} +1 & \text{先触及止盈线 } \mu + b\,\hat\sigma_t \\ -1 & \text{先触及止损线 } \mu - b\,\hat\sigma_t \\ 0 & \text{时间障碍 } T \text{ 内两条价格线都未触及} \end{cases}
  • 止盈/止损:按当时的波动率设定(bb 倍 σ^t\hat\sigma_t),而非固定百分比——障碍宽度随环境自适应;
  • 时间障碍:最大持有期,贴近实际交易的天花板。

这样标签直接对应"这笔交易会不会被止盈/止损/到期",与实盘行为一致,见OU 过程与半衰期的同构思想。

三重障碍自然引出元标签的两阶段架构:

  1. 第一阶段:简单规则(动量、carry、趋势)决定方向;
  2. 第二阶段:ML 模型预测"这个方向信号这次是否可信"(元标签),输出用于决定是否下注与下注大小。

价值:把问题从"预测方向"(最难的事)变成"预测已有规则的可靠性"(可学习得多)。ML 不直接产生信号,而是给规则做过滤器与仓位调节,见Kelly 准则与仓位大小的下注框架。

triple-barrier.py
import numpy as np
import pandas as pd
def triple_barrier(prices: pd.Series, vol: pd.Series, b: float = 2.0,
horizon: int = 20) -> pd.Series:
"""三重障碍标签:+1 止盈 / -1 止损 / 0 超时。障碍宽度按当时波动率。"""
labels = pd.Series(0, index=prices.index)
for t in range(len(prices) - horizon):
entry, sig = prices.iloc[t], vol.iloc[t] * b
up, dn = entry * np.exp(sig), entry * np.exp(-sig)
window = prices.iloc[t + 1: t + 1 + horizon]
hit_up, hit_dn = window >= up, window <= dn
if hit_up.any() and (not hit_dn.any() or hit_up.idxmax() < hit_dn.idxmax()):
labels.iloc[t] = 1
elif hit_dn.any():
labels.iloc[t] = -1
return labels

时间障碍长达 TT 天的标签窗口相互重叠:相邻样本共享同一段收益路径,信息量远小于独立样本。处理:

  • 唯一性(uniqueness):按每个样本的标签窗口被多少其他样本共享,调整样本权重——重叠多的样本权重低;
  • 这一步是三重障碍法能用的前提,跳过它等于让 CV 与模型都被重叠样本污染,见金融交叉验证。
  • 障碍宽度按当时波动率设定(b×σ^tb \times \hat\sigma_t),不固定百分比;
  • 元标签架构:规则定方向,ML 定下注与仓位;
  • 标签唯一性进入样本权重,再进 CV。
  • 障碍宽度按当时波动率设定
  • 元标签把问题从"预测方向"变成"预测规则何时有效"
  • 标签之间存在重叠,样本权重需按唯一性调整