3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
随着PTrade量化交易平台对Python 3.11版本的支持,平台内置的第三方库(如Pandas、Numpy等)也进行了相应的版本升级。这种升级虽然带来了性能提升和新特性,但也可能导致部分API的参数默认值、返回值格式发生变更,从而引发原有策略代码报错。
在Python 3.11环境下,PTrade的 get_history 和 get_price 接口在获取多只股票数据时,返回值格式与Python 3.5环境有显著差异:
pandas.Panel 对象。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)和包名,提示您需要重点关注和修改的地方。
针对 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)
check_strategy 进行全面体检。get_history、get_price、get_individual_entrust 等接口在不同Python版本下的返回值说明。log.info)关键变量的类型和内容,确认数据结构是否符合预期,再进行实盘交易。