问题描述
解决方案
在聚宽(JoinQuant)平台中,要实现策略在每周一(或每周第一个交易日)或者每月第一个交易日运行,需要在 initialize 函数中使用定时运行函数 run_weekly 和 run_monthly。
核心函数说明
-
run_weekly(func, weekday, time, ...):weekday=1: 代表每周的第 1 个交易日。通常是周一,如果周一休市,则顺延至周二。time='09:30': 指定在开盘时运行,也可以设置为'open'。
-
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
关键点提示
-
交易日自动处理:
weekday和monthday参数指的是交易日序号,而不是日历日。- 例如设置
weekday=1,如果周一是法定节假日休市,系统会自动在周二(即该周的第一个实际交易日)触发函数,无需手动处理假期逻辑。
-
时间设置 (
time):time参数支持具体时间字符串(如'09:30','14:50')或'open'(开盘时)。- 建议明确写为
'09:30'以确保在开盘时刻触发。
-
函数定义:
- 被调用的函数(如上例中的
weekly_job)必须接受context作为参数。
- 被调用的函数(如上例中的
Q&A
Q: 如果我想在每月的最后一个交易日运行策略怎么办?
A: 将 run_monthly 的 monthday 参数设置为 -1。例如:run_monthly(func, monthday=-1, time='14:50') 表示在每月倒数第一个交易日的收盘前10分钟运行。
Q: run_weekly 和 handle_data 可以同时使用吗?
A: 可以。run_weekly 用于处理特定时间点的逻辑(如周一调仓),而 handle_data 会在每个单位时间(每天或每分钟)都运行。如果策略只需要定时调仓,建议只使用 run_xxx 系列函数,留空 handle_data 以提高回测速度。
Q: 如果我在 run_weekly 中下单,成交价格是按什么算的?
A: 这取决于您设置的 time。如果设置 time='09:30',在回测中通常以开盘价成交(具体取决于回测的撮合机制设置)。如果是 time='14:55',则按当时的分钟收盘价成交。