问题描述
怎么判断当天是否是每个月的最后一个交易日?
解决方案
在JoinQuant(聚宽)平台上,判断当天是否为每个月的最后一个交易日,通常有两种常用的方法。具体取决于您的应用场景:如果是为了在月末执行调仓,推荐使用定时任务;如果是需要在盘中逻辑里动态判断,可以使用交易日历API。
方法一:使用 run_monthly 定时任务(推荐用于月末调仓)
如果您只是想在每个月的最后一个交易日执行某些操作(例如月末调仓),最简单的方法是使用聚宽提供的定时运行函数 run_monthly,并将 monthday 参数设置为 -1。
def initialize(context):
# 指定每月倒数第一个交易日,在开盘前(9:00)执行
run_monthly(monthly_rebalance, monthday=-1, time='9:00')
def monthly_rebalance(context):
print('今天是本月最后一个交易日,执行月末调仓逻辑')
# 在这里编写您的调仓代码
方法二:使用交易日历进行逻辑判断
如果您需要在 handle_data 或其他非定时函数中动态判断今天是否是本月的最后一个交易日,可以通过获取下一个交易日,并比较月份是否发生变化来实现。
from jqdata import *
def initialize(context):
run_daily(check_last_trade_day, time='9:30')
def check_last_trade_day(context):
# 获取当前逻辑日期
current_date = context.current_dt.date()
# 获取从今天开始的未来2个交易日(包含今天)
# count=2 表示获取今天和下一个交易日
trade_days = get_trade_days(start_date=current_date, count=2)
# 如果获取到的交易日数量大于1,说明有下一个交易日
if len(trade_days) > 1:
next_trade_date = trade_days[1]
# 如果下一个交易日的月份和今天的月份不同,说明今天是本月最后一个交易日
if next_trade_date.month != current_date.month:
print(f"{current_date} 是本月最后一个交易日!")
# 执行月末逻辑
else:
print(f"{current_date} 不是本月最后一个交易日。")
总结
- 定时执行:直接在
initialize中使用run_monthly(func, monthday=-1),这是最优雅且性能最好的方式。 - 动态判断:利用
get_trade_days获取下一个交易日,对比月份是否变更。这种方法适用于更复杂的条件触发场景。