🚀 AI 一键生成 joinquant 策略代码

JoinQuant 如何使用 run_monthly 在每月的最后一个交易日运行?

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

问题描述

我想在每个月的最后一个交易日进行调仓,run_monthly 函数该怎么设置?

解决方案

要在 JoinQuant(聚宽)中实现在每个月的最后一个交易日进行调仓,关键在于 run_monthly 函数中 monthday 参数的设置。

设置方法

monthday 参数设置为 -1

在聚宽的 API 中,monthday 参数用于指定每月的第几个交易日。正数表示从月初往后数(如 1 表示第一个交易日),负数表示从月末往前数(如 -1 表示倒数第一个交易日,即该月的最后一天)。

代码示例

以下是一个完整的 initialize 函数配置示例:

# -*- coding: utf-8 -*-
def initialize(context):
    # 设置基准
    set_benchmark('000300.XSHG')
    # 开启动态复权
    set_option('use_real_price', True)
    
    # 设定定时运行:每月最后一个交易日
    # monthday=-1 代表倒数第一个交易日
    # time='09:30' 代表在开盘时运行,也可以设置为 '14:50' 在收盘前运行
    run_monthly(monthly_rebalance, monthday=-1, time='09:30')

def monthly_rebalance(context):
    # 在这里编写您的调仓逻辑
    log.info("今天是本月最后一个交易日,开始调仓")
    # 示例:获取当前时间
    print(context.current_dt)

参数详解

  • func: 自定义的调仓函数名(如上例中的 monthly_rebalance)。
  • monthday=-1: 核心设置。
    • -1: 倒数第 1 个交易日(月末)。
    • -2: 倒数第 2 个交易日。
    • 1: 第 1 个交易日(月初)。
  • time: 执行时间。
    • '09:30': 如果您希望在月末当天的开盘时立即进行调仓,请使用此时间。
    • '14:50': 如果您希望在月末当天收盘前根据当天的行情进行调仓,可以使用此时间(预留10分钟撮合成交)。
    • '15:30': 如果设置为盘后时间,逻辑会在当天收盘后运行,但生成的订单会在下一个交易日(即下个月第一天)撮合。

Q&A

Q: 如果我想在每个月的第一个交易日调仓,怎么设置?
A: 将 monthday 设置为 1 即可。例如:run_monthly(func, monthday=1, time='09:30')

Q: run_monthly 中的 time 设置为 'every_bar' 会发生什么?
A: run_monthly 不支持 time='every_bar'time='every_bar' 只能在 run_daily 中使用。在 run_monthly 中必须指定具体的时间字符串(如 '09:30')或开盘/收盘相对时间(如 'open')。

Q: 如果某个月只有 20 个交易日,我设置 monthday=25 会怎样?
A: 如果设置的正数超过了当月的总交易日天数,且 force=True(默认),系统会取临近的交易日执行(通常是最后一天)。如果 force=False,则该月不会执行。为了准确锚定月末,建议直接使用负数 -1

Q: reference_security 参数有什么作用?
A: 它决定了“交易日”是按哪个市场的日历计算的。默认为 '000001.XSHG'(上证指数),即 A 股交易日。如果您做的是期货策略,建议将其修改为对应的期货主力合约代码,以防夜盘或特定假期导致的时间计算差异。