问题描述
解决方案
要在 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 股交易日。如果您做的是期货策略,建议将其修改为对应的期货主力合约代码,以防夜盘或特定假期导致的时间计算差异。