问题描述
使用get_cb_list获取可转债代码列表后,为什么获取的代码在当天交易时段内一直是相同的?
解决方案
1. get_cb_list 获取的数据不包含最新行情?
是的,get_cb_list() 接口仅返回当前可转债市场的所有代码列表(例如 ['110033.SS', '113011.SS', ...]),它本身不包含任何行情数据(如价格、成交量、涨跌幅等)。
如果您需要获取这些可转债的最新行情数据,需要将获取到的代码列表作为参数,传递给行情获取接口,例如 get_snapshot()(获取实时快照)或 get_price() / get_history()(获取历史K线数据)。
2. 为什么获取的代码在当天交易时段内一直是相同的?
获取的代码列表在当天交易时段内保持不变,主要有以下两个原因:
- 市场规则决定:可转债的上市、退市等状态变动都是按交易日(天)来计算的。在同一个交易日内,市场上存在的标的(包括正常交易和停牌的标的)是固定的,盘中不会突然新增或彻底消失一只可转债。
- 接口包含停牌代码:根据官方文档说明,
get_cb_list()返回的列表包含停牌代码。因此,即使某只可转债在盘中临时停牌,它的代码依然会存在于该列表中。 - 缓存机制:为了减小对行情服务的压力,ptrade 引擎在交易模块中对该函数做了缓存处理(同一分钟内多次调用返回当前分钟首次查询的缓存数据)。
3. 如何获取当天“可交易”且包含最新行情的可转债列表?
如果您希望过滤掉停牌、退市等无法交易的可转债,并获取最新行情,可以结合 get_snapshot() 接口来实现。以下是一个标准的策略示例:
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. 过滤出可交易的代码
# 代码有行情快照并且交易状态不在暂停交易(HALT)、停盘(SUSP)、长期停盘(STOPT)、退市(DELISTED)状态的判定为可交易代码
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):
pass
通过这种方式,您不仅获取了代码列表,还利用快照数据中的 trade_status 字段精准过滤了不可交易的标的,为后续的交易逻辑打下基础。