问题描述
使用get_cb_list获取的可转债列表下单时提示代码不可交易,是什么原因?
解决方案
在 Ptrade 量化交易平台中,使用 get_cb_list() 接口获取可转债列表后,直接下单可能会遇到“代码不可交易”的提示。这通常是因为未对获取到的列表进行状态过滤。
为什么会提示不可交易?
根据 Ptrade API 文档,get_cb_list() 接口返回的是当前可转债市场的所有代码列表,其中包含了停牌、退市等处于不可交易状态的代码。如果您直接遍历这个列表进行委托下单,系统自然会拦截那些当前无法交易的标的并报错。
如何解决?
为了确保下单的标的都是可交易的,您需要结合 get_snapshot()(获取行情快照)接口,检查每只可转债的 trade_status(交易状态)字段,将处于异常状态的代码剔除。
常见的不可交易状态包括:
- HALT:暂停交易
- SUSP:停盘
- STOPT:长期停盘
- DELISTED:退市
- None:无行情数据
过滤可交易可转债的 Python 源码示例
以下是一个完整的过滤示例,您可以将其集成到您的策略中,例如在 before_trading_start 或 run_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() 检查标的交易状态的习惯,可以有效避免策略在实盘或回测中产生大量废单报错。