前言
做日内或高频一点的期货策略时,我会用天勤量化的 get_tick_serial 盯成交变化;Tick 推送量比 K 线大得多,若每一帧都跑完整信号逻辑,CPU 和日志都会吃不消。下面写订阅方式、与 K 线混用时的时钟对齐,以及我常用的降频办法。
一、订阅与读取时机
from tqsdk import TqApi, TqAuth, TqSim
api = TqApi(TqSim(), auth=TqAuth("账户", "密码"))
ticks = api.get_tick_serial("SHFE.rb2510")
kline = api.get_kline_serial("SHFE.rb2510", 60)
while True:
api.wait_update()
if api.is_changing(ticks.iloc[-1], "datetime"):
last_price = ticks.iloc[-1]["last_price"]
# 仅在 tick 时间戳变化时处理
与 get_quote 一样:先 wait_update,再读 iloc[-1]。Tick 序列是 DataFrame,最后一行对应当前最新 tick。
二、Tick 与 K 线不要混用时钟
| 数据源 | 适合 |
|---|---|
get_tick_serial | 盘口变化、成交驱动、细粒度止损 |
get_kline_serial | 均线、突破、bar 收盘信号 |
若信号在 K 线收盘产生、执行用 tick 价格,要明确两者 datetime 可能不一致。建议信号层固定用一种序列,执行层再用 get_quote 读对手价。
三、降频:只关心成交变化时
全量 tick 更新时,可在逻辑层加过滤:
last_dt = None
while True:
api.wait_update()
if not api.is_changing(ticks.iloc[-1], "datetime"):
continue
dt = ticks.iloc[-1]["datetime"]
if dt == last_dt:
continue
last_dt = dt
# 每个新 tick 时间戳只处理一次
若只关心价格跳变,可再比较 last_price 与上一帧差值,小于 1 个 tick 则跳过。
四、数据长度与内存
data_length 控制保留 tick 条数。日内策略可设数千;多合约同时订阅 tick 时,条数乘合约数,内存与 CPU 压力会明显上升。非必要不订 tick,分钟策略用 K 线即可。
五、与回测、模拟的差异
回测 tick 粒度回放比 K 线慢;模拟盘 tick 推送节奏接近实盘。同一策略在 K 线回测通过,仍应在 tick 或模拟环境验证止损类逻辑。
总结
get_tick_serial 适合要跟随成交节奏的逻辑,但必须配合 is_changing 和去重,避免在每个微小更新上重算指标。与 K 线并用时,分清信号时钟与执行时钟,能减少大量“信号有了、价格却不对”的排查时间。
FAQ
1)tick 与 quote 区别?
tick 是序列历史+最新;quote 是当前行情快照。日内微观用 tick,一般下单参考可用 quote。
2)订阅 tick 后还能用 TargetPosTask 吗?
可以,同一 TqApi 内共用 wait_update。
3)夜盘 tick 量很大怎么办?
加强过滤,或仅在关键时段订阅 tick。
4)多合约 tick 如何管理?
每合约一条 get_tick_serial,循环内分别 is_changing。
5)tick 序列长度不足?
增大 data_length;冷启动阶段注意 len(ticks) 再算指标。
风险提示
本文用于期货量化技术实践讨论,不构成投资建议。

3480

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



