问题描述
在API文档里面,提到了tick事件,handle_tick(context, tick)在订阅的标的产生tick事件时被调用。如果没有 tick 事件, 则不会被调用。
可是我在API文档里面,却没有找到对tick事件的说明或解释。
解决方案
在 JoinQuant(聚宽)量化平台中,Tick 事件是高频(Tick级别)策略运行的核心驱动力。要理解 Tick 事件,首先需要理解什么是 Tick 数据。
1. 什么是 Tick 数据?
Tick 数据指的是交易所发布的盘面行情快照。它记录了某一特定时刻市场上该标的的最新成交价、成交量、买卖盘挂单(如买一到买五、卖一到卖五)等信息。
在 JoinQuant 平台中,不同品种的 Tick 数据快照频率如下:
- 股票/场内基金/指数:每 3秒 产生一次快照(提供买五卖五数据)。
- 期货:每 0.5秒 产生一次快照(提供买一卖一数据)。
2. 什么是 Tick 事件?
Tick 事件就是指**交易所产生并推送了一个新的 Tick 数据(行情快照)**这一动作。
在你的量化策略中,如果你将运行频率设置为 tick 级别,并且通过 subscribe() 函数订阅了某个标的(例如平安银行 000001.XSHE),那么:
- 每当平安银行在真实市场中产生了一个新的 3秒快照,JoinQuant 系统就会捕捉到这个Tick 事件。
- 系统捕捉到事件后,会自动调用你策略中编写的
handle_tick(context, tick)函数。 - 如果没有新的快照产生(例如停牌、非交易时间,或者某些极度冷门标的在某段时间内没有任何盘口变化),就不会产生 Tick 事件,
handle_tick也就不会被调用。
3. 如何在策略中使用 Tick 事件?
要让 handle_tick 正常工作,你需要完成以下几个步骤:
- 设置运行频率:在创建回测或模拟交易时,频率必须选择为
tick。 - 开启真实价格模式:Tick 级回测必须使用真实价格模式
set_option('use_real_price', True)。 - 订阅标的:在
before_trading_start或其他初始化函数中,使用subscribe(security, 'tick')订阅你关注的标的。 - 编写处理逻辑:在
handle_tick(context, tick)中编写你的高频交易逻辑。
示例代码:
import jqdata
def initialize(context):
# 开启真实价格模式(Tick回测必须)
set_option('use_real_price', True)
# 设置基准和手续费等...
def before_trading_start(context):
# 订阅平安银行的 tick 事件
subscribe('000001.XSHE', 'tick')
# 当平安银行产生新的行情快照(每3秒)时,此函数被触发
def handle_tick(context, tick):
# tick 对象包含了当前的盘面快照信息
print(f"时间: {tick.datetime}, 最新价: {tick.current}, 买一价: {tick.b1_p}, 卖一价: {tick.a1_p}")
# 在这里编写你的高频交易逻辑
# if tick.current > ...:
# order('000001.XSHE', 100)
def after_trading_end(context):
# 收盘后取消订阅
unsubscribe_all()
4. tick 对象包含哪些信息?
当 handle_tick 被触发时,传入的 tick 参数是一个对象,包含了当时的盘面快照信息,主要属性包括:
tick.code: 标的代码tick.datetime: tick 发生的时间tick.current: 最新价tick.high/tick.low: 截至到当前时刻的最高价/最低价tick.volume/tick.money: 截至到当前时刻的累计成交量/成交额tick.a1_p~tick.a5_p: 卖一价到卖五价tick.b1_p~tick.b5_p: 买一价到买五价tick.a1_v~tick.a5_v: 卖一量到卖五量tick.b1_v~tick.b5_v: 买一量到买五量
总结
简单来说,Tick 事件就是“行情刷新了一下”。handle_tick 就是一个监听器,只要你订阅的股票行情刷新了,它就会立刻告诉你:“行情更新了,这是最新的盘口数据(tick对象),你要不要下单?”