前言
多周期策略最常见的翻车,是 5 分钟已经金叉开多,30 分钟其实还在空头排列——因为两个周期的 K 线各算各的,没有在同一决策时点对齐。天勤 TqSdk 允许同时 get_kline_serial 订阅多个周期,但触发顺序、用哪根 bar 判定、谁先更新,都要在策略里写清楚。
回测里若用大周期“未来函数”式对齐,曲线往往过于好看;实盘用未完成 bar 或小周期抢先入场,又会出现方向频繁反复。问题不在多订几条 K 线,而在缺少“大周期方向状态变量”和统一的已收盘 bar 规则。
下面用“30 分钟定方向、5 分钟找入场”的趋势框架,给一套对齐写法。读完应能解释:为何要在 30 分钟 bar 切换时更新方向、为何 5 分钟只在方向允许时入场,以及如何抽查对齐是否正确。
一、订阅与触发顺序
from tqsdk import TqApi, TqAuth, TqSim, TargetPosTask
api = TqApi(TqSim(), auth=TqAuth("账户", "密码"))
symbol = "SHFE.rb2510"
kl5 = api.get_kline_serial(symbol, 300, data_length=200) # 5分钟
kl30 = api.get_kline_serial(symbol, 1800, data_length=200) # 30分钟
task = TargetPosTask(api, symbol)
dir30 = 0
def trend30(df):
if len(df) < 32:
return 0
m8 = df.close.rolling(8).mean().iloc[-2]
m21 = df.close.rolling(21).mean().iloc[-2]
if m8 > m21:
return 1
if m8 < m21:
return -1
return 0
def entry5(df, direction):
if direction == 0 or len(df) < 22:
return 0
# 示意:5分钟短均上穿长均才做多
s = df.close.rolling(5).mean().iloc[-2]
l = df.close.rolling(20).mean().iloc[-2]
if direction > 0 and s > l:
return 1
if direction < 0 and s < l:
return -1
return 0
while True:
api.wait_update()
# 大周期更新时刷新方向;小周期更新时尝试入场
if api.is_changing(kl30.iloc[-1], "datetime"):
dir30 = trend30(kl30)
if api.is_changing(kl5.iloc[-1], "datetime"):
sig = entry5(kl5, dir30)
task.set_target_volume(sig)
上面示例里 dir30 应用状态变量保存,避免未定义;生产代码应初始化为 0 并在 30 分钟 bar 切换时更新。要点是:大周期方向不必每根 5 分钟 K 线重算,但 5 分钟入场必须引用“最近一次已收盘的 30 分钟方向”。
二、统一用 iloc[-2] 已收盘 bar
两个周期都应使用已收盘 bar(如 iloc[-2])做信号,避免未完成 bar 抖动。否则会出现 5 分钟已入场、30 分钟收盘后方向反转的割裂。
| 周期 | 角色 | 更新触发 |
|---|---|---|
| 30 分钟 | 过滤方向 | is_changing(kl30..., "datetime") |
| 5 分钟 | 入场时机 | is_changing(kl5..., "datetime") |
三、data_length 分别估算
30 分钟均线周期若用到 21,则 kl30 的 data_length 至少 21 + 缓冲;5 分钟同理。不要两个周期共用一个偏小的长度。
四、性能与订阅负担
每多一条 get_kline_serial 就多一份更新。品种不多时问题不大;多品种多周期时,应只在对应周期 bar 切换时计算指标,避免每帧对两条序列全量 rolling。
五、回测验证建议
固定一段行情,打印每次 5 分钟入场时的 dir30 与两根 30 分钟均线值,人工抽查是否一致。多周期策略最怕“看起来逻辑对、时点错了”。
总结
多周期共振的关键是时点与状态变量,不是多订几条 K 线。天勤支持多周期订阅,策略应固定“大周期更新方向、小周期在方向允许时入场”,并统一已收盘 bar 规则。
上线前建议导出一段行情,手工核对几次 5 分钟入场时刻的 30 分钟均线方向,作为回归用例。多周期越多,CPU 负担越高,应只在对应周期 bar 切换时重算指标。若再加 tick 入场,须在文档里写明与 K 线周期的优先级,避免三套时钟打架。
对齐做对了,多周期过滤才是真正降频;对齐做错了,只是增加复杂度而不增加胜率。
FAQ
1)能否用 tick 代替 5 分钟入场?
可以,但触发更频,需额外降频与时段过滤。
2)方向为 0 时是否平仓?
由策略定义:可以空仓观望,也可以维持原仓,需写进规则。
3)换月后两个周期会断吗?
换月后序列刷新,冷启动与 data_length 要重新满足。
4)三个以上周期怎么办?
仍建议一个主过滤周期 + 一个执行周期,周期过多易过拟合。
风险提示
本文用于期货量化技术实践讨论,不构成任何投资建议。多周期策略请充分样本外验证。

431

被折叠的 条评论
为什么被折叠?



