掘金量化同时运行多参数策略回测
摘要:掘金量化SDK仅支持单线程运行,为解决多参数策略回测时的变量冲突问题,建议使用multiprocessing进行进程隔离。本文展示了如何通过修改启动代码,将回测任务分配到独立进程中执行。示例代码创建多个进程分别处理不同时间段的回测任务(2024年8月至当前按月分段),每个进程调用_preset_run函数执行单次回测。关键改动包括使用multiprocessing.Process创建子进程,
·
掘金量化同时运行多参数策略回测

由于掘金SDK的设置是单线程运行,在同一个进程空间中运行会导致变量冲突,安全的方式是使用multiprocessing隔离。
只需修改最后的启动部分
import multiprocessing
import sys
import time
import unittest
from datetime import datetime, timedelta
import re
import numpy as np
import pandas as pd
from loguru import logger
from gm.api import *
#
# 原始run函数修改
#
def _preset_run(backtest_start_time, backtest_end_time):
"""
strategy_id策略ID, 由系统生成
filename文件名, 请与本文件名保持一致
mode运行模式, 实时模式:MODE_LIVE 回测模式:MODE_BACKTEST
token绑定计算机的ID, 可在系统设置-密钥管理中生成
backtest_start_time回测开始时间
backtest_end_time回测结束时间
backtest_adjust股票复权方式, 不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
backtest_initial_cash回测初始资金
backtest_commission_ratio回测佣金比例
backtest_slippage_ratio回测滑点比例
backtest_match_mode市价撮合模式,以下一tick/bar开盘价撮合:0,以当前tick/bar收盘价撮合:1
"""
if isinstance(backtest_start_time, datetime):
backtest_start_time = str(backtest_start_time)[:19]
if isinstance(backtest_end_time, datetime):
backtest_end_time = str(backtest_end_time)[:19]
run(strategy_id='****uuid****',
filename='main.py',
mode=MODE_BACKTEST,
# mode=MODE_LIVE,
token='****',
backtest_start_time=backtest_start_time,
backtest_end_time=backtest_end_time,
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=6_000,
backtest_commission_ratio=0.00001,
backtest_slippage_ratio=0.00001,
backtest_match_mode=1)
def main_loop_months():
"""
串行执行多个参数变化的回测过程,由于gm sdk只能运行一次,使用多进程模式隔离变化的参数,每个进程执行1次run
掘金 SDK 支持多线程吗?
掘金 SDK 为了使策略简单稳定,采用单线程方式,不支持多线程。用户进行多线程编程时需要自主维护多线程可能遇到的问题。
"""
start_day = datetime(2024, 8, 1)
now = datetime.now()
for start, stop in range_month(start_day, now): # 返回按月的参数,用于单独测试每个月的绩效,替换为需要的参数生成器
# _preset_run(start, stop)
p = multiprocessing.Process(target=_preset_run, args=(start, stop))
p.start()
logger.info('start:{}, stop:{}, pid: {}', start, stop, p.pid)
# p.join()
if __name__ == '__main__':
multiprocessing.freeze_support() # windows 必要设置
main_loop_months()
更多推荐


所有评论(0)