问题描述
每次点进策略,algorithmId都是变化的。变化的algorithmId会影响在研究中使用create_backtest相关的函数么?
解决方案
在 JoinQuant(聚宽)平台中,关于策略的 algorithmId 以及它对 create_backtest 函数的影响,可以从以下几个方面来理解:
1. algorithmId 是变化的吗?
通常情况下,同一个策略的 algorithmId 是固定不变的。它是该策略在聚宽平台数据库中的唯一标识符。
如果您发现每次点进策略时 algorithmId 都在变化,可能是以下原因:
- 新建了策略:您可能每次点击的是“新建策略”而不是打开已有的策略,新建的策略会分配全新的 ID。
- URL 路由机制:某些情况下,如果您查看的是策略的特定历史回测版本或克隆版本,URL 可能会带有不同的参数,但原策略编辑页 URL 中的
algorithmId应该是固定的。
2. 对 create_backtest 函数的影响
会有直接影响。
在研究环境中使用 create_backtest 函数时,algorithm_id 参数用于告诉系统你要运行哪个策略的代码。
- 如果您传入了一个旧的或错误的
algorithmId,系统可能会找不到策略,或者运行的是旧版本的代码。 - 因此,您必须确保传入的
algorithm_id是您当前想要回测的那个策略的准确 ID(从该策略编辑页的 URL 中?algorithmId=xxxx获取)。
3. 最佳解决方案:使用 code 参数代替 algorithm_id
如果您觉得每次去获取 algorithmId 很麻烦,或者担心 ID 变化导致回测出错,强烈建议您使用 create_backtest 函数的 code 参数。
根据 JoinQuant API 文档,create_backtest 支持直接传入策略代码字符串,这样就可以完全脱离对 algorithmId 的依赖。
示例代码:
from jqdata import *
# 1. 将您的策略代码写成一个长字符串
my_strategy_code = """
def initialize(context):
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
run_daily(market_open, time='09:30')
def market_open(context):
log.info('运行回测')
# 您的策略逻辑...
"""
# 2. 设置回测参数(注意这里不需要 algorithm_id)
params = {
"start_date": "2023-01-01",
"end_date": "2023-12-31",
"frequency": "day",
"initial_cash": 100000,
}
# 3. 创建回测
# 注意:这里直接将 my_strategy_code 传给 code 参数
created_bt_id = create_backtest(code=my_strategy_code, **params)
print("创建的回测 ID:", created_bt_id)
总结:
为了保证研究环境中批量回测或自动化回测的稳定性,推荐直接将策略代码作为字符串通过 code 参数传入 create_backtest,这样既直观又不会受到 algorithmId 变化的任何影响。