问题描述
PTrade支持Python 3.11后,部分三方库(如Pandas)的API参数默认值变更,可能导致代码报错。
解决方案
PTrade升级Python 3.11后的三方库冲突问题
随着PTrade量化交易平台对Python 3.11版本的支持,平台内置的第三方库(如Pandas、Numpy等)也进行了相应的版本升级。这种升级虽然带来了性能提升和新特性,但也可能导致部分API的参数默认值、返回值格式发生变更,从而引发原有策略代码报错。
常见冲突场景:行情获取接口返回值变更
在Python 3.11环境下,PTrade的 get_history 和 get_price 接口在获取多只股票数据时,返回值格式与Python 3.5环境有显著差异:
- Python 3.5:获取多只股票多个字段时,返回的是
pandas.Panel对象。 - Python 3.11:由于Pandas新版本已弃用
Panel,现在返回的是pandas.DataFrame对象,行索引是时间,列包含code(股票代码)和具体的行情字段(如open,close)。
如果您的旧策略还在尝试解析 Panel 对象,或者没有处理新增的 code 列,就会导致报错。
解决方案一:使用 check_strategy 函数自动排查
PTrade提供了一个非常实用的内置函数 check_strategy,专门用于检查策略内容是否涉及升级过程中变动的API和Python库。
使用方法:
您可以在研究模块中运行此函数,传入您的策略代码字符串或文件路径。
# 在研究模块中运行
strategy_code = """
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 旧版写法,可能在Python 3.11报错
hist = get_history(5, '1d', ['close'], g.security)
"""
# 检查策略
result = check_strategy(strategy_content=strategy_code)
print(result)
该函数会返回一个字典,列出涉及变动的API(如 get_history)和包名,提示您需要重点关注和修改的地方。
解决方案二:适配新的 DataFrame 格式
针对 get_history 和 get_price 返回格式的变更,您需要调整数据处理逻辑。在Python 3.11下,建议使用 Pandas 的 query 方法来筛选特定股票的数据。
Python 3.11 适配代码示例:
def initialize(context):
g.security = ['600570.SS', '600571.SS']
set_universe(g.security)
def handle_data(context, data):
# 获取多只股票数据,返回 DataFrame
dataframe_info = get_history(2, frequency='1d', field=['open','close'], security_list=g.security)
# 打印查看新的数据结构
log.info("获取的多股数据:\n%s" % dataframe_info)
# 使用 query 方法提取单只股票的数据
df_570 = dataframe_info.query('code == "600570.SS"')
log.info("600570.SS 的数据:\n%s" % df_570)
# 提取特定字段
close_570 = df_570['close']
log.info("600570.SS 的收盘价:\n%s" % close_570)
总结建议
- 全面检查:在将策略迁移到Python 3.11环境前,务必使用
check_strategy进行全面体检。 - 查阅文档:仔细阅读PTrade最新API文档中关于
get_history、get_price、get_individual_entrust等接口在不同Python版本下的返回值说明。 - 逐步调试:在回测环境中逐步打印(
log.info)关键变量的类型和内容,确认数据结构是否符合预期,再进行实盘交易。