前言
自己做指标时,ma长度和 K 线对不上、前面一串nan、信号慢半拍,这三件事能把均值回归策略搞废。天勤自带tafunc和ta模块,能直接对 K 线序列算指标,但仍要遵守和 K 线同样的时点规则:信号用哪根 bar、冷启动怎么挡、指标更新何时触发。
下面用布林带均值回归策略写一套最小骨架,重点在长度对齐和iloc[-2]触发。
一、均值回归策略的信号结构
典型规则(示例):
- 收盘价触及下轨,偏多
- 收盘价触及上轨,偏空
- 回归中轨附近平仓
期货里要加波动和时段过滤,否则震荡市会反复打脸。本文先把指标层写对,过滤条件可后加。
均值回归最怕「指标对了、时点错了」:同一套布林带,用iloc[-1]和iloc[-2]回测曲线可能差一截。团队评审策略时,应先确认 bar 时点约定,再讨论参数 N、P,否则争论的都是表象。
二、用 tafunc 计算布林带
fromtqsdkimportTqApi,TqAuth,TqSim,TargetPosTask,tafunc api=TqApi(TqSim(),auth=TqAuth("账户","密码"))symbol="CZCE.MA609"kl=api.get_kline_serial(symbol,300,data_length=300)task=TargetPosTask(api,symbol)N=20P=2# 标准差倍数whileTrue:api.wait_update()ifnotapi.is_changing(kl.iloc[-1],"datetime"):continueiflen(kl)<N+5:continuemid=tafunc.ma(kl.close,N)std=tafunc.std(kl.close,N)up=mid+P*std dn=mid-P*std c=kl.close.iloc[-2]m=mid.iloc[-2]u=up.iloc[-2]d=dn.iloc[-2]ifany(map(lambdax:x!=x,[c,m,u,d])):# nan 检查continueifc<d:task.set_target_volume(1)elifc>u:task.set_target_volume(-1)elifabs(c-m)<(u-d)*0.1:task.set_target_volume(0)!= x是简易 nan 判断,生产环境可用numpy.isnan。
建议在 bar 切换时把c, m, u, d打一行调试日志,跑一两天模拟盘就能确认指标是否和 K 线对齐。若中轨长期偏离肉眼判断,优先查N是否含未收盘 bar、序列是否被意外截断。
三、冷启动与长度保护
| 问题 | 现象 | 处理 |
|---|---|---|
| 长度不足 | 指标全 nan | len(kl) < N + 缓冲跳过 |
| 用 iloc[-1] | 盘中信号乱跳 | 改用 iloc[-2] |
| 每帧重算 | CPU 偏高 | 仅 bar 切换时算 |
指标序列长度与 K 线一致,但决策时点仍由你控制。不要看见指标序列最后一行在变就下单。
冷启动阶段建议显式打日志「跳过:长度不足」,否则回测里前几百根 bar 静默无交易,容易被误判为策略失效。上线前用固定区间对比「含冷启动」与「截断后」的收益,心里有数。
四、过滤条件示例(可选)
atr=tafunc.atr(kl,14)ifatr.iloc[-2]<5:# 波动过低不做continue均值回归在极低波动段假突破多,加 ATR 门槛通常更稳。阈值按品种回测确定。
过滤条件不要堆太多:每加一个门槛,样本内曲线往往更好看,样本外却可能断崖。建议一次只加一个过滤,记录交易次数和胜率变化,再决定是否保留。
五、和 pandas 自写指标怎么选
- tafunc:和 K 线对齐方便,适合标准指标
- pandas 自写:灵活,但要自己保证长度和 nan
团队内建议标准指标优先 tafunc,定制因子再 pandas,减少重复造轮子。
若自写指标与 tafunc 混用,务必在单元测试里对比同一 K 线序列上最后一根已收盘 bar 的数值,误差应在浮点容忍范围内。混用而不校验,是回测与实盘「同逻辑不同结果」的常见来源。
总结
天勤TqSdk的tafunc解决的是「指标怎么算」,不是「什么时候交易」。布林带均值回归策略要稳定,必须把指标计算、nan 处理、bar 时点三件事绑在一起。先把骨架跑通,再加波动过滤和止损,研发路径会更顺,回测和实盘也更容易对齐。
指标层一旦固化成团队模板,后续换品种、换周期 mostly 只改 N、P 和过滤阈值,维护和排查成本会明显下降。这比每个策略各自写一套 rolling 更利于长期迭代。
FAQ
1)指标序列最后一行能用吗?
建议交易判定仍用已收盘 bar,即 K 线的 iloc[-2]。
2)tafunc 和 ta 模块区别?
按项目文档选用,关键是和 K 线 close 序列同长度。
3)布林带参数怎么设?
先用常见 20/2 做基线,再样本外验证,不要只盯样本内最优。
4)回归策略适合什么市况?
震荡偏多的阶段相对合适,趋势段要降仓或停机。
5)TargetPosTask 适合均值回归吗?
适合,频繁调仓时注意手续费和滑点假设。
风险提示
本文用于期货量化技术实践讨论,不构成任何投资建议。均值回归策略在趋势行情可能连续亏损,请充分测试后谨慎使用。