前言

做国内期货量化,很多人用 K 线算指标:例如 5 分钟收盘价上算 60 根均线,收盘价在均线上方做多、下方做空。天勤量化里,K 线通过 api.get_kline_serial(合约代码, 周期秒数, data_length=N) 订阅,返回一张类似表格的数据,每一行是一根 bar,列里有 openhighlowclosedatetime 等。第三个参数 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 线配置参考,不构成投资建议。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐