问题描述
解决方案
在 PTrade 的 tick_data(context, data) 函数中,data 参数是一个字典,包含了当前时刻推送的高频行情数据。对于每一个标的(如 data['600570.SS']),其返回的值又是一个字典,包含三个核心键值:'tick'、'order' 和 'transcation'。
以下是这三部分的具体含义、区别及使用方法:
1. tick:快照数据 (Snapshot)
这是最基础的行情数据,即我们通常在交易软件上看到的盘口快照。
- 含义:包含了当前时刻的最新价、买卖五档(或十档)、成交量、成交额等汇总信息。
- 数据类型:
DataFrame。 - 权限要求:基础行情权限即可(Level 1 或 Level 2 均包含)。
- 常用字段:
last_px: 最新成交价。bid_grp/offer_grp: 买/卖档位信息(包含价格、挂单量)。business_amount: 当日累计成交数量。business_balance: 当日累计成交金额。
- 使用场景:判断当前价格是否触发交易信号,或者根据买一/卖一价进行报单。
2. order:逐笔委托 (Level 2 专属)
这是 Level 2 行情特有的数据,记录了交易所撮合引擎接收到的每一笔委托单的细节。
- 含义:展示了市场上所有的报单行为(挂单),无论是否成交。它可以反映市场深度的变化和主力挂单意图。
- 数据类型:
DataFrame或None(如果没有 Level 2 权限或该时刻无新委托,则为 None)。 - 权限要求:必须开通 Level 2 行情。
- 常用字段:
business_time: 委托时间。hq_px: 委托价格。business_amount: 委托数量。business_direction: 委托方向(0-卖,1-买)。trans_kind: 委托类别(如市价、限价)。
- 使用场景:分析大单挂单压力(压单/托单),识别主力资金的挂单意图。
3. transcation:逐笔成交 (Level 2 专属)
这是 Level 2 行情特有的数据,记录了交易所撮合引擎撮合成功的每一笔成交单的细节。
(注:PTrade API 文档中该键名为 transcation,请注意拼写)
- 含义:展示了真实的成交情况。通过它可以还原分时图和成交明细,判断主动性买盘和卖盘。
- 数据类型:
DataFrame或None(如果没有 Level 2 权限或该时刻无新成交,则为 None)。 - 权限要求:必须开通 Level 2 行情。
- 常用字段:
hq_px: 成交价格。business_amount: 成交数量。business_direction: 成交方向(0-卖,1-买,通常用于判断主动性买卖)。buy_no/sell_no: 买方/卖方委托单号(可用于追踪同一笔大单被拆分成多少笔小成交)。
- 使用场景:计算资金流向(大单买入/卖出),分析主动性买盘力度,识别“对敲”等异常交易行为。
代码示例
以下代码展示了如何在 tick_data 中提取并使用这三部分数据:
def initialize(context):
# 设置关注的股票
g.security = '600570.SS'
set_universe(g.security)
def tick_data(context, data):
symbol = g.security
# 确保数据中包含该股票
if symbol not in data:
return
quote = data[symbol]
# ---------------------------------------------------
# 1. 处理 Tick 快照数据 (基础)
# ---------------------------------------------------
tick_df = quote['tick']
# 获取最新价 (注意:返回的是Series/Array,通常取第一个元素)
current_price = tick_df['last_px'][0]
# 获取买一价
# bid_grp 是一个字典字符串,需要解析或直接访问结构
# 简单示例:打印最新价
# log.info("Tick最新价: %s" % current_price)
# ---------------------------------------------------
# 2. 处理 Order 逐笔委托 (需 Level 2)
# ---------------------------------------------------
order_df = quote['order']
if order_df is not None and len(order_df) > 0:
# 获取最近一笔委托的数量和价格
last_order_vol = order_df['business_amount'][0]
last_order_price = order_df['hq_px'][0]
# 简单的策略逻辑:如果有超过1000手的大单挂入
if last_order_vol > 100000: # 假设单位是股
log.info("监测到大额委托: 价格 %s, 数量 %s" % (last_order_price, last_order_vol))
# ---------------------------------------------------
# 3. 处理 Transcation 逐笔成交 (需 Level 2)
# ---------------------------------------------------
# 注意键名拼写是 transcation
trans_df = quote['transcation']
if trans_df is not None and len(trans_df) > 0:
# 获取最近一笔成交的方向 (1为主动买入,0为主动卖出)
direction = trans_df['business_direction'][0]
volume = trans_df['business_amount'][0]
price = trans_df['hq_px'][0]
# 简单的策略逻辑:大单主动买入
if direction == 1 and volume > 50000: # 500手
log.info("监测到大额主动买入: 价格 %s, 数量 %s" % (price, volume))
# 可以在此处触发下单逻辑
# order_tick(symbol, 100, limit_price=price)
def handle_data(context, data):
pass
总结
| 数据部分 | 键名 (Key) | 含义 | 核心用途 | 权限要求 |
|---|---|---|---|---|
| 快照 | 'tick' |
盘口切片信息 | 获取最新价、买卖档位,基础交易判断 | 基础权限 |
| 逐笔委托 | 'order' |
每一笔报单记录 | 分析挂单意图、压力位、支撑位 | Level 2 |
| 逐笔成交 | 'transcation' |
每一笔撮合记录 | 分析资金流向、主动买卖力度 | Level 2 |
Q&A
Q: 如果我没有 Level 2 行情权限,调用 tick_data 会报错吗?
A: 不会报错。但是 data[code]['order'] 和 data[code]['transcation'] 会返回 None。在编写策略时,务必增加 if ... is not None: 的判断逻辑,以防止代码因处理空数据而中断。
Q: tick_data 的运行频率是多少?
A: 在 PTrade 中,tick_data 通常每 3 秒触发一次(对应交易所的快照推送频率)。
Q: 逐笔成交里的 business_direction 如何判断买卖?
A: 通常情况下,0 代表卖(主动卖出,即内盘成交),1 代表买(主动买入,即外盘成交)。这对于判断当前时刻是多方占优还是空方占优非常重要。