3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,进行 Tick 级别交易 时,可以通过 tick_data(context, data) 事件函数获取高频的盘口数据。若您开通了 Level 2 行情,买卖档位(bid_grp 和 offer_grp)的第一档中会包含详细的**委托队列(逐笔队列)**信息。
以下是关于如何在 tick_data 的 data 字典中提取买一和卖一逐笔委托队列的详细解析与代码实现。
tick_data 数据字典结构解析在 tick_data(context, data) 中,data 参数是一个字典:
'600570.SS')tick(当前 tick 数据)、order(最近一条逐笔委托)和 transcation(最近一条逐笔成交)的字典。其中,data[security]['tick'] 是一个 DataFrame,其包含的 bid_grp(买档)和 offer_grp(卖档)是字典类型。在 Level 2 行情下,其结构如下:
bid_grp (买档): {1: [价格, 委托量, 委托笔数, 委托队列], 2: [价格, 委托量, 委托笔数], ...}offer_grp (卖档): {1: [价格, 委托量, 委托笔数, 委托队列], 2: [价格, 委托量, 委托笔数], ...}注意:只有第一档(买一
1/ 卖一1)的列表里,第 4 个元素(索引为3)才包含委托队列字典(格式为{位置: 委托量},例如{1: 33200, 2: 104800, 3: 1000})。
由于 data[security]['tick'] 返回的是 DataFrame,在实际提取时,需要注意数据格式的转换(通常需要使用 eval() 或直接读取字典)。
tick 数据:tick_df = data[security]['tick']bid_one = eval(tick_df['bid_grp'][0])[1] (或直接通过 tick_df['bid_grp'].iloc[0][1],具体取决于平台返回的序列化状态)bid_queue = bid_one[3] (第 4 个元素)offer_queue = eval(tick_df['offer_grp'][0])[1][3]以下是一个完整的 ptrade 策略代码,展示了如何在 tick_data 中实时获取并打印买一、卖一的逐笔委托队列:
def initialize(context):
# 设置操作的股票池
g.security = '600570.SS' # 恒生电子
set_universe(g.security)
# 开启相关参数(确保接收 L2 数据)
set_parameters(tick_data_no_l2="0")
def tick_data(context, data):
security = g.security
if security not in data:
return
try:
# 1. 获取 tick 数据的 DataFrame
tick_info = data[security]['tick']
# 2. 提取买档和卖档字典
# 注意:在 ptrade 中,DataFrame 里的 dict 字段可能需要 eval 解析
bid_grp = eval(tick_info['bid_grp'][0]) if isinstance(tick_info['bid_grp'][0], str) else tick_info['bid_grp'][0]
offer_grp = eval(tick_info['offer_grp'][0]) if isinstance(tick_info['offer_grp'][0], str) else tick_info['offer_grp'][0]
# 3. 提取买一和卖一数据列表
# 格式为: [价格, 委托量, 委托笔数, 委托队列]
bid_one = bid_grp.get(1)
offer_one = offer_grp.get(1)
if bid_one and len(bid_one) > 3:
bid_price = bid_one[0] # 买一价
bid_volume = bid_one[1] # 买一总委托量
bid_queue = bid_one[3] # 买一逐笔委托队列 (dict)
log.info(f"【买一】价格: {bid_price}, 总量: {bid_volume}, 队列前5笔: {list(bid_queue.items())[:5]}")
if offer_one and len(offer_one) > 3:
offer_price = offer_one[0] # 卖一价
offer_volume = offer_one[1] # 卖一总委托量
offer_queue = offer_one[3] # 卖一逐笔委托队列 (dict)
log.info(f"【卖一】价格: {offer_price}, 总量: {offer_volume}, 队列前5笔: {list(offer_queue.items())[:5]}")
except Exception as e:
log.error(f"提取 L2 委托队列出现异常: {e}")
def handle_data(context, data):
# tick 级别策略中,handle_data 可保持为空
pass
{} 或 None。tick_data 每 3 秒触发一次,处理 L2 逐笔数据时,尽量避免复杂的循环计算,以防引起主线程卡顿。建议使用 set_parameters(tick_data_no_l2="1") 来按需关闭不需要的 L2 逐笔推送以提升性能。