问题描述
解决方案
在 JoinQuant(聚宽)平台上进行高频交易策略开发时,针对获取最新 Tick 数据和历史 Tick 数据,分别使用以下两个不同的函数:
1. 获取最新 Tick 数据:get_current_tick
如果您需要获取当前时刻(回测或模拟交易中的当前逻辑时间)的最新一笔 Tick 快照数据,应使用 get_current_tick 函数。
- 函数用途:获取指定标的在当前时刻的最新 Tick 信息(包含最新价、买一卖一至买五卖五等盘口数据)。
- 适用场景:实时盘口判断、触发下单信号、盘中风控。
- API 文档摘要:
get_current_tick(security, dt=None, df=False) - 参数说明:
security: 标的代码(字符串或列表)。df: 是否返回 DataFrame 格式,默认为False(返回 Tick 对象)。
- 代码示例:
def handle_tick(context, tick):
# 获取平安银行当前的最新 tick 数据
current_tick = get_current_tick('000001.XSHE')
# 打印最新价
log.info(f"最新价: {current_tick.current}")
# 打印卖一价
log.info(f"卖一价: {current_tick.a1_p}")
2. 获取一段历史 Tick 数据:get_ticks
如果您需要获取过去一段时间内的 Tick 数据序列(例如过去10个 Tick 的价格走势,或者过去1分钟内的所有 Tick),应使用 get_ticks 函数。
- 函数用途:获取指定标的在指定时间段内或指定数量的历史 Tick 数据列表。
- 适用场景:计算盘口压力、分析短时成交量分布、计算高频因子。
- API 文档摘要:
get_ticks(security, end_dt, start_dt=None, count=None, fields=['time', 'current', ...], skip=True, df=False) - 参数说明:
security: 标的代码。end_dt: 截止时间。start_dt/count: 开始时间或获取的数量(二选一)。fields: 需要获取的字段列表。df: 是否返回 DataFrame 格式。
- 代码示例:
def handle_tick(context, tick):
# 获取平安银行截止到当前时间的过去 10 个 tick 数据
# context.current_dt 为当前策略逻辑时间
ticks = get_ticks('000001.XSHE', end_dt=context.current_dt, count=10, df=True)
# 计算过去10个tick的成交量总和
recent_vol = ticks['volume'].sum()
log.info(f"最近10个tick累计成交量: {recent_vol}")
总结对比
| 需求 | 推荐函数 | 返回数据类型 | 典型用途 |
|---|---|---|---|
| 获取当前最新切片 | get_current_tick |
Tick 对象 (或 Dict) | 实时决策,获取当前盘口挂单情况 |
| 获取历史时间序列 | get_ticks |
NumPy 数组 或 DataFrame | 趋势分析,计算短周期高频指标 |
常见问题 (Q&A)
Q: get_current_tick 和 tick 参数(在 handle_tick 中)有什么区别?
A: 在 handle_tick(context, tick) 函数中,参数 tick 本身就是触发该次调用的那个标的的最新 Tick 对象。如果你只需要当前触发事件标的的数据,直接使用参数 tick 即可,效率最高。如果你需要在处理 A 标的的事件时,去查询 B 标的的最新情况,则需要使用 get_current_tick('B标的代码')。
Q: get_ticks 可以获取多久以前的数据?
A: 股票及场内基金支持 2010-01-01 至今的数据;期货支持 2010-01-01 至今的数据。具体取决于您购买或拥有的数据权限。
Q: 高频策略中 df=True 会影响性能吗?
A: 会。创建 Pandas DataFrame 相比于直接使用 Tick 对象或 NumPy 数组会有额外的性能开销。在极度追求速度的高频策略中,建议设置 df=False,直接操作对象或 NumPy 数组。
Q: 为什么 get_current_tick 返回 None?
A: 如果当天截至当前时刻该标的尚未产生任何成交或 Tick 数据(例如停牌或开盘集合竞价前),该函数可能会返回 None。在使用前建议进行非空判断。