掘金量化同时运行多参数策略回测

在这里插入图片描述

由于掘金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()

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐