🚀 AI 一键生成 ptrade 策略代码
立即体验
👉 AI 生成代码 👈

PTrade 中 tick_data 获取逐笔委托和成交数据为何返回 None?

ptrade | 发布时间: 2026/6/2
以下内容由 EasyQuant 生成。

问题描述

PTrade中tick_data函数需要开通什么行情才能获取逐笔数据?

在tick_data函数中获取逐笔委托和逐笔成交数据返回None

解决方案

在 PTrade 量化交易平台中,如果您在 tick_data 函数里尝试获取逐笔委托(order)和逐笔成交(transcation)数据时发现返回了 None,其根本原因是您的账户未开通 Level2 (L2) 行情

核心原因解析

根据 PTrade API 文档的明确规定:

参数 data 中包含的逐笔委托,逐笔成交数据需开通 level2 行情才有数据推送,否则对应数据返回 None。

普通的 Level1 行情只提供基础的快照数据(如买卖五档、最新价、成交量等),而逐笔数据(每一笔具体的委托单和撮合成交单)属于高级行情数据,必须依赖交易所的 Level2 行情源。

数据结构说明

当您开通了 Level2 行情后,tick_data 中的 data 参数结构如下:

{'股票代码':
    {
        'order': DataFrame / None,       # 最近一条逐笔委托 (需L2)
        'tick': DataFrame,               # 当前tick快照数据 (L1/L2均有)
        'transcation': DataFrame / None, # 最近一条逐笔成交 (需L2)
    }
}

如何安全地获取逐笔数据(代码示例)

为了避免策略因为未开通 L2 行情或某时刻无逐笔数据而报错,建议在代码中加入 None 值判断:

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def tick_data(context, data):
    security = g.security
    
    # 1. 获取逐笔成交数据
    transcation = data[security].get("transcation")
    if transcation is not None:
        business_amount = list(transcation["business_amount"])
        if len(business_amount) > 0:
            log.info("最近一笔逐笔成交的成交量:%s" % business_amount[0])
    else:
        log.warning("未获取到逐笔成交数据,请检查是否开通Level2行情。")
        
    # 2. 获取逐笔委托数据
    order = data[security].get("order")
    if order is not None:
        trans_kind = list(order["trans_kind"])
        if len(trans_kind) > 0:
            log.info("最近一笔逐笔委托的委托类别:%s" % trans_kind[0])
    else:
        log.warning("未获取到逐笔委托数据,请检查是否开通Level2行情。")

def handle_data(context, data):
    pass

总结与建议

  1. 联系券商:如果您确实需要在策略中使用逐笔委托或逐笔成交数据,请联系您的开户券商,申请开通 PTrade 交易环境的 Level2 行情权限。
  2. 替代方案:如果无法开通 L2 行情,您的 tick 级别策略只能依赖 data[security]['tick'] 中的快照数据(如 bid_grp 买档位、offer_grp 卖档位、last_px 最新价等)来进行逻辑判断。