期货 K 线策略均线慢半拍:天勤 data_length 缓冲长度估算
前言
做国内期货量化,很多人用 K 线算指标:例如 5 分钟收盘价上算 60 根均线,收盘价在均线上方做多、下方做空。天勤量化里,K 线通过 api.get_kline_serial(合约代码, 周期秒数, data_length=N) 订阅,返回一张类似表格的数据,每一行是一根 bar,列里有 open、high、low、close、datetime 等。第三个参数 data_length 表示「最多向服务器要多少根 K 线缓存在内存里」——它不是均线周期,而是历史缓冲有多长。
若你算 60 周期均线,却把 data_length 设成 60 甚至更小,表格里可用于滚动计算的历史不够,会出现大量 nan(Not a Number,表示算不出来),或者均线值「慢半拍」:市场已经变了,程序里的均线还在用很短的历史,信号比你在行情软件里看到的迟钝。这不是策略公式错了,而是天勤订阅参数配短了。下面说明怎么估 data_length、和 iloc[-2] 触发如何配合。
一、先弄清几个名词
| 名称 | 是什么 | 和 data_length 的关系 |
|---|---|---|
| K 线 / bar | 固定周期内开高低收一根柱子 | 一行数据 |
duration_seconds |
周期秒数,300=5 分钟,60=1 分钟 | get_kline_serial 第二个参数 |
data_length |
最多保留多少根 K 线 | 第三个参数,本文主角 |
close |
收盘价列 | 算均线用这一列 |
datetime |
该 bar 的业务时间 | 判断是否新 bar |
iloc[-1] |
最后一行,常是正在形成的 bar | 用它的 datetime 是否变化判断新 bar |
iloc[-2] |
倒数第二行,已收盘 bar | 信号常在此计算,避免用未收盘数据 |
nan |
非数字 | 样本不足时均线为 nan,不能交易 |
tafunc.ma |
天勤自带均线函数 | 对 kl.close 滚动计算 |
is_changing(..., "datetime") |
新 K 线到来时触发 | 与 data_length 配合使用 |
二、为何 data_length 太小会「慢半拍」
均线 60 的含义:用最近 60 根已收盘 K 线的收盘价求平均。若 data_length=70,表里只有 70 行,滚动窗口在边界处不稳定;若算的是 ma100 却只给 70 行,前面很多行是 nan,-2 位置的 ma 刚有值时,实际参与平均的历史可能比 100 根短,反应就滞后。
表现:
- 同一公式,你的程序信号比同花顺、快期客户端慢几根 K 线;
- 两台服务器
data_length不同,同一时刻信号不一致; - 换月订阅新合约后,问题更明显(新合约本身历史也短,需另做就绪判断)。
这与「新上市合约历史本来就短」不同:那是市场没有足够 K 线;本文是「有历史但你没向天勤要够」。
三、估算公式与示例
data_length >= 最长指标周期 + 缓冲
缓冲建议 20~100,或最长周期的 0.5~1 倍
若同时用 ma60 和 ma120,按 120 加缓冲估,不要按 60。
from tqsdk import tafunc
MA_LONG = 120
BUF = 80
symbol = "SHFE.rb2510"
kl = api.get_kline_serial(symbol, 300, data_length=MA_LONG + BUF)
ma60 = tafunc.ma(kl.close, 60)
while True:
api.wait_update()
if not api.is_changing(kl.iloc[-1], "datetime"):
continue
import math
if math.isnan(ma60.iloc[-2]) or math.isnan(kl.close.iloc[-2]):
continue # 指标未就绪,跳过
# 在 iloc[-2] 上根据 ma60 与 close 产生信号
get_kline_serial 应在循环外调用一次;data_length 在启动时定好,运行中改大通常要重启进程重订。
四、内存与三环境一致
data_length 过大,多合约多周期时占内存。在「够算指标」和「别无限大」之间折中,例如 200~500 对很多策略够用。回测(TqBacktest)、快期模拟(TqKq)、实盘(TqAccount)三环境应用相同的 data_length 和相同指标周期,否则同一历史日期上信号会对不上。
五、新合约还要单独判断
即使 data_length 设得够大,新挂牌合约服务器返回的行数可能仍少于你的均线周期,会出现 nan。此时应跳过信号、打 warmup 日志,等有效 bar 足够再交易,而不是强行比较 nan 与价格大小。
总结
K 线 data_length 设小了,天勤不会报错,但会让指标暗地里滞后或长期 nan,期货量化程序就像「慢半拍」。data_length 是向天勤要的 K 线根数缓冲,不是均线周期;估长度时以最长指标周期加缓冲为底线,在 iloc[-2] 上检查非 nan 再交易。把该参数写进配置文件,对照 K 线表实际行数排查,对照配置与 K 线表行数即可分清:是公式问题,还是订阅历史根本没要够。
FAQ
1)运行中能改大 data_length 吗?
一般启动时定好;改订阅常需重启 Python 进程。
2)程序主要看 tick,K 线只作过滤?
按过滤所用 K 线周期估 data_length 即可。
3)主连 KQ.m@ 会更长吗?
主连历史通常更长,但仍要满足你的指标周期。
4)nan 时默认空仓还是跳过?
应 skip 并记录 warmup,勿随意默认为 0 手或满仓。
风险提示
以上内容用于 K 线配置参考,不构成投资建议。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)