PTrade中tick_data函数和handle_data函数中的data参数有什么不同?
在tick_data函数中使用data时报错,发现data和handle_data中的不一样
问题描述
解决方案
在PTrade量化交易平台中,tick_data 函数和 handle_data 函数虽然都接收 data 作为参数,但这两个 data 参数的数据结构和包含的信息完全不同。混淆使用会导致策略报错。
以下是两者的详细区别:
1. handle_data 中的 data 参数
handle_data 主要用于处理日线或分钟级别的盘中逻辑。
- 数据结构:一个字典(dict),
key是标的代码,value是当时的SecurityUnitData对象。 - 包含内容:存放当前周期(日线策略则是当天,分钟策略则是这一分钟)的 K 线数据,如开盘价、收盘价、最高价、最低价、成交量等。
- 调用方式示例:
def handle_data(context, data): security = '600570.SS' # 获取当前周期的收盘价 current_close = data[security]['close'] # 获取当前周期的成交量 current_volume = data[security]['volume']
2. tick_data 中的 data 参数
tick_data 专门用于处理 tick 级别(通常每3秒执行一次)的极高频交易逻辑。
- 数据结构:一个嵌套字典(dict)。外层
key为标的代码,内层value也是一个字典,包含三个固定的 key:order、tick、transcation。 - 包含内容:
order:最近一条逐笔委托数据(DataFrame 格式或 None)。tick:当前 tick 的快照数据(DataFrame 格式),包含买卖十档盘口、最新价、成交量等。transcation:最近一条逐笔成交数据(DataFrame 格式或 None)。
- 数据结构示意:
{'股票代码': { 'order': DataFrame/None, # 逐笔委托 'tick': DataFrame, # 当前tick数据 'transcation': DataFrame/None, # 逐笔成交 } } - 调用方式示例:
def tick_data(context, data): security = '600570.SS' # 1. 获取 tick 数据中的买一价 # 注意:bid_grp 是一个字典,0代表第一条记录,1代表买一档,0代表价格 current_bid1_price = eval(data[security]['tick']['bid_grp'][0])[1][0] # 2. 获取 tick 数据中的最新成交价 last_px = data[security]['tick']['last_px'][0] # 3. 获取最近一笔逐笔成交的成交量 transcation = data[security]["transcation"] if transcation is not None: business_amount = list(transcation["business_amount"]) if len(business_amount) > 0: print("最近一笔成交量:", business_amount[0])
总结与注意事项
- 不要混用:在
tick_data中不能使用data[security]['close']这种方式获取数据,必须通过data[security]['tick']['字段名']的方式解析 DataFrame。 - Level2 行情依赖:
tick_data的data中包含的逐笔委托(order)和逐笔成交(transcation)数据,必须开通 Level2 行情才会有数据推送,否则对应字段会返回None。在编写策略时,务必做好None值的判断和异常处理。