🚀 AI 一键生成 ptrade 策略代码

如何在 ptrade 中用代码定义集合竞价的未匹配量红绿柱?

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

问题描述

ptrade 竞价的未匹配量红绿柱如何用代码定义出来的?

/

解决方案

在 ptrade 量化交易平台中,官方 API 并没有直接提供名为“未匹配量”的现成字段。但是,你可以通过获取 Level 2 行情的 Tick 数据或行情快照(Snapshot),提取买卖盘的委托队列数据,自行计算出集合竞价期间的未匹配量,并据此定义红绿柱。

1. 核心逻辑与概念

  • 未匹配量:在集合竞价期间(通常为 9:15 - 9:25),交易所会计算出一个虚拟开盘参考价。在这个价格下,买方委托量和卖方委托量往往不相等,多出来无法成交的那部分就是“未匹配量”。
  • 红绿柱定义
    • 红柱(买方强势):如果未匹配的委托是买单(即买方委托总量 > 卖方委托总量),通常定义为红柱,表示买盘力量较强。
    • 绿柱(卖方强势):如果未匹配的委托是卖单(即卖方委托总量 > 买方委托总量),通常定义为绿柱,表示抛压较重。

2. 使用 ptrade API 获取数据

你可以使用 tick_data 函数(推荐,频率最高)或 get_snapshot 函数来获取实时的买卖档位数据。

  • tick_data(context, data):在交易时间内每 3 秒推送一次。data[security]['tick'] 中包含了 bid_grp(买档位)和 offer_grp(卖档位)。
  • trade_status:可以通过判断交易状态是否为 OCALL(开始集合竞价)来确定是否处于竞价阶段。

3. Python 代码实现示例

以下是一个在 ptrade 中通过 tick_data 计算集合竞价未匹配量并判断红绿柱的示例代码:

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

def tick_data(context, data):
    security = g.security
    tick_info = data[security].get('tick', {})
    
    if not tick_info:
        return
        
    # 获取交易状态,OCALL 表示集合竞价阶段
    trade_status = tick_info.get('trade_status', '')
    
    # 仅在集合竞价阶段计算(或者你可以通过时间戳 hsTimeStamp 判断 9:15-9:25)
    if trade_status == 'OCALL':
        # 获取买一和卖一的委托量
        # bid_grp 格式示例: {1: [价格, 委托量, 委托笔数, {队列}], ...}
        bid_grp = tick_info.get('bid_grp', {})
        offer_grp = tick_info.get('offer_grp', {})
        
        # 解析买一量和卖一量 (注意:ptrade 中 tick_data 的 bid_grp 可能是字符串形式,需要 eval,具体视环境而定,这里假设已解析为字典)
        try:
            # 如果是字符串,可能需要 eval(bid_grp[0]),这里以标准字典结构为例
            bid_vol_1 = bid_grp.get(1, [0, 0])[1] if isinstance(bid_grp, dict) else 0
            offer_vol_1 = offer_grp.get(1, [0, 0])[1] if isinstance(offer_grp, dict) else 0
            
            # 计算未匹配量
            unmatched_volume = bid_vol_1 - offer_vol_1
            
            # 定义红绿柱
            if unmatched_volume > 0:
                color = '红柱 (买方未匹配)'
                volume = unmatched_volume
            elif unmatched_volume < 0:
                color = '绿柱 (卖方未匹配)'
                volume = abs(unmatched_volume)
            else:
                color = '平 (完全匹配)'
                volume = 0
                
            log.info(f"【集合竞价】标的: {security}, 状态: {color}, 未匹配量: {volume}")
            
            # 在这里可以加入你的策略逻辑,例如:如果红柱未匹配量巨大,则准备在开盘买入
            
        except Exception as e:
            log.error(f"解析档位数据失败: {e}")

def handle_data(context, data):
    pass

4. 注意事项

  1. Level 2 行情权限:获取详细的买卖档位数据(尤其是十档和委托队列)通常需要券商开通 Level 2 行情权限。如果没有 L2 权限,可能只能获取到基础的买卖一档数据,或者数据为空。
  2. 数据格式解析:在 tick_data 中,bid_grpoffer_grp 的返回值有时是被字符串包裹的字典(例如 eval(data[security]['tick']['bid_grp'][0])),在编写代码时请先通过 log.info 打印出原始数据结构,确保解析逻辑正确。
  3. 虚拟开盘价:严格意义上的未匹配量是基于交易所撮合引擎计算出的虚拟开盘价得出的。在客户端通过买一卖一量相减是一种近似的估算方法,但在实际竞价盘口中,买一和卖一的价格在撮合未完成前通常是相同的(即虚拟开盘价),此时买一量和卖一量的差值即代表了该价格下的未匹配量。