
1. 从拍脑袋到讲道理为什么期货AI交易必须死磕特征工程很多人做期货AI交易第一步就错了。他们拿到K线数据把开盘价、最高价、最低价、收盘价、成交量这五个数往模型里一塞跑出来一个回测曲线年化收益百分之几百夏普比率高得离谱然后兴冲冲地上实盘结果不到两周就爆仓。这个场景我见过太多次了问题出在哪里出在他们把数据当成了特征。数据是原始的、未经加工的、充满噪声的原材料而特征是从数据中提炼出来的、能够反映市场某种规律或状态的、对预测目标有信息量的变量。这两者之间的差距就像刚从地里挖出来的铁矿石和已经锻造好的刀具之间的差距。你拿铁矿石去切菜切不动是正常的。期货市场的数据有几个非常棘手的特性这些特性决定了特征工程在这个领域不是锦上添花而是生死攸关。第一信噪比极低。期货价格每时每刻都在波动但真正有预测价值的信号可能只占所有波动的百分之一甚至千分之一。第二非平稳性。市场的统计特性会随时间变化今天有效的规律明天可能就失效了。第三多尺度性。同一个品种在分钟级别、小时级别、日线级别上呈现出的规律可能完全不同甚至相互矛盾。第四非线性依赖。价格和成交量、持仓量、波动率之间的关系远不是简单的线性关系。我刚开始做期货AI的时候犯过一个典型的错误用日线数据训练了一个LSTM模型输入是过去30天的OHLCV输出是第二天的涨跌方向。回测准确率达到了58%看起来还不错。但实盘跑了一个月准确率掉到了49%基本等于随机猜测。后来我花了很多时间复盘发现问题出在特征上——我用的特征全是原始价格和成交量模型学到的是过去30天涨了明天大概率还涨这种动量效应但期货市场的动量效应非常不稳定一旦市场从趋势转为震荡这个规律就完全失效了。所以做期货AI交易特征工程不是第一步而是贯穿始终的核心工作。你需要从原始数据中构造出能够捕捉市场不同维度状态的变量包括但不限于趋势强度、波动率状态、市场微观结构、资金流向、跨品种联动、季节性规律等等。每一个特征背后都应该有一个清晰的经济学或行为金融学逻辑支撑而不是我试了这个特征回测效果不错。1.1 期货特征工程的四个层次从微观到宏观的完整拼图我把期货特征工程分为四个层次从下到上依次是微观结构层、技术指标层、统计特征层、跨市场层。这四个层次不是孤立的而是相互补充的。一个健壮的模型应该同时包含这四个层次的特征。微观结构层是最底层的特征直接来源于订单流和成交数据。在期货市场中这个层次的特征包括买卖价差、订单簿不平衡度、大单净流入、主动买卖比例、成交量的时间分布等等。这些特征反映的是市场参与者的即时行为对短周期预测非常有效。但问题是这些数据通常需要Level-2行情才能获取而且数据量巨大处理起来对工程能力要求很高。技术指标层是最常见的特征来源包括均线、MACD、RSI、布林带、ATR等等。这些指标本质上是对价格和成交量的某种变换目的是提取出趋势、动量、超买超卖等信息。但我要提醒的是不要盲目堆砌技术指标。很多技术指标之间高度相关比如不同周期的均线同时放进去只会增加模型复杂度不会带来额外信息。我的做法是每个类别只选一两个代表性指标比如趋势类选一个均线斜率动量类选一个RSI波动率类选一个ATR。统计特征层是我个人认为最有价值但最容易被忽视的一层。这一层包括收益率的偏度、峰度、自相关性、 Hurst指数、熵值等等。这些特征反映的是价格序列的统计性质而不是价格本身。举个例子同样是上涨一个平稳的上涨和一个剧烈震荡的上涨对未来的预测意义是完全不同的。统计特征能够捕捉到这种差异。跨市场层是最高层的特征包括相关品种的价差、内外盘价差、期限结构、基差、仓单变化等等。期货市场不是孤立的螺纹钢和铁矿石、豆油和棕榈油、股指和国债之间都存在联动关系。这些跨市场特征往往能提供单一品种数据中看不到的信息。下面这张表总结了我常用的特征分类和具体示例特征层次特征类别具体示例适用周期微观结构订单流买卖价差、订单不平衡分钟级微观结构成交行为大单净流入、主动买卖比分钟级技术指标趋势均线斜率、ADX小时级技术指标动量RSI、MACD柱小时级技术指标波动率ATR、布林带宽度小时级统计特征分布偏度、峰度日级统计特征记忆性自相关、Hurst指数日级统计特征复杂性熵值、分形维数日级跨市场价差品种间价差、基差日级跨市场结构期限结构、仓单变化日级1.2 特征构造的实操细节以波动率特征为例光说理论没用我拿波动率特征来具体演示一下怎么构造。波动率是期货交易中最重要的特征之一因为它直接关系到风险和仓位管理。但原始的波动率计算有很多种方法每种方法适用的场景不同。最简单的是历史波动率就是过去N天收益率的标准差。但这个指标有个问题它对所有历史数据一视同仁但实际上近期的波动对未来的影响更大。所以我会用指数加权移动平均EWMA来计算波动率给近期数据更高的权重。具体公式是σ_t^2 λ * σ_{t-1}^2 (1-λ) * r_{t-1}^2其中λ通常取0.94。但EWMA波动率还是不够因为它假设波动率是平滑变化的。实际上期货市场的波动率经常出现跳跃比如突然的政策发布、库存数据公布等。所以我还会构造一个波动率突变特征就是当前波动率与过去一段时间波动率均值的比值。当这个比值超过某个阈值时说明市场进入了高波动状态。更进一步我会计算已实现波动率和隐含波动率的差值。已实现波动率是从历史价格算出来的隐含波动率是从期权价格反推出来的。两者的差值反映了市场对未来波动的预期与历史实际波动的偏离程度。当隐含波动率显著高于已实现波动率时说明市场预期未来波动会加大这往往是一个风险信号。这些特征构造的细节决定了你的模型是能用还是好用。我见过太多人特征工程做得非常粗糙然后抱怨AI交易不靠谱。其实不是AI不靠谱是特征不靠谱。2. 模型选型为什么LSTM不是期货预测的万能药说到期货AI交易很多人第一反应就是用LSTM因为LSTM擅长处理时间序列。但我必须说LSTM在期货预测中的表现往往没有大家想象的那么好。原因有几个第一LSTM参数量大在期货这种低信噪比数据上极易过拟合。第二LSTM的训练需要大量数据但期货的有效历史数据其实很有限。第三LSTM对特征的质量要求极高如果输入特征本身噪声很大LSTM学到的也是噪声。那用什么模型我的经验是不要迷信单一模型而是要根据预测目标和数据特性来选。对于短周期预测分钟级到小时级树模型XGBoost、LightGBM往往比深度学习模型更稳定因为树模型对噪声的鲁棒性更强而且特征重要性可解释。对于中长周期预测日级到周级可以尝试一些简单的线性模型加上精心构造的特征效果可能比复杂的深度学习模型更好。2.1 树模型在期货预测中的实战配置我以LightGBM为例讲一下具体的配置。首先目标函数的选择很关键。如果是预测涨跌方向用二分类的logloss如果是预测收益率大小用回归的MSE或Huber损失。Huber损失对异常值更鲁棒我通常优先选它。关键参数方面num_leaves不要设太大期货数据噪声大叶子节点太多容易过拟合我一般设在15到31之间。learning_rate设小一点0.01到0.05配合较多的迭代次数。feature_fraction和bagging_fraction都设0.7到0.8增加随机性来防止过拟合。min_data_in_leaf设大一点至少100确保每个叶子节点有足够的样本。还有一个非常重要的参数是early_stopping_rounds。期货数据的非平稳性意味着模型很容易在验证集上过拟合所以必须用早停。我通常把验证集设为时间序列的最后20%如果验证集损失在50轮内没有改善就停止训练。但光调参还不够特征工程和标签构造同样重要。标签构造方面我不用简单的第二天涨跌而是用未来N天的风险调整后收益。具体来说标签 未来N天收益率 / 未来N天波动率。这样构造的标签既考虑了收益方向也考虑了收益的稳定性。2.2 深度学习模型在期货场景下的正确打开方式如果你确实想用深度学习我的建议是不要直接用原始价格序列而是用已经构造好的特征向量作为输入。也就是说把特征工程做在前面深度学习模型只负责学习特征到标签的映射关系。这样做的好处是你可以把领域知识注入到特征中减轻模型的学习负担。网络结构方面不要用太深的网络。期货数据有效样本量有限深层网络很容易过拟合。我通常用2到3层的全连接网络或者1到2层的LSTM。激活函数用ReLU或GELU输出层根据任务选择sigmoid二分类或线性回归。正则化方面Dropout是必须的比率设在0.2到0.5之间。Batch Normalization也有帮助可以加速训练并提高稳定性。还有一个技巧是权重衰减L2正则化系数设在1e-4到1e-3之间。训练策略上我强烈建议用集成学习。训练多个不同初始化、不同超参数的模型然后对它们的预测结果取平均。这样做的原因是单个模型在期货数据上的方差很大集成可以显著降低方差提高预测稳定性。3. 风控架构AI交易系统的刹车和安全气囊我见过太多人模型做得很好回测曲线很漂亮但实盘一跑就亏钱。问题往往不在模型而在风控。风控不是简单地设一个止损线就完事了它是一个多层次的、动态的、与模型预测联动的完整体系。3.1 仓位管理凯利公式在期货中的修正应用仓位管理是风控的第一道防线。很多人用固定比例仓位比如每次用10%的资金。但更好的做法是根据模型的预测置信度和市场波动率来动态调整仓位。凯利公式是一个经典的工具f (bp - q) / b其中f是仓位比例b是赔率p是胜率q是败率。但直接用凯利公式在期货上有问题因为期货的赔率和胜率都是估计值而且期货有杠杆凯利公式算出来的仓位可能过大。我的做法是用半凯利甚至四分之一凯利也就是把凯利公式算出来的仓位乘以0.5或0.25。同时我会根据波动率进一步调整仓位 基础仓位 * (目标波动率 / 当前波动率)。这样做的逻辑是当市场波动加大时自动降低仓位控制风险暴露。还有一个重要的原则是总仓位上限。不管模型多么自信单个品种的仓位不超过总资金的20%所有品种的总仓位不超过总资金的60%。这是为了防止极端行情下的连锁反应。3.2 止损体系从固定止损到动态止损的进化止损是风控的第二道防线。固定止损比如亏损2%就平仓简单但不够灵活。更好的做法是动态止损根据市场波动率来调整止损幅度。我常用的方法是ATR止损止损距离 k * ATR其中k通常取2到3。这样做的逻辑是当市场波动大时止损距离自动放宽避免被正常波动扫出去当市场波动小时止损距离收紧控制单笔亏损。但ATR止损也有问题它只考虑了波动率没有考虑模型的预测。所以我会结合模型预测来调整如果模型预测方向与持仓方向一致且置信度高可以适当放宽止损如果模型预测方向反转则收紧止损甚至主动平仓。还有一个高级技巧是时间止损。如果一笔交易在N天内没有达到预期收益即使没有触发价格止损也主动平仓。这样做的逻辑是期货市场的时间价值很重要资金被占用在没有表现的仓位上机会成本很高。3.3 回撤控制从单笔止损到组合层面的风险预算单笔止损控制的是单次交易的风险但组合层面的回撤控制同样重要。我见过很多人单笔止损做得很好但连续亏损几次后总资金回撤还是很大。我的做法是设置回撤阈值当总资金从最高点回撤超过某个比例比如10%时强制降低仓位回撤超过15%时暂停交易重新评估模型和市场状态。这样做的逻辑是连续回撤往往意味着市场状态发生了变化模型可能暂时失效这时候最好的策略是观望而不是硬扛。另外我会用风险预算的方法来分配不同品种的仓位。具体来说先确定总的风险预算比如总资金的2%然后根据每个品种的波动率和相关性来分配。相关性高的品种分配的风险预算要降低因为它们可能同时亏损。4. 从回测到实盘那些只有踩过坑才知道的事回测和实盘之间的差距是期货AI交易中最难跨越的鸿沟。我见过太多回测年化50%的策略实盘跑出来年化-20%。问题出在哪里出在回测中的一些隐性假设在实盘中不成立。4.1 回测中的五个致命陷阱第一个陷阱是未来函数。这是最常见的错误比如用当天的收盘价计算指标然后用这个指标预测当天的涨跌。实盘中你不可能在收盘前知道收盘价。避免方法是所有特征的计算只能使用当前时刻之前的数据。第二个陷阱是幸存者偏差。如果你只回测当前还在交易的品种那些已经退市的品种就被忽略了。但那些退市的品种往往是因为表现不好才退市的。避免方法是回测时要包含所有历史上有交易的品种包括已经退市的。第三个陷阱是滑点和手续费低估。回测中很多人用理想价格成交但实盘中买卖价差、滑点、手续费都会侵蚀收益。我的做法是在回测中至少扣除双边万分之五的成本对于流动性差的品种还要额外扣除滑点。第四个陷阱是过拟合。这是最隐蔽的陷阱。当你反复调整参数、反复优化特征直到回测曲线完美时你很可能已经过拟合了。避免方法是留出一段样本外数据在模型完全确定之前绝对不看这段数据。第五个陷阱是市场状态变化。回测期间的市场状态可能与实盘期间完全不同。比如回测期间是趋势市实盘期间是震荡市那么趋势策略就会失效。避免方法是在回测中要包含不同类型的市场状态并且要监控实盘中的市场状态是否与回测一致。4.2 实盘监控你需要盯住的五个核心指标实盘上线后不是就不管了。你需要持续监控一些核心指标及时发现模型失效的迹象。第一个指标是预测准确率。如果准确率持续低于回测水平说明模型可能失效了。但要注意准确率有随机波动不要因为一两天的下降就恐慌。第二个指标是盈亏比。如果盈亏比持续下降说明模型可能在某些市场状态下表现不佳。第三个指标是最大回撤。如果回撤超过了预设阈值需要触发风控措施。第四个指标是换手率。如果换手率异常升高说明模型可能对噪声过度反应。第五个指标是特征重要性漂移。如果某些特征的重要性突然变化说明市场结构可能发生了变化。4.3 模型迭代什么时候该重新训练什么时候该推倒重来模型不是训练一次就一劳永逸的。市场在变化模型也需要迭代。但迭代的频率和方式很重要。我的做法是定期比如每月用最新数据重新训练模型但不会频繁调整模型结构。如果重新训练后模型在验证集上的表现没有显著下降就继续使用。如果表现显著下降就需要深入分析原因。如果是因为市场状态变化导致的失效可能需要重新设计特征或调整模型结构。如果是因为数据质量问题需要修复数据管道。如果是因为过拟合需要简化模型或增加正则化。但有一种情况需要推倒重来当市场的基本逻辑发生了根本性变化。比如某个品种的定价机制变了或者出现了新的参与者结构。这时候基于旧逻辑构造的特征可能完全失效需要重新做特征工程。5. 一个完整的期货AI交易系统架构长什么样说了这么多我把一个完整的期货AI交易系统架构梳理一下。这个架构不是理论上的而是我在实际项目中反复迭代后形成的。5.1 数据层从行情接入到特征存储的完整链路数据层是整个系统的基础。它需要完成以下工作行情数据接入包括Level-1和Level-2、数据清洗处理缺失值、异常值、特征计算实时和离线、特征存储供模型训练和推理使用。行情接入方面我通常用消息队列来接收实时行情确保低延迟和高吞吐。数据清洗方面要特别注意期货合约的换月问题不同合约的价格不能直接拼接需要用复权价格或者价差来调整。特征计算方面分为离线计算和实时计算两部分。离线计算用于模型训练可以处理大量历史数据实时计算用于模型推理要求低延迟。两部分计算的特征必须保持一致否则会出现训练和推理不一致的问题。特征存储方面我通常用时序数据库来存储特征方便按时间范围查询。同时会维护一个特征版本管理系统记录每个特征的计算逻辑和参数确保可复现。5.2 模型层训练、验证、推理的工程化实践模型层负责模型的训练、验证和推理。训练方面需要自动化训练管道定期用最新数据重新训练模型。验证方面需要严格的样本外验证包括时间序列交叉验证和滚动窗口验证。推理方面需要低延迟的推理服务能够实时接收特征并输出预测。推理服务需要支持模型热更新在不中断服务的情况下切换模型版本。还有一个重要的工程实践是影子模式。新模型上线前先让它以影子模式运行一段时间也就是只记录预测结果但不实际交易对比新模型和旧模型的预测差异。如果新模型表现更好再正式切换。5.3 执行层从信号生成到订单管理的完整闭环执行层负责将模型预测转化为实际交易。它包括信号生成、仓位计算、订单生成、订单执行、成交回报处理等环节。信号生成方面需要将模型预测转化为具体的交易信号包括方向、开平仓、数量等。仓位计算方面需要根据风控规则计算每个品种的目标仓位。订单生成方面需要根据目标仓位和当前仓位计算需要交易的量。订单执行方面需要考虑执行算法比如TWAP、VWAP等以减少市场冲击。成交回报处理方面需要实时更新仓位和盈亏并触发相应的风控检查。整个执行层需要与风控层紧密配合任何交易指令在发送前都要经过风控检查确保不会超出风险限额。5.4 风控层贯穿始终的独立监控体系风控层是独立于模型层和执行层的它需要实时监控整个系统的风险状态并在必要时干预。风控层包括事前风控交易前的风险检查、事中风控交易中的实时监控、事后风控交易后的风险分析。事前风控检查每笔交易是否符合风险限额包括单品种仓位限额、总仓位限额、单笔亏损限额等。事中风控实时监控市场波动和账户盈亏在触发阈值时自动降低仓位或暂停交易。事后风控分析历史交易的风险指标为模型迭代和风控参数调整提供依据。风控层还需要有熔断机制。当市场出现极端行情或者系统出现异常时能够自动暂停交易保护资金安全。6. 写在最后一些个人体会做期货AI交易这些年我最大的体会是AI不是魔法它只是一个工具。这个工具能不能用好取决于你对市场的理解、对数据的理解、对风险的理解。我见过很多人把AI交易当成圣杯以为找到一个好模型就能躺着赚钱。但现实是市场在不断进化任何模型都会失效。真正能长期存活的不是某个特定的模型而是一套完整的、能够持续迭代的体系。这套体系包括对市场逻辑的深刻理解、严谨的特征工程、稳健的模型选型、完善的风控架构、以及持续监控和迭代的工程能力。缺了任何一环系统都可能在某个时刻崩溃。还有一个体会是不要追求完美的策略。回测中看起来完美的策略实盘中往往表现很差因为它很可能过拟合了。相反那些回测中看起来还行但逻辑清晰的策略实盘中往往更稳定。最后我想说的是期货AI交易是一场马拉松不是短跑。不要因为短期的亏损就放弃也不要因为短期的盈利就膨胀。保持敬畏持续学习控制风险这才是长期生存之道。