标签:三重障碍法
固定窗口标签的问题
Section titled “固定窗口标签的问题”机器学习的标准做法是"预测未来 天的收益方向/幅度",但固定窗口标签有两个金融特有的问题:
- 忽略路径:同样 +5% 的收益,先跌 20% 再涨回来(你会被止损)与单边上涨,标签却是同一个;
- 忽略波动率:平静期的 +5% 与恐慌期的 +5% 完全不是同一难度的事件,模型被迫去学"当下的波动率"而非信号本身。
三重障碍法(Triple-Barrier)
Section titled “三重障碍法(Triple-Barrier)”López de Prado 的替代方案:给每个样本设三条"障碍",先碰到哪条,标签就是哪条:
- 止盈/止损:按当时的波动率设定( 倍 ),而非固定百分比——障碍宽度随环境自适应;
- 时间障碍:最大持有期,贴近实际交易的天花板。
这样标签直接对应"这笔交易会不会被止盈/止损/到期",与实盘行为一致,见OU 过程与半衰期的同构思想。
元标签(Meta-Labeling)
Section titled “元标签(Meta-Labeling)”三重障碍自然引出元标签的两阶段架构:
- 第一阶段:简单规则(动量、carry、趋势)决定方向;
- 第二阶段:ML 模型预测"这个方向信号这次是否可信"(元标签),输出用于决定是否下注与下注大小。
价值:把问题从"预测方向"(最难的事)变成"预测已有规则的可靠性"(可学习得多)。ML 不直接产生信号,而是给规则做过滤器与仓位调节,见Kelly 准则与仓位大小的下注框架。
import numpy as npimport 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标签重叠与样本权重
Section titled “标签重叠与样本权重”时间障碍长达 天的标签窗口相互重叠:相邻样本共享同一段收益路径,信息量远小于独立样本。处理:
- 唯一性(uniqueness):按每个样本的标签窗口被多少其他样本共享,调整样本权重——重叠多的样本权重低;
- 这一步是三重障碍法能用的前提,跳过它等于让 CV 与模型都被重叠样本污染,见金融交叉验证。
量化中的用法
Section titled “量化中的用法”- 障碍宽度按当时波动率设定(),不固定百分比;
- 元标签架构:规则定方向,ML 定下注与仓位;
- 标签唯一性进入样本权重,再进 CV。
- 障碍宽度按当时波动率设定
- 元标签把问题从"预测方向"变成"预测规则何时有效"
- 标签之间存在重叠,样本权重需按唯一性调整