🚀 AI 一键生成 joinquant 策略代码

JoinQuant 教程:如何实现按周或按月运行的定时策略?

joinquant | 发布时间: 2025/12/5
以下内容由 EasyQuant 生成。

问题描述

如何让我的策略每周一或者每月第一个交易日运行一次?

解决方案

在聚宽(JoinQuant)平台中,要实现策略在每周一(或每周第一个交易日)或者每月第一个交易日运行,需要在 initialize 函数中使用定时运行函数 run_weeklyrun_monthly

核心函数说明

  1. run_weekly(func, weekday, time, ...):

    • weekday=1: 代表每周的第 1 个交易日。通常是周一,如果周一休市,则顺延至周二。
    • time='09:30': 指定在开盘时运行,也可以设置为 'open'
  2. run_monthly(func, monthday, time, ...):

    • monthday=1: 代表每月的第 1 个交易日
    • time='09:30': 指定运行时间。

完整策略代码示例

以下是一个完整的策略示例,展示了如何同时设置每周和每月的定时任务:

# -*- coding: utf-8 -*-
def initialize(context):
    # 设置基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 设定每周第一个交易日(通常是周一)的 09:30 运行 weekly_job 函数
    # weekday=1 表示该周的第1个交易日
    run_weekly(weekly_job, weekday=1, time='09:30')
    
    # 设定每月第一个交易日的 09:30 运行 monthly_job 函数
    # monthday=1 表示该月的第1个交易日
    run_monthly(monthly_job, monthday=1, time='09:30')

def weekly_job(context):
    """
    每周第一个交易日执行的函数
    """
    log.info("==> 每周定时任务执行:今天是本周第1个交易日")
    # 在这里编写您的周频选股或调仓逻辑
    # 例如:
    # order('000001.XSHE', 100)

def monthly_job(context):
    """
    每月第一个交易日执行的函数
    """
    log.info("==> 每月定时任务执行:今天是本月第1个交易日")
    # 在这里编写您的月频选股或调仓逻辑

def handle_data(context, data):
    """
    按分钟或按天回测时,每个单位时间都会调用
    如果您的策略完全依赖定时运行,此函数可以留空或删除
    """
    pass

关键点提示

  1. 交易日自动处理

    • weekdaymonthday 参数指的是交易日序号,而不是日历日。
    • 例如设置 weekday=1,如果周一是法定节假日休市,系统会自动在周二(即该周的第一个实际交易日)触发函数,无需手动处理假期逻辑。
  2. 时间设置 (time)

    • time 参数支持具体时间字符串(如 '09:30', '14:50')或 'open'(开盘时)。
    • 建议明确写为 '09:30' 以确保在开盘时刻触发。
  3. 函数定义

    • 被调用的函数(如上例中的 weekly_job)必须接受 context 作为参数。

Q&A

Q: 如果我想在每月的最后一个交易日运行策略怎么办?
A: 将 run_monthlymonthday 参数设置为 -1。例如:run_monthly(func, monthday=-1, time='14:50') 表示在每月倒数第一个交易日的收盘前10分钟运行。

Q: run_weeklyhandle_data 可以同时使用吗?
A: 可以。run_weekly 用于处理特定时间点的逻辑(如周一调仓),而 handle_data 会在每个单位时间(每天或每分钟)都运行。如果策略只需要定时调仓,建议只使用 run_xxx 系列函数,留空 handle_data 以提高回测速度。

Q: 如果我在 run_weekly 中下单,成交价格是按什么算的?
A: 这取决于您设置的 time。如果设置 time='09:30',在回测中通常以开盘价成交(具体取决于回测的撮合机制设置)。如果是 time='14:55',则按当时的分钟收盘价成交。