问题描述
为什么在回测模块中使用get_sort_msg函数获取板块涨幅排名时报错或无法获取数据?
解决方案
问题原因解析
在 ptrade 量化交易平台中,如果您在回测模块调用 get_sort_msg 函数并遇到报错或无法获取数据的情况,根本原因在于该函数的适用场景限制。
根据 ptrade 官方 API 文档的说明:
get_sort_msg的使用场景:该函数仅在交易模块可用。
这意味着 get_sort_msg 依赖于实盘交易环境中的实时行情排序服务,回测引擎并没有提供历史的板块/行业实时排序快照数据,因此在回测(initialize, handle_data, before_trading_start 等回测环境中)调用该接口会直接报错或返回空值。
get_sort_msg 函数简介
在交易模块中,get_sort_msg 用于获取指定板块或行业的涨幅排名信息。例如:
# 仅限交易模块使用
sort_data = get_sort_msg(sort_type_grp='XBHS.DY', sort_field_name='preclose_px', sort_type=1, data_count=100)
回测中的替代方案
既然 get_sort_msg 无法在回测中使用,如果您在回测策略中需要根据板块或行业的涨跌幅进行选股或择时,可以通过以下步骤自行计算:
- 获取板块/行业指数代码:参考 ptrade 附录中的行业列表或概念板块列表(如农业
A01000.XBHS,沪深300000300.XBHS等)。 - 获取历史行情数据:使用
get_history或get_price函数获取这些板块指数的历史 K 线数据。 - 自行计算涨跌幅并排序:通过获取的
close和preclose(或前一日的close)计算涨跌幅,然后使用 Python 的列表或 Pandas 进行排序。
替代方案代码示例(回测可用)
def initialize(context):
# 定义需要监控的板块指数代码列表(示例)
g.block_list = ['A01000.XBHS', 'B06000.XBHS', 'C00000.XBHS']
set_universe('600570.SS')
def handle_data(context, data):
block_returns = {}
# 获取板块指数的历史数据
# 注意:获取多只标的的数据时,返回的是 DataFrame
df = get_history(2, '1d', 'close', security_list=g.block_list)
for block in g.block_list:
try:
# 提取单个板块的收盘价序列
close_prices = df.query('code == @block')['close'].values
if len(close_prices) >= 2:
# 计算涨跌幅:(今日收盘价 - 昨日收盘价) / 昨日收盘价
ret = (close_prices[-1] - close_prices[-2]) / close_prices[-2]
block_returns[block] = ret
except Exception as e:
log.error(f"获取 {block} 数据失败: {e}")
# 对涨跌幅进行降序排序
sorted_blocks = sorted(block_returns.items(), key=lambda x: x[1], reverse=True)
log.info(f"今日板块涨幅排名: {sorted_blocks}")
# 获取涨幅最大的板块
if sorted_blocks:
best_block = sorted_blocks[0][0]
log.info(f"当前最强板块为: {best_block}")
# 接下来可以使用 get_industry_stocks(best_block) 获取该板块内的成分股进行交易逻辑处理
总结
- 报错原因:
get_sort_msg仅支持实盘交易环境,不支持回测。 - 解决办法:在回测中,利用
get_history获取板块指数历史价格,通过 Pandas 或基础 Python 逻辑自行计算涨跌幅并排序。