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

为什么 Ptrade 中 get_cb_list 获取的可转债代码提示不可交易?

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

问题描述

为什么get_cb_list返回的可转债代码无法交易?

使用get_cb_list获取的可转债列表下单时提示代码不可交易,是什么原因?

解决方案

在 Ptrade 量化交易平台中,使用 get_cb_list() 接口获取可转债列表后,直接下单可能会遇到“代码不可交易”的提示。这通常是因为未对获取到的列表进行状态过滤。

为什么会提示不可交易?

根据 Ptrade API 文档,get_cb_list() 接口返回的是当前可转债市场的所有代码列表,其中包含了停牌、退市等处于不可交易状态的代码。如果您直接遍历这个列表进行委托下单,系统自然会拦截那些当前无法交易的标的并报错。

如何解决?

为了确保下单的标的都是可交易的,您需要结合 get_snapshot()(获取行情快照)接口,检查每只可转债的 trade_status(交易状态)字段,将处于异常状态的代码剔除。

常见的不可交易状态包括:

  • HALT:暂停交易
  • SUSP:停盘
  • STOPT:长期停盘
  • DELISTED:退市
  • None:无行情数据

过滤可交易可转债的 Python 源码示例

以下是一个完整的过滤示例,您可以将其集成到您的策略中,例如在 before_trading_startrun_daily 定时任务中调用:

def initialize(context):
    # 每天 9:25 获取当天可交易的可转债列表
    run_daily(context, get_trade_cb_list, "9:25")

def before_trading_start(context, data):
    # 每日清空,避免取到昨日市场代码表
    g.trade_cb_list = []

# 获取当天可交易的可转债代码列表
def get_trade_cb_list(context):
    # 1. 获取所有可转债代码(包含停牌)
    cb_list = get_cb_list()
    
    # 2. 批量获取行情快照
    cb_snapshot = get_snapshot(cb_list)
    
    # 3. 过滤出可交易的代码
    # 判定标准:代码有行情快照,并且交易状态不在暂停交易、停盘、长期停盘、退市状态
    g.trade_cb_list = [cb_code for cb_code in cb_list if
                       cb_snapshot.get(cb_code, {}).get("trade_status") not in
                       [None, "HALT", "SUSP", "STOPT", "DELISTED"]]
                       
    log.info("当天可交易的可转债代码数量为:%s" % len(g.trade_cb_list))

def handle_data(context, data):
    # 在这里使用 g.trade_cb_list 进行交易逻辑处理
    pass

总结

在 Ptrade 中处理全市场标的(如 A 股、可转债等)时,状态过滤是必不可少的一步。养成在使用 get_cb_list()get_Ashares() 后,利用 get_snapshot()get_stock_status() 检查标的交易状态的习惯,可以有效避免策略在实盘或回测中产生大量废单报错。