🚀 AI 一键生成 ptrade 策略代码

PTrade Level-2 数据应用:如何使用 get_individual_entrust 分析市场微观结构?

ptrade | 发布时间: 2025/12/5
以下内容由 EasyQuant 生成。

问题描述

如何获取一只股票的实时逐笔委托数据,并进行分析?

解决方案

在PTrade中,获取股票的实时逐笔委托数据(Level-2数据)主要使用 get_individual_entrust 接口。

该接口仅在交易模式(实盘或模拟盘)下可用,且通常需要开通Level-2行情权限。

以下是具体的实现步骤和代码示例。

核心步骤

  1. 初始化:在 initialize 中设置要监控的标的。
  2. 获取数据:在 handle_datatick_data 中调用 get_individual_entrust。建议设置 is_dict=True 以获得更快的解析速度和更好的兼容性。
  3. 数据解析:返回的数据包含时间、价格、委托数量、委托方向等。
  4. 策略分析:根据委托方向(买/卖)和委托数量,计算大单买入或卖出的力度。

策略代码示例

以下代码展示了如何获取逐笔委托,并统计当前返回数据包中的“大单买入”和“大单卖出”数量。

def initialize(context):
    # 设置要操作的股票,这里以恒生电子为例
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 定义大单的阈值(例如:大于10000股)
    g.big_order_threshold = 10000

def handle_data(context, data):
    # 获取逐笔委托数据
    # is_dict=True 返回字典格式,解析速度更快
    # 默认获取当前股票池的数据
    entrust_data = get_individual_entrust([g.security], is_dict=True)
    
    if entrust_data is None:
        log.info("暂无逐笔委托数据")
        return

    # 获取特定股票的数据列表
    # 数据结构: [[时间, 价格, 数量, 订单号, 方向, ...], ...]
    records = entrust_data.get(g.security)
    
    if not records:
        return

    # 初始化统计变量
    buy_vol = 0
    sell_vol = 0
    big_buy_count = 0
    big_sell_count = 0

    # 遍历每一笔委托进行分析
    for row in records:
        # 根据文档:
        # row[1] -> hq_px (价格)
        # row[2] -> business_amount (委托数量)
        # row[4] -> business_direction (委托方向: 0-卖, 1-买, 2-借入, 3-出借)
        
        amount = row[2]
        direction = row[4]
        
        # 统计买卖总量
        if direction == 1: # 买单
            buy_vol += amount
            # 统计大单
            if amount >= g.big_order_threshold:
                big_buy_count += 1
                log.info("监测到大额买单: 价格 %s, 数量 %s" % (row[1], amount))
                
        elif direction == 0: # 卖单
            sell_vol += amount
            # 统计大单
            if amount >= g.big_order_threshold:
                big_sell_count += 1
                log.info("监测到大额卖单: 价格 %s, 数量 %s" % (row[1], amount))

    # 打印分析结果
    log.info("【逐笔委托分析】 标的: %s" % g.security)
    log.info("累计买单量: %s, 大额买单笔数: %s" % (buy_vol, big_buy_count))
    log.info("累计卖单量: %s, 大额卖单笔数: %s" % (sell_vol, big_sell_count))
    
    # 简单的策略逻辑示例:如果大额买单显著多于卖单,且有资金,则买入
    if big_buy_count > big_sell_count and big_buy_count > 0:
        # 获取当前现金
        cash = context.portfolio.cash
        if cash > 0:
            # 买入100股
            order(g.security, 100)
            log.info("大单买入信号触发,执行买入")

代码解析

  1. get_individual_entrust([g.security], is_dict=True):

    • 这是核心函数。使用 is_dict=True 返回的数据结构是字典,Key是股票代码,Value是一个列表(List),列表中的每一项代表一笔委托。
    • 返回的 fields 字段通常为:["business_time", "hq_px", "business_amount", "order_no", "business_direction", "trans_kind"]
  2. 字段索引:

    • 在代码的循环中,我们通过索引访问数据:row[2] 是委托数量,row[4] 是委托方向。
    • 委托方向0 代表卖出委托,1 代表买入委托。
  3. 兼容性:

    • 代码使用了 %s 格式化字符串,而不是 f-string,以确保在 Python 3.5 环境下也能正常运行。

注意事项

  • 权限要求:逐笔委托属于 Level-2 高频数据,必须确认您的 PTrade 账号已开通 Level-2 行情权限,否则该函数返回 None
  • 数据量:逐笔数据量非常大,如果在 handle_data(分钟级)中调用,它会返回该分钟内(或最近一批)的数据。如果在 tick_data(3秒级)中调用,数据更新会更频繁。
  • 回测限制:该函数通常仅在交易模块(实盘/仿真)可用。普通的回测环境通常不支持逐笔数据的回放(除非券商提供了专门的高频回测环境)。

Q&A

Q: get_individual_entrustget_individual_transaction 有什么区别?
A: get_individual_entrust 获取的是逐笔委托(挂单),即投资者下单但尚未成交(或正在等待成交)的记录,反映的是市场意愿;get_individual_transaction 获取的是逐笔成交,即已经撮合成交的记录,反映的是真实的市场交易行为。

Q: 为什么我在回测中调用此函数返回 None?
A: PTrade 的普通回测环境通常只支持分钟线或日线数据,不支持 Level-2 的逐笔数据回放。该函数主要用于实盘或仿真交易策略中。

Q: 如何提高处理逐笔数据的速度?
A: 务必在调用接口时设置 is_dict=True。如果不设置,默认返回 DataFrame (Python 3.11) 或 Panel (Python 3.5),在大数据量下,Pandas 对象的构建和索引会比原生字典和列表慢很多。

Q: business_direction 中的 2 和 3 代表什么?
A: 2 代表借入(通常指融券借入),3 代表出借(通常指转融通出借)。在普通的股票交易分析中,主要关注 0(卖)和 1(买)。