问题描述
get_ticks函数是3秒钟一个tick吗?这个函数用的多吗?有什么好的用法?
解决方案
get_ticks 函数频率解答
关于 get_ticks 函数的数据频率,并不全都是3秒钟一个tick,具体取决于你查询的标的类型:
- 股票、场内基金、指数:是的,这些标的提供的是每3秒一次的快照数据(包含买五卖五盘口)。
- 期货:期货的 tick 数据频率更高,提供的是每0.5秒一次的快照数据(包含买一卖一盘口)。
这个函数用的多吗?
get_ticks 的使用频率取决于你的交易策略类型:
- 日频/分钟频策略(不常用):如果你做的是趋势跟踪、基本面多因子等中低频策略,通常使用
get_price或get_bars获取分钟或日线数据就足够了,很少会用到get_ticks。 - 高频/日内策略(非常常用):如果你做的是日内 T+0、高频做市、盘口微观结构分析、或者需要极精细的滑点测算,
get_ticks是必不可少的核心函数。它可以让你看到订单簿(Order Book)的细节。
get_ticks 的基础用法
from jqdata import *
# 获取平安银行最近10条tick数据,返回DataFrame格式
df = get_ticks('000001.XSHE', end_dt='2023-10-10 10:30:00', count=10, df=True)
print(df)
get_ticks 的高级/优秀用法场景
利用 Tick 数据包含的盘口信息(买卖报价和挂单量),可以衍生出很多高级玩法:
1. 计算盘口买卖力量失衡(Order Book Imbalance, OBI)
通过分析买一到买五、卖一到卖五的挂单量,可以判断短期内多空力量的对比,用于预测未来几秒到几分钟的价格微观走势。
def calculate_obi(tick_df):
# 计算买方总挂单量 (买一到买五)
bid_vol = tick_df['b1_v'] + tick_df['b2_v'] + tick_df['b3_v'] + tick_df['b4_v'] + tick_df['b5_v']
# 计算卖方总挂单量 (卖一到卖五)
ask_vol = tick_df['a1_v'] + tick_df['a2_v'] + tick_df['a3_v'] + tick_df['a4_v'] + tick_df['a5_v']
# 计算失衡比例:(买单量 - 卖单量) / (买单量 + 卖单量)
# 值越接近1,说明买盘越强;越接近-1,说明卖盘越强
obi = (bid_vol - ask_vol) / (bid_vol + ask_vol)
return obi
# 获取数据并计算
ticks = get_ticks('000001.XSHE', end_dt='2023-10-10 10:30:00', count=100, df=True)
ticks['OBI'] = calculate_obi(ticks)
2. 识别大单砸盘或托盘
通过对比相邻两个 Tick 的成交量(volume 字段的差值)和盘口挂单的变化,可以推测是否有大资金在主动扫单或被动挂单。
# 计算相邻Tick的成交量差值(即这3秒内的真实成交量)
ticks['tick_volume'] = ticks['volume'].diff()
# 找出3秒内成交量异常放大的时刻
mean_vol = ticks['tick_volume'].mean()
large_orders = ticks[ticks['tick_volume'] > mean_vol * 5] # 假设大于平均值5倍为大单
3. 优化算法交易的执行(VWAP/TWAP)
在执行大额订单时,为了减少市场冲击,通常会将大单拆分成小单。利用 get_ticks 实时监控盘口流动性:
- 当买一挂单量充足时,主动卖出;
- 当买卖价差(Spread = a1_p - b1_p)变大时,选择被动挂单等待成交。
4. 过滤无效的 Tick 数据
get_ticks 有一个 skip 参数(默认为 True)。在实盘中,有些 Tick 只有盘口挂单变化,但没有实际成交。如果你的策略只关心真实成交,保持 skip=True;如果你的策略是基于订单簿变化的(比如做市策略),建议设置 skip=False 以获取所有盘口变动快照。
总结
get_ticks 是一个强大的微观数据获取工具。如果你致力于挖掘日内 Alpha、研究高频特征或优化交易执行,深入研究 Tick 数据中的 a1_v ~ a5_v 和 b1_v ~ b5_v 字段,将会为你打开量化交易的新大门。