问题描述
解决方案
在PTrade中,为了快速检查旧策略代码在新版本环境下的兼容性,平台提供了一个专门的函数 check_strategy。
该函数可以自动扫描策略代码,检测其中是否包含在升级过程中发生变动或不再支持的API接口及Python第三方库。
以下是具体的解决方案和代码示例:
核心方法:使用 check_strategy
您可以在 研究(Research) 模块中使用此函数。它支持两种检查方式:
- 直接传入策略代码字符串。
- 传入策略文件的路径(适合批量检查)。
代码实现
def initialize(context):
# 示例:检查一段旧的策略代码字符串
# 这里模拟了一段包含旧API或库引用的代码
old_strategy_code = """
import arch
import cvxopt
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)
def handle_data(context, data):
# 假设这里调用了一些可能变动的接口
margincash_open(g.security, 100)
get_history(100, frequency="1d", field=["close"], security_list=g.security)
"""
# 方式一:直接检查代码字符串
log.info("开始检查策略内容字符串...")
check_result_content = check_strategy(strategy_content=old_strategy_code)
log.info("字符串检查结果:")
log.info(check_result_content)
# 方式二:检查指定路径的文件
# 注意:需要在研究环境中存在该文件,且必须是utf-8编码
# 假设您有一个名为 'my_old_strategy.py' 的文件在研究根目录下
# file_path = get_research_path() + "my_old_strategy.py"
# log.info("开始检查策略文件: %s" % file_path)
# check_result_file = check_strategy(strategy_path=file_path)
# log.info("文件检查结果:")
# log.info(check_result_file)
def handle_data(context, data):
pass
结果解读
check_strategy 函数会返回一个字典(List),包含以下两个关键字段:
api_change_list: 列出策略中使用的、在当前版本中发生变动或需要注意的 PTrade API 接口。package_change_list: 列出策略中导入的、在当前环境中可能发生版本变更或移除的 Python 第三方库。
返回示例:
{
"api_change_list": [
"margincash_open",
"get_history",
"set_universe"
],
"package_change_list": [
"arch",
"cvxopt"
]
}
注意事项
- 运行环境:该函数主要在 研究模块 中使用。
- 文件编码:如果您使用
strategy_path参数检查文件,请确保文件是 UTF-8 编码的文本文件,否则可能无法读取。 - 优先级:如果同时传入
strategy_content和strategy_path,函数将仅检查strategy_content的内容。 - 告警处理:如果检查结果不为空,建议参考最新的 PTrade API 文档,查看对应接口的参数是否有变化(例如
get_history的返回数据结构变化),或者确认第三方库是否仍被支持。
Q&A
Q: check_strategy 能自动修复代码吗?
A: 不能。它只负责检测并报告可能存在兼容性问题的接口和库,具体的代码修改需要您根据最新的 API 文档手动调整。
Q: 为什么我的策略在回测里能跑,但 check_strategy 还是提示有 API 变动?
A: check_strategy 提示的是“涉及升级过程中变动的 API”。有些变动可能是参数默认值的调整或返回结构的微调,不一定会导致报错,但为了策略的稳健性,建议根据提示核对文档。
Q: 如何批量检查我所有的策略文件?
A: 您可以在研究环境中,配合 Python 的文件操作(如 glob 模块,注意不要使用被禁用的 os 模块功能),获取文件列表,然后循环调用 check_strategy(strategy_path=...) 并打印日志来实现批量检查。