做期货套利这几年,我听过最多的一句话就是“套利是无风险搬砖”。说这话的人,要么没真金白银下过场,要么就是运气好赶上了一段特别顺畅的行情。真实的套利交易,任何一笔都在承担风险,只不过它承担的是“更小、更可控、更愿意承担”的风险,而不是没有风险。
“期货套利策略”这个系列写到第二篇,上一篇我主要讲了跨期、跨品种、期现这三种经典套利形式的基本原理和入场逻辑,算是把框架搭了起来。这一篇我打算换个角度,聊一聊我从“手动做套利”转向“数据驱动的统计套利”过程中的那些体会,以及在实盘中真正影响利润的细节:主力合约数据怎么拼、价差序列怎么算、均值回归和动量哪一类更适合普通交易者、滑点和保证金占用怎么评估。
这篇文章适合两类人:一类是已经懂期货基础交易、想往套利方向深入的朋友;另一类是知道套利这个词、但还没系统理解它背后统计逻辑的朋友。我会尽量把每一步都拆开讲,争取你看完就能动手做自己的价差分析和回测。
1. 从经典套利到统计套利:我为什么把一个“搬砖生意”做成了数据工程
先说一个我自己的观念转变过程。
最早我做套利,思路特别简单:螺纹钢和热卷都是黑色系,走势大体同步,价差拉大了就空强的买弱的,价差收回来就平仓。这个方法有效,但效率很低,因为“拉大”和“收回”之间到底多大算大、多久能收回来,靠眼睛看盘很难判断。真正让我把套利当做一个系统工程来做,是我发现——现货贸易商和下游终端企业也在做类似的事,他们比我更懂基本面,我拼信息拼不过他们。但我在数据处理和回测上有优势,可以用历史价差的统计规律来弥补信息劣势。
所谓统计套利,核心就是一句话:用历史数据找到两个或多个合约之间稳定的数量关系,当这种关系被短期的市场情绪或资金行为打破时,以“关系会回归常态”为假设进行交易。它不预测绝对价格涨跌,只赌价差(或者比价)的“不正常不持续”。
这个思路放到期货里,最常见的应用就是把两个相关性很高的品种做成一个价差序列。比如豆油和棕榈油,比如螺纹钢和热卷,比如焦煤和焦炭,它们受共同的产业逻辑驱动,价格走势长期趋同,但短期会因为各自的基本面差异、资金关注度不同而产生价差波动。统计套利做的就是捕捉这种相对强弱变化。
不过我得先泼一盆冷水:统计套利不是印钞机。它的胜率确实可以做到比较高,但单笔利润通常比较薄,而且非常依赖你对“正常区间”的界定。如果两个品种的基本面发生了永久性变化(比如产业政策导致供应结构改变),历史价差的均值就成了一个陷阱,你顺着“回归”的思路开仓,越跌越买,结果价差一去不回。
所以我现在做套利,默认遵循三个原则:
- 先看产业逻辑,再看统计指标。统计指标是辅助工具,不能替代基本面判断。
- 只做流动性好的品种组合,成交稀疏的合约会带来严重的滑点和冲击成本。
- 每一笔套利开仓前,先想清楚这笔交易的亏损极限在哪里,而不是先想能赚多少。
这三条原则看着简单,但每一条背后都有我实打实亏出来的教训。后面我会结合具体的策略展开讲。
2. 把数据基础打牢:主连合约拼接、跳空过滤与“干净的价差”才是策略的地基
很多做手工套利的朋友,其实不觉得自己需要处理数据——软件上直接看价差图,不就行了吗?但一旦你开始做回测、做统计检验,数据处理的粗糙程度会直接决定策略是真有效还是假有效。我可以很负责任地说,数据这块踩的坑,比策略本身多得多。
2.1 主力合约拼接:别直接用行情软件的“主连”做分析
国内的期货行情软件里都有“主力连续”或者“指数连续”,打开就能看。但做量化分析和回测时,我不建议直接用主连的价格数据来算价差。原因很简单:主连是由不同月份合约拼接而成的,每次换月都会带来价格跳变,而这个跳变不是市场真实的涨跌,纯粹是合约切换造成的“人工缺口”。
举个例子,螺纹钢主力合约从2405换到2410,2405临近交割时价格可能明显高于2410,这时候主连价格会出现一个向下的台阶。如果你直接用这个数据去算价差、算均值、算标准差,相当于在序列里混入了一堆假信号。你会发现策略回测时异常美好,实盘一跑就崩,问题往往就出在数据源上。
我自己现在的做法是:用Wind、聚宽、米筐这类数据接口拿到每个合约的日线数据,自己拼接主力合约序列。拼接规则并不复杂:
- 取每个交易日的持仓量和成交量,按自己设定的规则选出当日主力合约(我一般用“成交量加权并兼顾持仓量”的方式)。
- 生成一张“日期—合约—价格—成交量”的明细表,逐日映射到主力合约上。
- 换月当天,不修改历史价格,只记录切换后的合约品种和价格,回测时代码自动处理仓位切换。
这种自己拼接的方式,虽然前期工作量大一点,但能保证你的价差序列不会被人为跳空污染。做套利分析,数据干净是第一优先级。
2.2 跨品种价差怎么算才不失真:价格比、价差差,还是Z-score
接下来是核心问题:两个品种的价差,到底该用“A价格减B价格”,还是“A价格除以B价格”?
很多人都直接取减法,但这里有个隐藏问题:如果A的价格是5000,B的价格是4000,那么价差1000;如果行情涨了一波,A变成6000,B变成4900,价差依然接近1100,看起来“很稳定”,但两个品种的比价其实已经从1.25变成了1.22。用减法算出来的价差,会掩盖相对强弱的变化。
更稳妥的做法是同时观察两种形态:绝对价差(A-B)和比价(A/B)。我在实际分析中会把两个指标都算出来,然后各自做Z-score标准化,再做一下对比,看它们给出的是否是同向信号。如果同向,说明这波价差波动是真实的结构变化,值得关注;如果背离,那说明这更多是价格水平变化带来的“表观波动”,开仓要更谨慎。
Z-score的计算方法很简单:
- 取过去N根K线的价差序列,算平均值和标准差;
- Z =(当前价差 - 平均价差)/ 标准差。
Z-score的意义在于把不同价格水平的价差放到同一尺度下比较。当Z接近2或超过2时,意味当前价差在历史分布里处于比较极端的位置,均值回归策略会倾向于反向开仓;当Z接近0时,说明价差处于均值附近,趋势策略一般不介入。
这里N怎么选,没有绝对标准。我做短线套利时常用20-30个交易日,做波段套利时用60-120个交易日。N越小,信号越敏感,但假信号也越多;N越大,信号越稳定,但反应更迟钝。我的做法是先用60日做一个基准,再用30日和120日做交叉验证,只有当几种周期的信号方向一致时才动手。
2.3 别忘了交易时段和合约规则差异
还有一个很容易被忽略的坑:不同品种的交易时间并不完全一致,夜盘开市、收市时间也不一样。比如螺纹钢夜盘到23点,棕榈油夜盘同样到23点,但有些品种夜盘到凌晨1点,甚至到凌晨2点30分。如果你用分钟级数据做日内套利,必须先把两个品种的交易时间对齐,否则你会拿A在开盘时段的价格去对比B在收盘时段的价格,算出来的价差自然失真。
另外,不同品种的最小变动价位、合约乘数、保证金比例都不一样,这直接影响“一手价差”的资金占用和盈亏。比如螺纹钢一手10吨,热卷一手10吨,乘数一致,比较好配对;但如果你做豆油和棕榈油,豆油一手10吨,棕榈油一手10吨,也一致,可如果做豆油和菜油,要确认一下乘数差异。算好“价差变动一个最小单位,账户盈亏变动多少钱”,再决定仓位,这是基本功。
3. 三种核心价差策略的实战拆解:均值回归、展期收益与强弱动量
这一节是全文的重头戏。我把自己实盘验证过、觉得值得持续跟踪的三类套利策略逐一展开。策略没有绝对的优劣,关键是搞清楚每一类策略赚的是什么钱、亏钱的场景是什么。
3.1 同产业链相关品种的均值回归:以螺纹钢和热卷为例
螺纹钢和热卷算是产业链配对套利里最经典的一组。两者都是钢材,成本结构高度一致,但需求端有差异:螺纹主要走房地产和基建,热卷主要走制造业和汽车家电。当政策或资金集中炒作某一个下游时,两者价差会被拉得很开,但过一段时间,产业利润的再平衡会把价差拉回去。
我的具体做法分四步:
- 第一步,数据准备。取螺纹钢和热卷主力连续的各合约日线数据,自己拼接主力序列,计算价差。
- 第二步,确定中枢。我一般用过去60个交易日的简单移动平均线(SMA)作为动态中枢。为什么不用固定值?因为钢材价格本身有趋势,固定中枢在单边行情里会被瞬间击穿。
- 第三步,设置开平仓阈值。当价差高于“中枢+1.5倍标准差”时,做空价差,即卖出螺纹钢、买入热卷;当价差回到中枢附近时平仓。低于“中枢-1.5倍标准差”时反向操作。
- 第四步,过滤极端行情。如果价差突破“中枢+3倍标准差”,我先不平仓,但要检查一下是不是有产业层面的重大变化。如果是政策驱动的单边行情,比如限产政策直接改变了卷螺供应结构,那价差中枢可能已经系统性抬升,此时继续持有旧的中枢判断就是拿命扛风险。
这套策略实盘下来的胜率大概在60%-70%之间,单笔盈利不算多,但回撤也不太剧烈。它的主要风险在于:卷螺价差的中枢不是永远不变的。2021年之后,制造业景气度长期好于房地产,热卷价格相对螺纹钢走强,如果你还用过去两年的平均价差做中枢,就会有一段时间连续亏损。我的解决方案是给中枢加上一个斜率项,用线性回归估计价差的中长期趋势,再用回归残差代替原始价差做均值回归。这是一个很实用的调整,强烈建议做配对套利的朋友试一试。
3.2 跨期价差的展期收益逻辑:近远月合约之间的结构性矛盾
跨期套利和跨品种套利不太一样,它不做两个不同商品的相对强弱,而是做同一个商品不同月份合约之间的价差,赌的是市场对“近月供需”和“远月供需”的定价差异会不会修复。
跨期价差的核心是展期收益(roll yield)逻辑。比如在强现实弱预期的格局下,近月合约价格远高于远月合约,价差为正且偏高,这叫“期货升水”倒挂结构(也叫back结构)。此时你如果做空近月、做多远月,不仅能赚价差收敛的钱,还能不断获取展期带来的正收益。反过来,在“弱现实强预期”的格局下,远月价格高于近月,形成contango结构,此时做多远月、做空近月,展期收益才对你有利。
实操中我常看的一个指标是“月差百分位”——即当前月差在近一年月差分布中所处的位置。如果月差分位在90%以上,说明近月相对远月极强,这时要么是现货紧缺(back加剧),要么是远月被过度悲观定价,可以考虑反向做空近月做多远月(具体是否下得去手要结合库存和开工率判断)。如果月差分位跌到10%以下,说明近月极弱,市场存在潜在的超跌反弹机会。
这里有一个非常重要的执行细节:跨期套利一定要关注合约的流动性。有的远月合约成交量很低,你一开仓就把盘口打崩了。流动性不足的合约,即使价差再“诱人”,我也不碰。常用主力合约和次主力合约配对,流动性相对有保障。
3.3 强弱动量:价差趋势也是一种趋势,不是所有套利都在“回归”
我在前面讲了均值回归,又讲了展期收益,但现在我要说一个反直觉的事实:大部分时候,价差是有惯性的,而不是始终在回归。
我之前有段时间特别迷信均值回归,看到Z-score到了2以上就忍不住要反向开仓。但后来统计了一下实盘记录,发现不少亏损单都发生在“价差刚开始突破历史极值”的时候。原因很简单:价差之所以能突破历史极值,往往是因为产业基本面发生了显著变化。比如一项环保政策导致铁矿石需求下降,同时焦煤供应收缩,那么焦炭和焦煤的比价可能一路走阔,你在比价偏高时做空比价,等于逆着大趋势接飞刀。
后来我给自己定了一条纪律:先用趋势过滤器判断当前市场环境适不适合用均值回归策略。趋势过滤器可以是MACD周线,也可以是价格与60日均线的关系,甚至只是简单地看“价差最近20个交易日是上涨还是下跌”。
- 如果价差在过去20个交易日内表现为明显单边走势,且产业逻辑也支持这种单边(比如库存结构继续分化),那我会放弃逆势回归,转做价差动量的跟随单。
- 如果价差虽然波动大,但总体上在历史均值区间来回震荡,没有明显的产业趋势,那均值回归策略就能正常发挥作用。
这相当于在同一组价差上安装两个模型,平时跑均值回归,趋势启动后切换成动量跟踪。这个做法听起来简单,但能避开大部分“策略失效”的时段。我把它叫做“同一价差的双模运行”,是我做套利以来最有价值的一个结构调整。
4. 选不准参数别硬上:从手动盘感进化到半自动化的中间态
很多人看完上面的内容,第一反应是“我直接去写个程序全自动跑”。且慢,一个从零开始做套利的人,我不建议一上来就搞全自动。更合理的路径是从手动交易过渡到半自动化,逐步建立对价差的“盘感”,再做规则化。
4.1 先用“模拟信号”练手:标记但不执行
我自己早期的做法是:每天收盘后,对重点关注的几组价差,手动计算当天的Z-score,然后在图表上标记“如果严格执行规则,今天应该开多还是开空”,并记录下来。这个过程不涉及真金白银,但它能帮你建立最直观的感受——什么时候信号会连续出现,什么时候信号刚开仓就被打止损,哪些时段策略表现特别差。
坚持一两个月后,你自然会对这套策略的“脾气”有感觉。这个“感觉”非常重要,因为量化信号只能告诉你现在该做什么,但它不能告诉你当前市场环境是不是适合执行。有了大量手动标记的经验,你对信号的可信度会有一个模糊但有效的判断。
4.2 交易参数的敏感性分析:找到“钝感区”
当你想把策略从手动变成半自动,第一件事不是写代码,而是做参数敏感性测试。拿均值回归策略来说,开仓阈值可以是1.5倍标准差,也可以是2倍、2.5倍;止损可以是3倍标准差,也可以是固定金额止损。你把参数从小到大扫一遍,看策略在哪个区间表现稳定。
如果策略只在参数设定得非常精确时才赚钱,那说明这个策略本身是“过拟合”的,换到实盘大概率失效。如果策略在一个合理的参数范围内都能稳定盈利,那说明它抓住了市场真实的统计规律,值得继续打磨。
我自己的筛选标准很简单:至少找到连续的一段参数区间(比如阈值从1.4到2.0),策略的最终收益率和最大回撤都不能有剧烈波动。满足这一条,才允许上实盘。
4.3 实盘初期模拟盘与极小仓位并行
实盘初期,我用的方法是:同一套信号,在模拟盘和实盘同时运行,实盘仓位控制在总资金的10%以内。这样既能验证行情软件的实时推送是否正常,也能观察真实盘口的滑点和成交情况。这里要特别提醒,模拟盘成交价格通常是按对手价成交的,但实盘还有排队、吃单、盘口厚度等问题。如果模拟盘和实盘的成交价差经常达到好几个最小变动价位,说明这个品种不适合你的策略,要么放弃,要么降低交易频率。
只有在极小仓位实盘运行超过两个月、样本足够多之后,我才会逐步把仓位加上来,最高不超过总资金的30%。套利虽然风险可控,但杠杆依然会放大亏损,资金管理再怎么强调都不为过。
5. 交易执行中的真实摩擦:滑点、保证金、逼仓与尾部风险
策略逻辑只是交易的一部分,执行层面的细节往往决定了策略“纸面收益”和“实际收益”之间的差距。这一节我把套利实盘中最容易吃暗亏的几个环节展开讲。
5.1 滑点:套利交易里最隐蔽的利润杀手
套利策略通常单笔盈利空间有限,滑点对它的影响比对单边趋势策略大得多。比如你做卷螺价差,开仓时买入热卷、卖出螺纹钢,如果你分别去市价追单,两边各吃2个滑点,再算上手续费,这笔交易的成本可能已经占到预期利润的30%以上。
降低滑点的方法有哪些?我的经验是:
- 尽量用限价单,挂在中间价或略优于中间价的位置,不要急着成交。
- 两个腿的下单顺序讲究“先下单流动性差的一腿,再下流动性好的一腿”。流动性差的合约一旦被吃掉,马上用流动性好的合约对冲剩余敞口。
- 避免在开盘前几分钟和收盘前几分钟做大额建仓,那段时间盘口波动剧烈,点差最宽。
- 在实盘系统里设置滑点成本模型,默认每边按1-2个tick计算,回测时就扣掉这部分成本。
很多人做历史回测时把滑点设成0,然后把策略过去一年的收益率拉出来,看得心潮澎湃。我建议所有人在回测时至少加上双边各1个tick的滑点,如果你做的品种流动性一般,加到2个tick也不算多。
5.2 保证金占用与资金使用效率:别被“浮盈”迷惑
套利交易的保证金占用怎么算,直接影响资金使用效率。跨期套利同一品种,交易所通常会给保证金优惠;跨品种套利一般没有优惠,按两腿保证金简单相加。
举个例子,螺纹钢价格3500元/吨,一手10吨,交易所保证金比例7%,那么一腿保证金为3500107%=2450元。如果你做了螺纹钢和热卷的配对,两腿按期货公司加收后的比例算,可能需要6000元左右的保证金。如果价差波动100个点,一手盈亏为1000元。年化收益率的计算必须建立在实际占用的保证金和预留风险资金基础上,而不是只看价差波动。
除了保证金,我还特意预留了相当于套利组合保证金30%-50%的“缓冲资金”,用于应对价差往不利方向波动时的浮亏和追加保证金需求。套利单边浮亏可能不大,但如果遇到极端行情,比如两个品种同时封涨跌停,你连平仓的机会都没有,账户资金不够就会被强平。这种尾部风险必须提前用资金冗余对冲。
5.3 合约临近交割:逼仓、限仓与流动性骤降的三重麻烦
做套利交易,最怕的就是持仓进入交割月前的一段时间。这时候近月合约流动性迅速下降,买卖价差拉大,投机资金撤退,很容易发生“砍仓都砍不动”的情况。更麻烦的是,临近交割时部分资金会进场逼仓,把近月价格推到极不合理的水平,价差瞬间被打到历史极值。
我的处理原则是:套利持仓最晚在进入交割月前第10个交易日全部平掉,绝不拖到最后几天。有些策略可能在最后几天利润最丰厚,但那属于“火中取栗”,长期来看大概率会把之前赚的钱还回去。
另外,不同品种的限仓规则差异很大。你如果资金量上了一定规模,要在开仓前就查清楚交易所对相关合约的限仓规定,免得持仓临近限额被迫减仓,打乱整个策略的节奏。
5.4 尾部风险:最怕的不是亏钱,而是“想止损却止不了”
套利交易者经常忽略尾部风险,因为大部分时间它都不出现。但一旦出现,往往就是致命性的。
比如2016年“双十一”夜盘,多个品种在几分钟内从涨停打到跌停,很多看似稳健的套利组合出现了两条腿同时剧烈波动的情况,价差被瞬间拉出历史极值。如果你用的是全自动策略,止损单在这种行情下根本成交不了——跌停板上全是卖单,你的平仓单排在后边,等开板时可能已经亏掉几个月的利润。
应对尾部风险,我有几个习惯:
- 永不加杠杆到极限,预留足够的缓冲资金。
- 每笔策略都设置“熔断线”,即当账户当日亏损达到某个比例时,无条件平掉所有持仓,当天不再开新仓。
- 对涉及临近交割月的持仓,提前用软件设置“交割月前第N个交易日自动平仓”的提醒。
- 对关联度过高的策略(比如同时跑卷螺、焦煤焦炭等多个策略,但它们本质上都在交易同一类宏观逻辑),账户总风险需要合并计算,不能一个个单独看。
尾部风险不是靠预测来的,是靠仓位控制和应急预案扛过去的。
6. 策略从挖据到上线的工程化流程:回测、模拟、实盘三步走
最后聊一下我自己整理出来的套利策略上线流程。这个流程不一定适合所有人,但对没有专职量化团队的个人交易者来说,是一套性价比比较高的执行路径。
6.1 回测环境搭建与回测陷阱
回测工具可以选择Python的backtrader、聚宽、米筐这类在线平台,也可以用Excel做简单测算。我个人的习惯是用Python,因为它处理数据和做统计分析更方便。
回测时需要注意几个陷阱:
- 请务必用“未来函数”检测器。举个常见的例子:你在某个交易日用“当日收盘后的全部数据”计算当日价差信号,然后在同一天收盘价附近成交,这没问题;但如果你不小心用了第二天的数据来计算信号,再回溯到第一天成交,那回测结果就完全失真了。
- 手续费和滑点必须在回测里体现。套利策略换手率高,仅仅1个tick的滑点就能吃掉不少利润。
- 回测时间最好覆盖一轮完整的牛熊周期,至少包含一次大的行情转折。如果只回测单边上涨行情,你只会得到“所有策略都赚钱”的错误结论。
回测评估指标方面,我最关注的是“收益回撤比”和“连续亏损次数”。一个策略如果连续亏损超过6次,即使历史年化收益很诱人,我也倾向于降低预期。因为连续亏损考验的不仅是策略本身,更是交易者的执行纪律——很多人就是死在“连续亏损几次之后不敢再按信号开仓”上。
6.2 样本外验证与参数终身管理
在正式使用一个策略前,我会把历史数据切分成两段:前70%的数据用来开发和调参,后30%的数据完全不参与调参,只用来做样本外验证。如果策略在样本外依然能保持和样本内类似的收益回撤特征,我才认为它具备实盘条件。
但样本外验证并不是一劳永逸。市场结构会变,品种相关性会变,策略的参数会慢慢失效。我的习惯是每季度做一次全面的策略体检:重新计算近半年价差的均值、标准差、回归系数,与策略开发时的假设做对比。如果核心参数发生了明显漂移,就减仓观察或暂停策略,而不是机械地继续执行。
6.3 实盘落地时的工具选择与自动化方案
到了实盘阶段,技术方案可以选择期货公司提供的条件单、第三方交易终端,也可以自己写Python自动交易程序。对于大多数个人交易者,我的建议是先从条件单和半自动提醒开始——把策略信号算好,推送到手机,人工确认后再下单,先避免情绪化操作。
当你积累了足够信心,再上全自动程序。我自己的实盘架构是:
- 数据层:每天收盘后从数据接口拉取行情,更新本地数据库。
- 策略层:Python计算各价差的Z-score、趋势过滤器和开平仓信号。
- 执行层:通过期货公司提供的API接口下单,但每一笔交易都加上硬性的风控检查,包括最大持仓数、最大回撤、单日亏损熔断等。
这套架构不复杂,但胜在稳定。我从手动交易过渡到这套半自动化流程,花了大概半年时间。回头看,最慢的不是代码实现,而是心态转换——从“看到信号就兴奋”到“信号来了先问一句现在适不适合执行”。
7. 写在最后:套利交易是一场“预期管理”而不是“预测游戏”
分享几个我在实操中逐渐沉淀下来的体会吧。
第一,不要追求胜率100%,甚至不要追求胜率80%。一套胜率在60%出头、盈亏比接近1:1的套利策略,只要能严格控制单笔亏损、在连续回撤时不乱改参数,长期跑下来效果并不差。真正杀死账户的,往往是“某段时间策略连续盈利,你觉得它稳定了,于是开始加大仓位,然后刚好碰上一波极端行情”。
第二,价差的均值和中位数不是一成不变的。产业结构的变迁、进出口政策的调整、替代品供需的变化,都会让价差的“合理区间”发生永久性位移。建议每过一段时间就重新审视你正在交易的价差组合,问自己一个问题:当前价差偏离均值,到底是情绪性错杀,还是基本面的新常态?回答不了这个问题的时候,选择观望也不丢人。市场永远有机会,本金没了才是真出局。
第三,套利交易能给人最大的礼物不是“稳定盈利”,而是“不用每天都做预测的从容”。单边交易者每天都要回答“明天涨还是跌”,套利交易者只需要回答“两者之间的价差是否极端”。这个问题更简单、更可以量化、也更容易用纪律去执行。
如果你也想开始做套利,别急着写代码,也别急着开实盘。先找两组你最熟悉的品种,手动记录一个月的价差和信号,感受一下策略在震荡期和趋势期的表现差异。这个积累过程会让你后面的每一步都走得踏实。做交易这件事,快就是慢,慢就是快。