本方案由 EasyQuant AI量化助手 提供。
问题背景
量化策略常需要判断“今天是否交易日”“下一个交易日是什么时候”或“本月还有几个交易日”。如果仅按自然日期处理,会在周末和节假日错误执行策略。
QMT 可通过 xtdata.get_trading_calendar() 获取沪深市场交易日历,用于节假日过滤、定时调仓和交易日计算。
完整代码示例
from xtquant import xtdata
from datetime import datetime
def download_calendar():
"""
下载节假日数据。
首次使用或需要未来交易日时建议执行。
"""
xtdata.download_holiday_data()
print("节假日数据下载完成")
def get_trade_calendar():
"""
获取指定日期范围内的上交所交易日。
"""
trade_days = xtdata.get_trading_calendar(
market="SH",
start_time="20260101",
end_time="20261231"
)
return trade_days
def is_trade_day(date_text, trade_days):
"""
判断日期是否为交易日。
date_text格式:YYYYMMDD
"""
return date_text in trade_days
def get_next_trade_day(date_text, trade_days):
"""
获取指定日期之后的下一个交易日。
"""
for trade_day in trade_days:
if trade_day > date_text:
return trade_day
return None
def main():
# 第一步:下载节假日数据
download_calendar()
# 第二步:获取全年交易日历
trade_days = get_trade_calendar()
print("全年交易日数量:", len(trade_days))
print("前10个交易日:", trade_days[:10])
# 获取今天日期
today = datetime.now().strftime("%Y%m%d")
# 判断今天是否交易日
if is_trade_day(today, trade_days):
print(today, "是交易日")
else:
print(today, "不是交易日")
# 获取下一个交易日
next_trade_day = get_next_trade_day(
today,
trade_days
)
print("下一个交易日:", next_trade_day)
if __name__ == "__main__":
main()
判断月末交易日示例
def is_month_last_trade_day(
current_day,
trade_days
):
current_index = trade_days.index(current_day)
# 已是交易日历最后一天
if current_index == len(trade_days) - 1:
return True
next_day = trade_days[current_index + 1]
# 下一个交易日月份不同,说明当前是本月最后交易日
return current_day[:6] != next_day[:6]
使用场景
-
周末、法定节假日不执行策略。
-
每月最后一个交易日自动调仓。
-
获取下一个交易日,安排盘前任务。
-
判断长假前是否需要降低仓位。
-
计算两个日期之间的实际交易日数量。
注意事项
-
调用前建议执行
xtdata.download_holiday_data(),保证节假日数据完整。 -
上交所可传入
SH,深交所可传入SZ。 -
返回日期格式为
YYYYMMDD字符串。 -
交易日不等于自然工作日,周末、法定节假日和临时休市都应以交易日历为准。
总结
get_trading_calendar() 是 QMT 策略处理日期和定时任务的重要接口。通过交易日历判断,可以避免在非交易日执行策略,并提高月度调仓和节假日风控的可靠性。

814

被折叠的 条评论
为什么被折叠?



