3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!在 JoinQuant 研究环境中调用 create_backtest 和 get_backtest 时遇到这些现象,主要是因为API拼写错误、硬编码了历史ID以及未处理异步执行机制导致的。下面为您详细剖析原因并提供正确的代码写法。
'done'?当您手动指定 out_algorithm_id = '8ada32__0' 时,您实际上是在查询一个过去已经运行完毕的回测记录。既然它在历史上已经跑完了,get_status() 自然会永远返回 'done'。此时聚宽后台显示的“正在运行”的回测,其实是您刚刚通过 create_backtest 新创建的那个回测,它的 ID 并不是 '8ada32__0'。
None 和空列表 []?create_backtest,而不是您代码中写的 createbacktest。如果拼写错误,可能导致未成功创建回测,返回的 ID 无效。create_backtest 提交回测任务后,服务器是在后台异步运行的。代码执行到 get_status() 时,回测可能处于 'none'(未开始)或 'running'(正在运行)状态。在回测没有达到 'done' 状态之前,调用 get_results() 和 get_positions() 自然获取不到数据,因此返回空列表 []。要正确获取回测结果,您需要使用 create_backtest 返回的真实 ID,并通过一个 while 循环(轮询)来等待回测状态变为 'done',然后再去获取结果。
以下是标准的参考代码:
import time
from jqdata import *
# 1. 正确调用 create_backtest 创建回测
# 注意:API 名称是 create_backtest,带有下划线
algorithm_id = '400c6464a525__' # 请替换为您真实的策略ID
print("正在提交回测任务...")
new_bt_id = create_backtest(
algorithm_id=algorithm_id,
start_date='2022-01-11',
end_date='2022-05-18',
frequency='day',
initial_cash=1000000,
use_credit=False
)
print(f"回测任务提交成功,回测ID为: {new_bt_id}")
# 2. 获取回测对象
get_bt = get_backtest(new_bt_id)
# 3. 轮询等待回测完成
while True:
status = get_bt.get_status()
print(f"当前回测状态: {status}")
if status == 'done':
print("回测运行完成!")
break
elif status in ['failed', 'canceled', 'deleted']:
print(f"回测异常终止,最终状态: {status}")
break
# 如果是 'none' 或 'running',等待几秒钟再次查询
time.sleep(5)
# 4. 只有在状态为 'done' 时,才去获取结果
if get_bt.get_status() == 'done':
params = get_bt.get_params()
results = get_bt.get_results()
positions = get_bt.get_positions()
print("获取到回测参数:", params)
print(f"获取到收益记录条数: {len(results)}")
print(f"获取到持仓记录条数: {len(positions)}")
create_backtest。create_backtest 动态返回的 ID。time.sleep() 配合 while 循环等待 get_status() 变为 'done',然后再调用 get_results() 等获取数据的接口。