数据与算法

三栏式标签法:如何为金融机器学习模型构建合理的训练样本

金融机器学习最容易被低估的环节,不是选哪一种模型,也不是把神经网络堆到多深,而是你到底拿什么东西给模型贴标签。…

三栏式标签法:如何为金融机器学习模型构建合理的训练样本

很多量化项目一开始就把未来固定几个小时、几根K线或几天的收益率拿出来,然后粗暴地分成上涨、下跌两类。回测曲线看起来干净,训练集准确率也不难做得漂亮。真正一上实盘,滑点一打进来,止损连续被扫,账户净值像被重锤砸穿。你以为模型失效了,其实模型从一开始学到的就是一套脱离持仓路径的假答案。

三栏式标签法解决的,正是这个最容易被忽略的矛盾:交易结果不是只看最后一刻价格在哪里,而是看持仓期间先撞上了什么。

Marcos López de Prado 在 2018 年出版的《Advances in Financial Machine Learning》中提出的三栏式标签法,把每一个交易事件放进三道边界里判断:

  • 上边界:止盈;
  • 下边界:止损;
  • 垂直边界:最大持仓时间或到期时间。

价格先触碰哪一道边界,样本就获得对应标签。不是到时间以后再回头看涨跌,也不是用收盘价把中间发生过的爆仓、逼空和扫损全部抹掉。

模型不会替你承担标签错误造成的亏损。标签把路径风险藏起来,实盘就会把它重新连本带利地收回来。

固定时间区间为什么会误导模型

最后的收益率,掩盖了中途的止损

先看最常见的固定时间区间法。

假设你在某个时刻产生交易信号,规定持仓 20 根K线。20 根K线结束后,价格比入场价高,标签记为正类;价格低,标签记为负类。这个方法简单,代码也容易写,很多初学者就是从这里开始构建训练集。

问题在于,交易不是在第 20 根K线收盘时才经历风险。

一笔多头交易入场后,价格可能先从 100 跌到 95,直接击穿你的止损线,随后又一路拉到 108。如果你的策略在 95 处已经被扫损,那么这笔交易的真实结果是亏损;固定时间区间法却可能在第 20 根K线看到 108,然后把它标成上涨样本。

模型接收到的不是交易结果,而是一个被终点价格修饰过的幻觉。

反过来也一样。价格先从 100 冲到 108,触发止盈,之后一路回落,20 根K线结束时价格只剩 101。固定时间法会把这笔交易压缩成接近零收益的样本,完全看不见交易过程中已经完成的盈利退出。

这就是路径依赖。

金融价格的风险,不只存在于终点。最大回撤、盘中冲击、流动性断层、滑点扩大、涨跌停封锁,全部发生在路径上。你用一个固定终点收益率去概括整个持仓过程,等于把交易员真正面对的战场删掉一半。

相同的终点,不代表相同的交易结果

可以把两条价格路径放在一起看:

交易过程入场价持仓中间路径观察终点固定时间标签三栏式标签
路径甲100先跌至 94,随后反弹106正类负类,先触及止损
路径乙100先涨至 106,随后回落101正类或中性正类,先触及止盈
路径丙100始终在止盈止损之间震荡100.5中性或正类中性,触及垂直边界
路径丁100快速跌破止损后继续下行92负类负类,先触及止损

路径甲和路径乙的终点都高于入场价,固定时间区间法很可能把它们归到同一类。可在真实交易里,一笔已经止损,一笔已经止盈,执行逻辑完全相反。

你如果连这两种交易都分不出来,后面再换成随机森林、梯度提升树或深度学习模型,只是在更复杂地重复错误。模型层数越深,训练时间越长,错误标签造成的幻觉也越牢固。

固定时间法不是废物,但它不能替代交易退出逻辑

这里不能把固定时间区间法说成任何场景都不能用。对于某些研究问题,例如预测未来固定周期收益、做横截面排序、研究特定期限的收益分布,它仍然有用途。

但如果你的目标是训练一个和实际开平仓动作相关的分类模型,固定时间终点就不能独自承担标签定义。它没有回答三个关键问题:

1. 价格在持仓期间是否先触发了止损;

2. 价格是否已经提前达到止盈目标;

3. 如果两道价格边界都没有触发,策略到底愿意持仓多久。

这三个问题不补上,所谓正类和负类就只是事后按价格方向切出来的颜色,不是交易标签。

三栏式标签法到底怎么落地

第一栏:上边界,也就是止盈线

对多头交易来说,上边界位于入场价上方。价格触及这条线,样本通常被标记为正类,表示交易朝着预设盈利方向完成。

对空头交易来说,方向反过来。价格向下运行并触及目标价,才是空头的正向结果。

上边界不是随便画一条固定百分比线。市场波动小的时候,设得太远,样本会长期等不到结果;市场波动突然放大时,设得太近,交易信号会被噪声反复击穿。你把同一个固定数值塞给股指期货、个股和高频加密货币,等于拿同一把尺子去量钢板、沙子和刀口,结果不会稳定。

常见做法是先估计当前波动率,再用波动率乘以缩放系数设置距离。概念上可以写成:

上边界距离 = 入场价格 × 当前波动率 × 止盈缩放系数

这里的波动率可以使用指数加权移动平均波动率,也可以使用滚动标准差。缩放系数则根据标的、周期、交易成本和策略持仓逻辑调节。它不是永远固定的市场真理,更不能先看完回测结果,再反过来挑一个最漂亮的参数。

如果你的收益目标和市场当前波动完全脱节,标签会出现两种极端:

  • 止盈线太近,轻微噪声就把样本打成正类,标签数量很多,但交易意义很弱;
  • 止盈线太远,绝大部分样本在规定时间内碰不到,正类稀少,模型最后只会学着拒绝交易。

第二栏:下边界,也就是止损线

下边界负责定义失败。

对于多头,它位于入场价下方;对于空头,它位于入场价上方。价格先触及下边界,样本就应标记为负类。这个判断不能被后面的反弹抹掉。

很多训练数据就是在这里被污染的。研究者看到某个信号最终没有亏损,便把它保留为正样本;执行系统却在中途已经触发止损。回测里面的策略没有真正执行止损,机器学习模型也就没有机会理解止损是交易规则的一部分。

止损边界的意义,不是给模型制造更多负面样本,而是把风险承受能力写进样本标签。你允许价格在入场后回撤多少,愿意承受多长时间的震荡,账户能够承受多大的波动,这些都不能靠模型自己猜。

你不把规则写进标签,模型就会把所有历史路径混在一起:有的交易员止损很紧,有的交易员扛单很久;有的策略遇到跳空直接退出,有的策略等收盘确认。最后训练出来的分类边界看似复杂,实际上没有明确的执行对象。

第三栏:垂直边界,也就是时间上限

垂直边界是一道时间边界,用来规定样本最多观察多久。

如果价格在持仓期限内既没有触及止盈,也没有触及止损,那么价格走到垂直边界时,样本按照预先约定的规则处理。传统标签体系里,这类结果可以标成 0,代表中性或超时未触及价格边界。

垂直边界有三个作用。

第一,它防止交易无限期挂在市场里。没有时间上限的标签会把大量样本拖成悬而未决的状态,回测持仓周期和真实执行逻辑也会脱节。

第二,它定义了策略的时间尺度。日内策略不能把一个信号放到几个月后再判断;中低频趋势策略也不能因为几根K线没有突破就立刻判定失败。

第三,它把机会成本纳入训练数据。一笔没有止损、没有止盈、只是长时间横盘的交易,不一定是成功交易。资金被锁在那里,新的信号无法执行,保证金和流动性也在被消耗。垂直边界让这种状态有明确归宿。

时间上限不能只按数据方便设置。你需要从交易逻辑倒推:信号的有效期有多长,市场结构多久会变化,策略的资金使用周期是多少,隔夜风险是否允许,期货合约换月和交易时段是否会改变价格行为。

如果你在五分钟数据上生成标签,却把垂直边界设置成数百根K线,模型学到的已经不是短线信号,而是另一套持仓逻辑。标签周期和特征周期打架,最后的分类结果自然会失真。

从入场事件开始,而不是从每根K线开始

三栏式标签法不是对所有时间点机械贴标签

三栏式标签法的关键,不是画三条线,而是先定义事件。

你需要明确哪些时刻值得产生一个候选交易事件。这个事件可以来自现有策略的入场信号,也可以由价格变化达到某种阈值后触发。每个事件都有自己的起点、方向和波动率估计,然后分别生成属于它的三道边界。

如果你把每一根K线都当成一个独立事件,样本数量会迅速膨胀,但相邻样本高度重叠。前一根K线和后一根K线的入场价、特征、未来路径几乎相同,模型看到的不是大量独立机会,而是同一段行情被复制了很多遍。

这会造成一种很危险的假象:训练集和测试集指标都不错,实盘却没有那么多独立机会可以兑现。信号挤在一起,交易成本重复支付,标签之间互相污染,最后滑点把纸面优势一层层削掉。

因此,事件采样比单纯扩大样本数量更关键。

CUSUM过滤器:让样本由信息变化触发

在金融时序里,时间不是信息。市场平静时,连续几十根K线可能没有新内容;市场突然放量、突破或急跌时,几秒钟内的信息密度却能超过平时很长一段时间。

CUSUM采样过滤器的思路,是累计价格变化对基准的偏离,只有当累计偏离超过设定阈值时,才生成一个新事件。它不再机械地按照每个时间点采样,而是试图在市场出现足够变化时重新取样。

这并不意味着CUSUM天然优于所有采样方式。它仍然需要阈值、波动率估计和交易周期配合。阈值过低,样本会再次泛滥;阈值过高,真正有价值的行情变化会被过滤掉。

但在标签构建上,它至少提醒你一件事:样本不是越多越好,真正需要的是互相区分、能够对应交易决策的样本。

时间柱、成交量柱和成交额柱的差别

传统时间柱每隔固定时间生成一根K线,写入方便,数据源也最普遍。但固定时间内的成交量和信息密度并不稳定。开盘、收盘、数据公布、突发新闻时,几分钟内的交易活动可能远超平静时段。

因此,三栏式标签法经常和其他采样方式配合:

  • 时间柱:按照固定时间间隔采样,适合结构清晰、数据频率稳定的研究;
  • 成交量柱:累计到指定成交量后生成一根柱,试图让每根柱承载相近的交易活动;
  • 成交额柱:累计到指定成交额后生成一根柱,更接近资金交换规模;
  • 信息驱动采样:结合价格变化、成交量异常或CUSUM等方法,只在市场发生足够变化时生成事件。

采样方式会影响波动率估计,也会进一步影响三栏边界。如果你用极度不均匀的时间柱计算波动率,再把这个波动率直接拿来定止盈止损,边界会跟着数据采样噪声乱跳。

标签法不是孤立模块。采样、波动率、事件触发、边界距离和验证方式,必须作为一条链路一起审计。

三栏式标签法真正改变的,不是分类名称,而是把交易规则、波动环境和退出路径同时塞回训练样本。

动态边界怎么设,才不会把市场绞杀成一套固定模板

波动率是边界的骨架

三栏标签的动态性,主要来自波动率。

最简单的做法,是计算一段历史收益的滚动标准差。更常见的工程实现会采用指数加权移动平均,让近期数据拥有更高权重。市场波动刚刚放大时,EWMA能够比长窗口平均更快反应;市场重新平静后,波动率也会逐步回落。

对每一个事件,都可以根据事件发生前能够获得的信息估计波动率,再将价格与波动率相乘,得到一个尺度,最后分别乘以止盈和止损缩放系数。

可以把这套逻辑理解成:

  • 波动率决定当前市场的步幅;
  • 缩放系数决定你愿意给交易多少呼吸空间;
  • 止盈与止损的相对距离决定收益风险结构;
  • 垂直边界决定这笔交易最多占用多久资金。

这里最容易出现未来数据泄漏。比如你用事件发生之后整段持仓区间的波动率去设置入场时的边界,标签已经偷看了未来。模型不需要预测任何东西,只要复述你塞进标签里的未来信息就能获得漂亮结果。

波动率估计必须只使用事件发生时已经可见的数据。回测时如此,实时交易时更是如此。

止盈止损缩放系数不能脱离交易成本

止盈线和止损线的距离,不能只看价格波动,还要看手续费、滑点和成交深度。

如果一笔交易的目标距离非常小,而手续费和滑点占掉了相当部分收益空间,模型即使准确预测价格方向,执行后也可能仍然亏损。期货盘口快速扫单时,理论上的边界触发价和实际成交价不是同一个东西;加密货币在流动性薄弱的时段,止损触发后可能连续穿透几档报价;个股遇到跳空或涨跌停,边界是否可成交更是另一回事。

因此,边界参数至少要和下面几类信息一起讨论:

  • 标的在目标交易时段的平均价差;
  • 订单规模相对盘口深度的影响;
  • 市价单和限价单的执行规则;
  • 夜盘、隔夜和开盘跳空风险;
  • 合约乘数、保证金和强平机制;
  • 交易成本在不同波动环境下是否扩大。

标签如果把理论止盈和理论止损写得过于理想化,模型会在回测里吃到不存在的利润。等到实盘,滑点会把这层粉饰直接撕开。

不要用回测结果反向制造标签

参数优化最容易从研究变成自我欺骗。

你先尝试很多组止盈止损系数,再选择让净值曲线最顺的一组。接着用这组参数重新生成标签,模型指标自然会被进一步抬高。这个过程表面上是在调参,实际上是在用未来表现定义过去的正确答案。

合理的做法,是先根据策略逻辑、交易成本和风险承受能力确定一组有解释力的候选规则,再在严格的时间切分中检验其稳定性。参数可以调整,但每次调整都要说明改变了什么交易假设,而不是只说模型分数变高了。

金融市场不会因为你的参数搜索次数增加,就给你更多独立样本。反复扫参数,只会让你更熟悉历史噪声。

标签编码:从三类结果到可执行决策

{-1,0,1}不是装饰,它代表三种不同结果

三栏式标签法常见的标签映射是 {-1,0,1}:

  • -1:先触及下边界,代表负向结果;
  • 0:先触及垂直边界,未触及止盈或止损;
  • 1:先触及上边界,代表正向结果。

这三个标签不是简单的涨跌方向。

-1对应的是预设风险被击穿,1对应的是预设目标被实现,0对应的是在规定时间内没有完成任何一侧突破。三者的交易含义不同,不能为了方便训练就随手把 0 类删掉,或者把 0 类全部并入负类。

是否合并中性类,要看你要解决的问题。

如果模型负责判断交易方向,0类可以作为拒绝判断或中性状态。若系统只允许买入和卖出,不允许空仓,那么把0类直接丢弃可能会让模型只在极端样本中学习,最终在真实市场里被迫对大量模糊机会下单。

如果模型负责预测某个已有策略的交易质量,0类则可能代表没有形成有效退出结果。你可以把它单独保留,也可以结合策略目标重新定义损益。但无论怎么处理,必须在标签设计阶段写清楚,不能等训练失败以后临时改编码。

实践中也常见另一种类别映射:

  • 0:卖出或负例;
  • 1:中性或超时;
  • 2:买入或正例。

这只是编码方式变化,不代表交易逻辑发生变化。不要把数字大小误当成收益排序,更不要把分类标签直接当连续变量使用。

标签数量不均衡,不等于要强行补平

在某些市场和参数下,止盈、止损和超时样本数量会严重不平衡。比如止损边界设置得很近,负类会大量出现;垂直边界太短,中性类会堆积;止盈距离太远,正类就会稀少。

很多人看到类别不均衡,第一反应是过采样、欠采样,或者复制少数类。这样做之前,先问清楚:不平衡是市场真实结构,还是边界参数写歪了?

如果策略本身就是低胜率高盈亏比,正类少并不代表标签错误。你强行把正类复制到和负类一样多,模型会把少数交易机会误认为常态,概率输出也会失去现实含义。

更稳妥的路径是先检查:

  • 三类样本是否对应真实的交易退出逻辑;
  • 边界距离是否符合当前波动环境;
  • 事件采样是否在某些行情阶段过度密集;
  • 标签是否受到缺失数据和成交价异常影响;
  • 样本不均衡是否只存在于某一个时间段。

模型训练可以使用类别权重,但类别权重只是优化手段,不能修复错误标签。把垃圾标签加权十倍,得到的仍然是十倍强化的垃圾。

元标签:让模型判断“要不要做”

当你已经有一套基础策略,能够给出交易方向,但信号质量不稳定时,可以把三栏式标签和元标签结合。

基础策略先决定方向,例如给出一个多头或空头候选事件;三栏式标签再根据止盈、止损和时间边界判断这次交易最终是否值得执行。此时,机器学习模型不一定负责预测市场下一根K线涨还是跌,而是负责评估基础策略的信号质量。

这通常更接近实盘流程:

1. 基础策略产生候选交易;

2. 标签系统根据实际退出边界记录结果;

3. 模型学习哪些候选交易值得放行;

4. 执行系统根据模型输出决定开仓、减仓或放弃。

这种分工能够避免把所有市场方向预测任务都压给一个黑盒模型。方向逻辑、风险边界和交易过滤各自承担职责,复盘时也更容易找到问题到底出在信号、标签还是执行。

但元标签也不是免死金牌。如果基础策略的入场逻辑毫无意义,元模型只能在坏信号里挑稍微不坏的,无法凭空制造优势。底层策略产生的事件质量,仍然决定了上层模型的天花板。

真实数据里的几个硬伤

只看收盘价,会漏掉盘中触发

三栏式标签依赖价格是否先触及边界,因此数据至少要能支持路径判断。

如果你只有收盘价,某根K线的最高价和最低价不可见,就无法确认这一根K线内部是否曾经触及止盈或止损。尤其在高波动市场中,价格可能在同一根K线里同时穿过上下两道边界。此时只看收盘价,根本无法知道哪个边界先被触发。

使用OHLC数据时,仍然有一个现实问题:如果同一根K线的最高价越过止盈,最低价也跌破止损,单靠K线聚合数据无法还原先后顺序。你需要更细粒度的数据、成交明细,或者制定明确且保守的冲突处理规则。

不能为了让回测结果更好看,就默认先触发盈利边界。那不是建模,是给自己开后门。

跳空和涨跌停会击穿边界

价格不是连续水流。开盘跳空、新闻冲击、流动性枯竭都会让市场直接从边界的一侧跳到另一侧。

例如多头止损设在 100,市场上一笔可成交价格却直接从 101 跳到 97。你的标签可以记录为止损触发,但实际损失不应仍按 100 计算。边界负责定义退出事件,成交模拟负责定义最终损益,两者不能混在一起。

期货还要处理交易时段、夜盘、合约切换和强平规则。股票则要面对停牌、涨跌停和复权数据一致性。加密资产需要面对全天候交易和不同交易所价格差异。三栏式标签提供统一框架,但不会替你解决数据源和成交机制问题。

重叠事件会污染验证结果

事件之间发生重叠,是金融机器学习里最容易被忽视的泄漏来源之一。

假设事件甲从周一开始,持仓观察到周三;事件乙从周二开始,也观察到周四。两个事件的未来价格路径有重叠,特征窗口也可能重叠。如果你把事件甲放进训练集、事件乙放进测试集,模型实际上已经在训练阶段见过测试事件的一部分市场路径。

随机打乱样本再切分,会把这种污染放大。金融时间序列不能像普通图片分类那样随意洗牌。

训练和验证需要按时间顺序拆分,并对重叠事件做隔离。常见处理思路包括:

  • 让训练集和测试集之间留出间隔,避免持仓区间互相穿透;
  • 对与测试事件时间范围重叠的训练样本进行剔除;
  • 使用适合金融标签重叠结构的净化交叉验证;
  • 在每次滚动训练时,只使用当时已经可获得的信息;
  • 将特征生成窗口、波动率窗口和标签观察窗口一起纳入泄漏审计。

你要是把未来数据漏进特征,模型会偷看答案;你要是把重叠路径漏进验证,模型会认出曾经见过的行情。两种情况都能把回测成绩抬起来,实盘也都能把账户按回原形。

缺失数据和异常价格会制造假边界

标签系统对数据质量非常敏感。

一根错误的高价可能把样本误判为止盈,一根异常低价可能把样本直接打成止损。时间戳错位、交易日历不一致、合约切换处理错误、复权方式混用,都会让价格路径变形。

数据清洗不能只在训练特征阶段做。标签使用的价格序列也必须经过同样严格的处理。需要核对的内容包括:

  • 时间戳是否统一时区并按真实交易顺序排列;
  • 开高低收之间是否满足基本价格约束;
  • 停牌、无成交时段是否被错误填充;
  • 复权价格和实际可交易价格是否混用;
  • 期货换月后价格跳变是否被误判为真实行情;
  • 不同数据源的成交价、标记价和指数价是否承担了不同职责。

很多策略亏损以后,研究者会先怀疑模型结构。实际上,一根脏数据就能让你的标签系统连续制造错误交易。

一次完整的标签构建,应该怎么复盘

下面用一个抽象的多头事件说明流程。数字只用于展示逻辑,不代表任何标的的固定参数。

第一步:确定事件起点

在时间点 t,基础策略产生一个多头候选信号,记录:

  • 入场时间;
  • 入场价格;
  • 交易方向;
  • 当时可获得的波动率估计;
  • 允许的最大持仓时间;
  • 止盈和止损缩放系数;
  • 交易成本与执行假设。

如果方向由基础策略决定,就不要在标签阶段偷偷改变方向。标签负责评价这笔候选交易的结果,不负责事后改写入场逻辑。

第二步:生成两道价格边界

设事件发生时的入场价为 P,波动率估计为 V,止盈系数为 a,止损系数为 b。

多头事件可以按照以下概念设置:

  • 上边界 = P ×(1 + V × a);
  • 下边界 = P ×(1 - V × b);
  • 垂直边界 = t 之后的最大持仓时间点。

空头事件则把价格方向反过来。真正写代码时,还要明确收益率口径、波动率单位、价格是否取对数、边界是否按净收益计算,以及手续费是否纳入触发判断。

这里最怕单位错位。日收益波动率、分钟收益波动率和价格百分比不能直接混用。标的价格变化以绝对值计算,波动率却以对数收益率计算,也需要在转换时保持一致。

第三步:沿路径扫描触发顺序

从事件起点向后扫描每一根K线,检查:

  • 最高价是否触及上边界;
  • 最低价是否触及下边界;
  • 当前时间是否达到垂直边界。

对于多头,若上边界先触及,标签为 1;下边界先触及,标签为 -1;两道价格边界都没有触及,直到时间上限结束,标签为 0。

如果同一根K线同时触及上下边界,必须按照数据粒度和交易规则处理。更保守的办法是使用更细粒度数据确认先后;如果做不到,就采用预先写死的冲突规则,并在回测结果中披露这会怎样影响标签分布。

第四步:记录触发时间和真实执行价格

不要只保存一个标签数字。

至少应保留:

  • 事件起点;
  • 触发边界;
  • 触发时间;
  • 触发时的理论价格;
  • 模拟成交价格;
  • 触发前后的波动率;
  • 持仓时长;
  • 交易成本;
  • 是否发生跳空、异常成交或数据缺口。

标签数字适合喂给模型,触发明细才适合拿来复盘。没有触发时间,你无法知道模型到底擅长捕捉快速突破,还是只在长时间漂移后才得到结果;没有成交价格,你也无法判断理论优势是否被滑点吃光。

第五步:检查样本是否具有交易意义

生成标签后,不要立刻训练模型。先把事件按月份、市场状态、方向和持仓时长拆开看。

你需要观察的不是一个总准确率,而是:

  • 正、负、中性三类标签是否集中在某些时间段;
  • 多头和空头的边界触发结构是否严重失衡;
  • 止盈与止损是否频繁在同一根K线内冲突;
  • 哪些事件持仓时间异常长;
  • 某些波动阶段是否出现标签爆炸;
  • 样本是否因为数据缺失被大量排除;
  • 理论触发结果扣除成本后是否仍有可执行性。

如果标签分布在不同时间段变化剧烈,这不一定说明模型失效,也可能说明市场状态发生变化。但你必须把这种变化暴露出来,不能把所有时期混在一起,用一个平均指标盖住结构断裂。

训练与评估:别让指标替你下注

准确率在交易里经常不够用

三栏式标签是分类问题,但交易不是考试。

一个模型即使分类准确率不错,只要它错在止损边界附近,或者把盈利样本集中预测成低置信度,最终损益也可能很差。反过来,一个准确率一般的模型,只要能筛掉一部分高风险事件,仍然可能改善基础策略。

评估至少要同时看:

  • 各类别的精确率和召回率;
  • 混淆矩阵;
  • 不同市场阶段的表现;
  • 多头与空头的分开结果;
  • 扣除交易成本后的收益;
  • 最大回撤和连续亏损;
  • 持仓时间分布;
  • 信号数量和换手变化;
  • 预测置信度与实际结果是否匹配。

不要只盯着一个分数。模型把中性类全部预测出来,准确率可能看起来稳定,但交易系统会因为没有信号而失去执行价值;模型疯狂预测正类,回测收益可能短期冲高,接着被滑点和反向行情绞杀。

训练集、验证集和测试集必须按时间推进

金融市场存在明显的时间依赖。你不能把未来样本随机抽到训练集,再把过去样本放进测试集,然后宣布模型通过验证。

更合理的测试方式,是让训练窗口向前推进:

  • 用较早时期训练;
  • 用随后时期验证;
  • 用更晚时期测试;
  • 测试期间不再修改标签规则;
  • 测试结束后,再把窗口向前滚动。

如果事件持仓区间相互重叠,还需要净化训练样本,并在测试窗口两侧留出隔离区。这样做会减少可用样本,结果也可能没有随机切分那么漂亮,但这才接近你真正面对的未知行情。

你要的是一套能在未来开仓的系统,不是一份能解释历史答案的报告。

预测概率不是盈利概率

分类模型输出的概率,通常表示在当前模型和训练分布下属于某个类别的相对倾向。它不自动等于下一笔交易盈利的概率,更不等于扣除手续费、滑点后的净收益概率。

如果训练标签只记录先触及止盈或止损,模型学习的是边界事件。最终是否赚钱,还取决于:

  • 止盈止损距离;
  • 成交成本;
  • 仓位大小;
  • 交易方向;
  • 价格跳跃;
  • 账户资金和保证金;
  • 多笔重叠交易之间的相关性。

因此,交易决策不能只写成预测标签等于 1 就开仓。还需要把预测强度、基础策略方向、风险预算和当前持仓一起纳入执行层。

模型输出可以帮你减少乱开仓,但不能替你决定账户愿意承受多少次连续扫损。

三栏式标签法最常见的错误

把止盈止损参数当成市场常数

不同标的、不同频率、不同交易时段,波动结构完全不同。止盈止损缩放系数没有统一固定值。研究者可以从策略逻辑出发设置候选范围,再结合回测和稳健性检验评估,但不能把某一组参数包装成普遍适用规则。

参数不是越复杂越专业。三栏式标签本身已经引入了价格边界、波动率和持仓时间,继续叠加大量条件之前,先确认每一项是否真的对应一个执行约束。

用未来波动率定义当前边界

这属于典型的数据泄漏。

事件发生后,价格剧烈波动,研究者再用这段未来波动率回填标签边界。模型看起来更适应行情,实际上已经拿到了未来信息。实时系统没有这份信息,实盘自然无法复制。

波动率估计窗口必须截止到事件起点。任何使用未来价格、未来成交量或未来标签统计量的步骤,都要从训练管线里剥离出去。

把触发顺序交给收盘价猜

同一根K线内的先后顺序不是收盘价能够告诉你的。尤其是止盈止损距离较近、波动放大时,粗粒度数据会让标签出现系统性误判。

如果数据不足以确认路径,就承认不确定性,使用更保守的规则或剔除冲突样本。不要用最有利于回测收益的顺序填补缺口。

把中性样本当成废料

中性样本表示在时间边界内没有触及止盈或止损。它可能是低波动、信号衰减、价格横盘,也可能代表策略在当前持仓期限下没有获得足够的信息。

删掉所有中性样本,相当于告诉模型市场只存在成功和失败,不存在等待、观望和机会成本。实盘里最容易吞噬手续费的,恰恰是那些没有明确边界结果却被系统反复交易的信号。

先看测试结果,再修改标签

这不是复盘,是事后改答案。

标签规则一旦根据测试结果反复调整,测试集就不再是测试集。你可以在研究阶段提出新假设,但每次规则变化都应重新划分验证过程,保留真正没有被用于决策的最终测试区间。

否则你会得到一套极其熟悉历史的标签系统。它能把过去每一次止损解释得头头是道,却无法阻止下一次止损发生。

如何把标签系统接进完整的量化流程

三栏式标签法应当放在一条完整的数据链里,而不是孤零零地夹在特征工程和模型训练之间。

一个相对清晰的流程是:

1. 清洗原始行情数据

统一时间戳、交易日历、价格口径和合约信息,处理缺失、异常和重复数据。

2. 选择采样方式

根据交易周期和市场特性选择时间柱、成交量柱、成交额柱,或结合CUSUM生成事件。

3. 估计事件发生前的波动率

使用当时已经可见的收益数据计算EWMA或滚动标准差,禁止读取未来区间。

4. 生成候选交易事件

记录事件时间、入场价格和交易方向,避免对每根K线无差别复制事件。

5. 设置三道边界

依据波动率、止盈止损缩放系数和最大持仓时间生成上下边界与垂直边界。

6. 扫描未来价格路径

记录最先触发的边界、触发时间和实际可执行价格。

7. 处理重叠和冲突样本

对同一持仓区间、同一根K线内的双边触发和数据缺口制定明确规则。

8. 按时间切分数据

使用滚动或扩展窗口,隔离重叠事件,防止训练过程接触测试区间的信息。

9. 训练分类或元标签模型

标签可以采用 {-1,0,1},也可以映射为三分类数字编码,具体取决于模型接口和策略设计。

10. 在成本和执行约束下评估

用实际手续费、滑点、成交限制和持仓规则重放交易,而不是只看理论边界命中率。

这条链路看起来比固定时间收益率复杂,但复杂来自真实市场本身。你可以把问题藏在数据处理里,也可以在训练集里暴露它。到了实盘,市场不会因为你省略了步骤就放过风险。

最后,标签决定了模型在学什么

三栏式标签法的价值,不在于它听起来比固定时间区间法更高级,而在于它迫使你回答交易系统最基本的问题:

你什么时候算赢?

什么时候算输?

如果价格没有按预期运行,你愿意等多久?

止盈、止损和时间边界一旦被明确写进样本,模型就不再只学习终点收益率,而是开始接触真实的交易退出路径。再配合动态波动率、合理的事件采样和严格的时间验证,训练数据才有机会接近实际执行环境。

但不要把三栏式标签法当成盈利机器。它不能替你发现有效信号,也不能消除市场噪声,更不能在跳空、滑点和流动性断层面前保护账户。它能做的,是把过去被粗暴隐藏的风险重新标出来,让模型面对真实的输赢边界。

如果你的标签无法解释一笔交易为什么止盈、为什么止损、为什么超时退出,那么模型再漂亮的指标也只是盘面上的烟雾。

交易系统最危险的时刻,不是模型暂时犯错,而是你开始相信一套从未认真定义过的标签。账户不会因为论文写得完整就停止爆仓;下一次边界被击穿时,真正承担后果的仍然是你的保证金。

常见问题

为什么固定时间区间法会误导机器学习模型?
该方法仅关注固定周期后的终点价格,忽略了持仓期间可能发生的止损或止盈,导致模型学习到脱离实际交易路径的错误答案。
三栏式标签法中的三道边界分别指什么?
上边界为止盈线,下边界为止损线,垂直边界为最大持仓时间或到期时间,价格先触碰哪一道边界即决定样本标签。
如何避免在设置标签边界时出现未来数据泄漏?
波动率估计必须仅使用事件发生时已经可见的历史数据,严禁使用事件发生后整段持仓区间的波动率来设置边界。
如果样本中出现大量中性标签,应该如何处理?
中性标签代表在规定时间内未触及止盈止损,不应随意删除。是否合并需视具体策略目标而定,但必须在标签设计阶段明确规则。
为什么不能直接使用收盘价来判断边界触发?
收盘价无法反映K线内部的最高价与最低价,可能导致无法准确判断止盈与止损的先后触发顺序,尤其在高波动市场中会造成系统性误判。