ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

国内期货量化实战:CTP环境下的机器学习信号落地全解析

国内期货量化实战:CTP环境下的机器学习信号落地全解析 做期货量化这些年我最常被问到的一个问题是“机器学习跑出来的信号到底能不能直接用”说实话每次听到这个问题我都想把提问者拉到电脑前让他看看我踩过的坑——不是模型不赚钱而是从模型信号到实盘成交之间隔着整整一条产业链。尤其是国内期货市场交易链路、接口规范、数据特征和海外完全是两个世界。今天不聊虚的就基于国内CTP期货市场的真实环境把机器学习这套武器库从头到尾盘一遍哪些算法真的有用哪些是看上去很美以及从数据到实盘的完整链路里每一步到底该怎么落。这篇文章适合谁一种是已经在做期货主观交易、想往程序化和机器学习方向转的团队另一种是股票量化做得好、想拓展到期货CTA策略的个人或小团队。无论哪种如果你以为机器学习就是拿pandas读个数据、调个sklearn的RandomForest然后就能躺着赚钱——那这篇文章可能救你不少钱。1. 为什么国内做期货量化绕不开CTP这张网在聊机器学习之前得先把CTP这个东西讲清楚。因为在国内做期货程序化交易CTP不是“可选项”它几乎是唯一的必选项。1.1 从手机下单到程序化下单差了哪些东西很多人第一次接触量化交易是从股票市场开始的。股票那边你用vnpy、JoinQuant或者Ptrade接个券商接口基本就能跑起来。但期货市场不一样国内期货交易所上期所、大商所、郑商所、中金所、广期所的底层交易通道长期被上期技术上海期货信息技术有限公司的CTP接口主导。CTP全称是Comprehensive Transaction Platform几乎覆盖了国内所有主流期货公司的柜台系统。CTP之所以能成为事实标准核心就两条一是行情推送快二是交易链路短。做高频或者日内中频的策略这两条缺一不可。我见过一些从股票量化转过来的朋友一开始习惯用券商提供的HTTP接口去拉行情、下委托结果发现延迟高得离谱一个tick从交易所到你的策略进程再回来几百毫秒就没了这在期货市场基本等于没法做因为期货的行情波动比股票剧烈得多价格瞬间穿过你的止损线你还没来得及发出平仓指令滑点就已经把你账户打穿了。1.2 CTP的优缺点低延迟之外的隐性成本CTP的优势不用多说低延迟、高吞吐、API文档公开、生态成熟。vnpy、QuantConnect这些开源框架对CTP的支持做得相当完善基本是“开箱即用”的状态。但它的缺点也很实在行业里很少有人说透CTP前置机的连接稳定性完全取决于期货公司的IT水平有的小期货公司服务器机房不稳定盘中连接断了都不奇怪而断线的那几分钟可能恰好就是行情最大的时候。CTP的API是C风格的回调机制Python调用需要包一层封装比如vnpy的CTP网关而封装层本身就需要消耗性能高频策略对封装层优化的要求极高。柜台侧的风控限制。CTP柜台会做撤单频率、委托数量、市价单类型等风控别以为程序化交易就没人管你超限了直接给你拒单策略就会卡在“挂单—被拒—重发—又被拒”的死循环里。这些坑在你处理机器学习信号的时候可能感觉不明显但到了实盘落地阶段每一个都能让你头皮发麻。另外搭建CTP环境时有一点必须提CTP接口本身就内置了合规的交易风控链路它关注的是委托、成交、持仓的对账没有人能绕过交易所的监管直接修改订单数据。提示CTP只负责“能不能成交”不负责“信号怎么来”。把机器学习模型训练好之后你最终还是要面对一个现实问题信号转成委托单委托单经过柜台柜台提交到交易所——这一整条链路的成本和风险才是实盘盈利的真正分水岭。2. 机器学习在期货交易中的真实地位它不是神谕是数据分析器很多初学者对“机器学习量化交易”有一个浪漫化的想象把历史行情扔给模型模型自己找出规律然后自动下单实现财富自由。我对这种想象的态度就两个字危险。2.1 机器学习到底在解决量化里的哪一环把一笔交易拆开来看它包含以下环节行情接收 → 信号生成 → 风险控制 → 执行算法 → 订单管理 → 持仓监控。机器学习能参与的主要是“信号生成”和“风险控制”两块而且即便在这两块里它的角色也不是“给出买卖点”而是“给出一个概率判断”或者“给出一个回归预测的数值”。以CTA策略常见的“趋势跟踪”为例。传统趋势跟踪靠的是唐奇安通道、均线交叉、ATR突破这些经典指标逻辑简单、参数少、行为透明。机器学习介入后它做的事情是把过去N根K线的价量特征动量、波动率、量能变化、持仓量变化作为输入预测未来M个周期价格会上涨还是下跌或者预测未来收益的期望值。模型输出的不是“铁定涨”而是“根据历史统计这种情况后续上涨的概率是58%”。这个区别极其重要。如果你指望模型每次都预测对那你会把模型输出的概率当成确定性信号梭哈、加杠杆然后一次大亏就把前面的小盈利全部吐回去。但如果你把模型输出当做一个“优势概率”配合仓位管理来用它就是一个高效的数据分析器。2.2 期货数据和股票数据的差异决定了模型思路不同不少从股票量化转到期货的人会把股票那套因子模型直接搬到期货上结果发现效果很差。原因在于两类市场的数据特性完全不同。股票数据的核心逻辑是**“截面选股”**——市场上有几千只股票你通过因子给它们排序买入排名靠前的卖出或者低配排名靠后的赚的是相对收益。而期货市场活跃品种也就几十个每个品种背后的基本面逻辑差异巨大螺纹钢和铜、豆粕和原油几乎不存在统一的驱动因子。期货数据还有几个让机器学习头疼的特点非平稳性极强期货价格受宏观政策、产业供需、资金博弈多重影响不同年份的统计特征可能有天壤之别模型很容易在高波动年份学到“过时规律”。时间尺度敏感期货做的是合约不同合约的剩余期限、流动性差异很大主力合约切换的时候数据会断层处理不好就是脏数据进、垃圾模型出。交易成本影响权重大期货是T0、可做空、带杠杆换手率可以做到很高。一个模型在回测里年化收益50%但如果交易次数太多手续费滑点一扣可能直接变成亏损。这些特性决定了在期货市场用机器学习不能照搬股票多因子模型必须结合期货特有的数据维度来做特征和标签设计。3. 武器库军火架主流算法在期货场景的适用边界既然叫“武器库”核心部分自然是盘点到具体型号。我把过去几年在CTA团队里实际测过的算法按门派分了个类每一类我都会说清楚它适合解决什么问题在期货场景下有什么优势以及最致命的坑在哪里。3.1 线性模型与树模型结构化特征的基本盘先说线性模型。逻辑回归、岭回归、Lasso这类模型在期货ML里经常被当作“基线模型”来用即不管跑多复杂的深度学习都要先拿线性模型跑一遍作为效果下限。它们的优势是训练快、可解释性强、不容易过拟合尤其适合在特征数量不多比如几十个且特征和预测目标之间的关系近似线性时使用。但线性模型的瓶颈也很清晰它表达不了非线性关系。期货价格行为里典型的“波动率聚集效应”大波动后面往往还是大波动和“非对称响应”上涨过程中放量和下跌过程中放量的含义不同这些都需要非线性变换才能描述。所以线性模型在简单的趋势跟踪场景里做一个快糙猛的baseline可以但要挖掘更深层的市场微观结构它就是上限偏低。真正的主力是树模型家族尤其是XGBoost和LightGBM。在期货ML领域这两者基本是结构化特征建模的默认武器。我记得有一次做一个中频螺纹钢策略特征数量大约是120个包括跨周期动量、基差变化、持仓量斜率、波动率状态等。用LightGBM做二分类预测未来8根30分钟K线是否上涨AUC能到0.55左右这个数字放在预测类任务里看着不高但在期货这种低信噪比场景下已经足够构造正期望的策略了。树模型的优点非常符合期货场景自带特征交互不用手动构造“动量×波动率”这种叉积特征树模型可以自动切分。对缺失值鲁棒期货合约换月的时候数据会出现空洞树模型可以原生处理缺失不需要像深度学习那样填充或mask。训练速度和调参成本友好小团队几台机器就能完成全品种的模型训练。树模型的坑也有两条。第一过拟合非常隐蔽——你加了早停early stopping也未必能完全防住因为期货数据本身时间相关性很强直接随机切分训练集和测试集会导致“数据穿越”模型在测试集上表现极好实盘却崩盘。第二树模型做不了序列依赖建模它默认样本是独立的但期货价格数据明显是自相关的今天的收盘价和昨天的收盘价强相关树模型天然无法直接感知这种时间顺序。3.2 深度学习与时序模型吃数据但容易吃出幻觉深度学习在股票量化里已经大量应用但在国内期货CTA策略中它的地位比较尴尬。不是说没用而是“用了但需要非常小心”。LSTM、GRU这类循环神经网络一度被看做是金融时序预测的希望之星因为它们理论上可以学习长期依赖关系。我在实盘测试中确实看到过一些LSTM模型在山金、铜这样的品种上捕捉到了一些持续性较好的趋势段但问题同样明显深度模型的可解释性差一旦实盘亏损你根本说不清楚模型在用哪些规律。更麻烦的是深度模型的“数据饥饿”问题在期货市场被放大了。期货可比股票少得多一个品种30分钟K线一年大约也就4800根左右每天4小时8根30分钟K线一年250个交易日就算叠加到5年历史也只有24000个样本。这点样本量对于LSTM来说完全不够喂饱训练出来的模型方差极大换一段行情验证结果可能完全不一样。LSTM在期货上的失败模式颇具代表性训练集上走势预测非常精准测试集上则分崩离析。本质上模型学习到的是训练集里那些特殊波动模式的“表面记忆”而非可泛化的因果结构。Transformer架构的情况跟LSTM类似但有一个更微妙的问题Transformer特别擅长捕捉长距离依赖但在金融数据上长距离依赖往往是不稳定的。今天的价格形态和10天前的价格形态之间的“关联”极有可能只是巧合。强行用Transformer去学习这种关联就是过度拟合一堆噪音。如果非要在深度学习里选一个相对靠谱的方向我个人的经验是CNN或TCN时间卷积网络用于特征提取而不是直接端到端预测。也就是说用它把原始价量序列编码成一组特征向量再喂给一个简单的分类器或回归器这样的结构比直接用LSTM做端到端预测要稳健不少。3.3 强化学习在交易中的真实处境强化学习在“武器库”里属于名声最大、落地最少的装备。OpenAI的DotaAI打败人类选手的新闻让不少人畅想能不能训练一个AI让它自己学会交易想法很美好现实很骨感。强化学习需要和环境产生大量交互来学习策略但在期货市场你不可能让AI用真金白银在实盘里试错——一次错误的剧烈交易节奏就能让模型学到“亏损”的惨痛教训代价太高不可行。所以在模拟环境里训练就会面临一个致命问题交易模拟器的逼真度直接决定了策略的迁移效果。如果模拟器里的滑点、手续费、撮合规则和实盘差异过大强化学习学到的策略在实盘就是废纸一张。我见过一些团队尝试用强化学习做日内高频的仓位控制不是信号生成而是信号生成之后的“该下多少手”效果尚可。但核心信号仍然来自传统的统计模型或树模型强化学习只用来做“头寸管理”这个子问题。这种用法相对合理因为它把强化学习放在了一个容错率较高的位置上——就算策略输出极端仓位还有风控模块拦截。结论强化学习不是不能碰但不要指望它从零生成交易信号。在期货市场它能承担的角色是优化器而不是创造者。4. 特征工程才是真正的胜负手聊到这儿如果你觉得“算法选对了就能赚钱”那和看了菜谱就觉得能做出一桌好菜没什么区别。事实上在我们团队的实战里模型选型只占最终效果的20%剩下80%都来自特征工程和数据处理的细致打磨。提示一句话可以概括——垃圾进垃圾出Garbage in, garbage out。模型只是工具特征才是它的燃料。4.1 价量特征和跨周期特征的构造思路期货的价量数据比股票多两个独特的维度持仓量Open Interest和成交持仓比。持仓量的变化可以反映资金是否真的在进场趋势行情里“量增仓增”和“价涨仓减”的含义完全不同。很多机器学习模型只是在价格和成交量上做文章忽略了持仓量其实丢掉了一大片有效信息。价量特征比较常见的构造方法包括动量类过去N个周期的收益率、不同周期的动量差分、夏普比率的高频版本波动率类ATR占比、历史波动率百分位、布林带位置量能类成交量均值回归、持仓量变化率、量价相关性成交量和价格涨跌的滚动相关系数形态类最高最低价位置、K线实体占比、上下影线比例跨周期特征是更考验功力的东西。同一个品种5分钟线上的盘整在60分钟线上可能是一个明显的趋势中继反过来60分钟线的一个冲高回调可能在日线上只是一个小涟漪。把不同周期的信号同时放进模型可以让模型捕捉到多层级结构的信息。我一般会取4个级别的周期日线、60分钟、15分钟、5分钟把每个周期的技术指标都算一遍然后做降维或者直接作为扁平特征输入模型。4.2 横截面特征在期货多品种中的应用前面说过期货品种少、差异大横截面选股那套逻辑不能直接搬。但横截面特征不是完全没用关键看怎么用。横截面特征的一个典型应用是做品种间的相对强弱。比如黑色系里螺纹钢、热卷、铁矿石、焦炭它们产业链关联度高价格走势有联动性。你可以计算每个品种过去5日的涨幅在同板块里的百分位排名作为该品种的一个“相对强弱”特征。模型会学习到当螺纹钢是黑色系里最强的品种时后续继续走强的概率如何。这种做法比单纯用品种自身的历史数据多了一个维度本质上用的是市场共振的信息。但要注意横截面特征的“保质期”很短产业链逻辑一变比如环保限产政策导致供应端收缩强弱关系可能立刻反转。所以横截面特征在模型的输入里占比不宜过高我个人控制在20%以内。4.3 标签设计与样本划分最容易信息泄漏的地方特征工程之外标签设计和样本划分是另一个重灾区。先说标签。预测目标常用的有三种二分类未来N个周期价格是否上涨多分类未来N个周期价格涨跌幅度的区间大跌、小跌、盘整、小涨、大涨回归未来N个周期的收益率三种各有优劣。二分类最简单但忽略了涨幅大小可能让模型学到“微涨也算涨”的模糊边界回归任务则容易被极端值比如某天涨停带偏导致模型对正常行情不敏感。我的经验是中低频策略用多分类效果最好——你不仅告诉模型涨还是跌还告诉它涨多少、跌多少这样分类边界更有意义。但类别之间的不平衡问题盘整的样本数远多于大波动的样本数需要额外处理。再说样本划分。这一点必须反复强调做时序数据的机器学习绝对不能用随机切分。正确做法是按时间顺序切分训练集、验证集、测试集。比如用前70%的历史数据训练接着15%做验证调参用最后15%做测试只用于最终效果评估。但这里还有一个更隐蔽的问题期货行情存在明显的“状态切换”低波动震荡几个月、突然转高波动趋势如果训练集覆盖了某种行情状态而测试集恰好是另一种状态那模型效果差是必然的。所以严格来说样本划分还要结合行情状态的分布尽量让训练集和测试集都覆盖各种波动状态。实践里如果样本量充裕可以直接按年度划分比如训练2018-2022年验证2023年测试2024年。另外一个极容易踩的坑是特征穿越。当你构造“截至时间t的信息”时必须确认特征的每个值都只用到了t时刻及之前的数据。用未来数据构造的特征比如用了整个交易日的最高价却在盘中产生信号在回测里会表现得惊人地好实盘必死。这个检查是最基本也最容易疏漏的。5. 从回测到实盘ML策略上线的完整链条模型训练完了回测曲线漂亮得像梦一样下一步是实盘吗别急着下结论。从回测到实盘中间还有几道坎要过。5.1 回测平台和市场仿真先过了数据这道坎回测平台的选择会直接影响你对策略的判断。我见过不少人是拿vnpy自带的回测引擎跑的但那些基于1分钟K线做的回测撮合逻辑对滑点的模拟粗糙得不行——它默认你在K线收盘价附近成交但实际市场里你发单价高于盘口卖一价时成交价往往是盘口价格加上滑点尤其在行情剧烈波动时滑点可以吃掉一大块利润。比较靠谱的方式是用支持tick级回测的框架比如vnpy的tick回测模式或者自研的回测系统并且在回测里手动加上保守的滑点假设。国内期货按每个品种设置固定滑点比如螺纹钢设1跳铜设2跳——以当前盘口最优价为基准每次成交假设多付出设定滑点数。这个假设值最好比实盘统计出来的滑点中位数还要高一点宁可回测结果保守些也不要让回测曲线骗了你。回测通过之后在上真金白银之前一定要走市场仿真SimNow。SimNow是上期技术提供的仿真交易环境接口完全兼容CTP数据是实时行情撮合规则和实盘几乎一致。把策略接上SimNow跑两周到一个月观察它的信号频率、滑点消耗、成交率是否稳定这一步能过滤掉很多回测阶段看不见的坑。5.2 滚动训练、参数衰减和策略监控机器学习策略和传统CTA策略在维护方式上有一个根本差异传统策略的参数通常几个月甚至一年调一次机器学习模型需要滚动训练。因为市场是时变的模型学到的规律会衰减。滚动训练的实现方式一般有两种固定窗口重训比如每个周五收盘后用最近两年的数据重新训练模型下周一开盘换上新模型参数。在线学习每个交易日收盘后把当天的新数据加入到训练集做增量更新适用于树模型或线性模型神经网络做增量更新要小心很容易灾难性遗忘。我个人的经验是固定窗口重训要比在线学习稳得多。因为金融数据非平稳在线学习对最近数据的响应速度可能过快反而被短期噪音牵着走。固定窗口重训相当于一个低通滤波器帮助模型更稳定地适应市场。重训之后还要做模型一致性检查比较新旧模型在验证集上的预测相关度如果新模型和旧模型在历史数据上的预测结果差异过大就要特别小心是不是过拟合了新数据。此时宁可继续用旧的模型也别被短期表现所诱惑。实盘运行中的策略监控同样不能少。你至少需要跟踪这些指标每日盈亏、最大回撤、信号频率、成交率、滑点成本、模型预测置信度分布。尤其是预测置信度分布的漂移——如果模型预测为“上涨概率70%”的样本比例从10%降到了1%说明模型可能已经不适应新的市场环境需要考虑重新训练或降仓。5.3 实盘磨合期如何判断模型真的失效了磨合期的判断本质上是一个统计问题。一个新上线的模型在实盘初期可能出现回撤幅度可能是平均水平的1.5倍但这不意味着模型失效有时候实盘曲线的回撤比回测还要浅就需要小心了——可能你的滑点假设设得太保守了这在机器上叫“幸运偏差”。一个比较务实的判断框架是先跑满至少30个交易日积累基础的样本量把实盘期间模型遇到的市场状态与历史训练集的行情状态做对比推演理论期望收益如果实盘亏损超过该状态下历史分布95分位的亏损程度则启动“模型干预流程”。模型干预不是直接删除策略而是降杠杆比如仓位减半然后分析原因。如果连续两个干预周期比如两个30天模型都低于历史最差表现这时候再考虑框架层面的迭代比如换特征、换模型结构甚至推翻重做。这套流程听上去繁琐但我见过太多团队省略掉中间的验证步骤回测好就上重仓结果亏掉的不只是钱还有整个团队的信心。6. 团队配置和工具链现实建议最后这部分写给那些准备真正动手做这件事的人。无论你是独立开发者还是一个小团队有一件事必须想清楚机器学习期货量化是一个系统工程不是一套模型能解决的。6.1 最小可行团队长什么样如果你问我一个能够稳定运转的ML CTA策略团队最小配置是怎样的我的答案是三名工程师加少量外部支持量化研究员1人负责策略想法、特征工程、回测框架设计。这个人需要深刻理解期货市场微观结构懂机器学习算法但不是纯算法工程师而是能把市场逻辑转成数学表达的人。开发工程师1人负责CTP接入、交易执行、监控系统开发。代码能力强了解网络编程、消息队列、数据库能处理实盘中的各种异常情况。风控/运营1人负责实盘风控规则设置、日终对账、异常交易监控、策略运行参数审核。这个人不需要深入机器学习细节但要有极强的风险意识。个人独立做也不是不行但你的时间分配会非常紧张你一半的时间在研究策略另一半时间在处理实盘基础设施。说实话在策略稳定之前大概率是基础设施占了80%的精力。6.2 自己搭还是买现成框架工具链的选型上市面上的选择大概分成三层层级代表优点缺点开源全栈框架vnpy、backtrader、zipline免费、生态好、CTP支持度高稳定性一般需要自己二次开发商业量化平台掘金、MC、RqAlpha稳定、技术支好收费高策略保密性存疑自研系统无完全可控、性能最优开发周期长Bug风险高我的建议是用开源框架快速起步用自研系统追求规模。早期一定不要想着什么都自己写先借助vnpy把策略跑通、验证逻辑有效性等到策略对延迟和复杂度的要求超过了开源框架的上限再逐步替换关键模块。这个过程里你积累的经验会告诉你自研系统最该做哪些模块而不是闭门造车。个人经验分享一个实用工具链组合数据存储用ClickHouse适合存储tick级海量时序数据因子计算用Pandas/Numpy或者Polars性能更好模型训练用LightGBM和PyTorch树模型做baseline、神经网络做进阶交易执行用vnpy的CTP网关接SimNow仿真再过度到实盘监控告警用PrometheusGrafana或者简单的Python脚本企业微信机器人推送告警。这套组合的成本基本为零软件都是免费的但够一个三人团队用上两年。最后回到开头那个问题“机器学习跑出来的信号能不能直接用”我的答案现在应该很清晰了能但你必须理解它给出的只是一个带噪声的概率估计你需要用工程手段数据清理、特征工程、回测验证、实盘监控把它包装成一个全自动的、有风控决策的系统。机器学习不是点金手它更像一个精密的齿轮只有放进量化交易这台机器里它才真正开始起作用。如果你正打算在这个方向动手我的建议是先做小、做简单、做扎实。选一个自己熟悉的品种构造一个基于3-5个核心特征的LightGBM模型跑通从SimNow到实盘的全流程然后再逐步扩展。这条路比一开始就堆Deep Learning模型要稳得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进