🚀 AI 一键生成 joinquant 策略代码
立即体验

聚宽平台如何可靠判断节前最后一个交易日?(附Python代码与调仓逻辑调整)

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

问题描述

聚宽策略如何识别节前交易日并调整交易逻辑?
在聚宽中如何可靠判断节前最后一个交易日,并据此调整选股、调仓或空仓规则?

解决方案

在量化交易中,长假期间(如春节、国庆节)由于休市时间长,市场容易积聚不确定性风险(如海外市场波动、政策突发等)。因此,在节前最后一个交易日主动进行减仓、空仓或暂停调仓是规避长假效应的常见风控手段。

在聚宽(JoinQuant)平台中,我们可以通过对比当前交易日下一个交易日之间的日历天数差(Calendar Days Gap),来非常可靠地识别是否为节前最后一个交易日。

一、 核心识别逻辑与算法

普通周末的日历天数差为 3 天(例如周五到下周一:$24 - 21 = 3$ 天)。如果下一个交易日与当前交易日的日历天数差大于 3 天,则说明中间夹杂了法定节假日,当前交易日即为节前最后一个交易日

二、 聚宽 Python 代码实现

以下是一个完整的聚宽策略模板,展示了如何在开盘前判断是否为节前交易日,并在盘中执行一键清仓/避险逻辑:

# 导入聚宽函数库
from jqdata import *
import datetime

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 定义要操作的股票池
    g.security = '000001.XSHE' # 以平安银行为例
    
    # 每天开盘前运行,判断是否为节前最后一个交易日
    run_daily(before_market_open, time='09:00')
    # 每天开盘运行交易逻辑
    run_daily(market_open, time='09:30')

def before_market_open(context):
    # 获取当前交易日日期
    current_date = context.current_dt.date()
    
    # 获取所有交易日列表
    all_trade_days = get_all_trade_days()
    all_trade_days_list = list(all_trade_days)
    
    # 默认初始化节前标记为 False
    g.is_pre_holiday = False
    
    if current_date in all_trade_days_list:
        idx = all_trade_days_list.index(current_date)
        # 确保有下一个交易日数据
        if idx + 1 < len(all_trade_days_list):
            next_trade_day = all_trade_days_list[idx + 1]
            # 计算日历天数差
            gap_days = (next_trade_day - current_date).days
            
            # 如果日历天数差大于 3 天,说明中间有法定节假日(如国庆、春节、五一等)
            if gap_days > 3:
                g.is_pre_holiday = True
                log.info(f"【风控预警】今天 {current_date} 是节前最后一个交易日!下一个交易日为 {next_trade_day},休市天数:{gap_days-1}天。")
            else:
                g.is_pre_holiday = False

def market_open(context):
    security = g.security
    
    # 1. 节前风控逻辑:如果是节前最后一个交易日,执行空仓/减仓规避长假风险
    if g.is_pre_holiday:
        if context.portfolio.positions[security].closeable_amount > 0:
            log.info(f"节前避险:清仓 {security}")
            order_target(security, 0)
        return # 结束今日交易,不进行新买入
        
    # 2. 正常交易日逻辑(例如:简单的均线突破买入)
    close_data = attribute_history(security, 5, '1d', ['close'])
    MA5 = close_data['close'].mean()
    current_price = close_data['close'][-1]
    cash = context.portfolio.available_cash
    
    if current_price > 1.01 * MA5 and context.portfolio.positions[security].closeable_amount == 0:
        log.info(f"正常交易:买入 {security}")
        order_value(security, cash)
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
        log.info(f"正常交易:卖出 {security}")
        order_target(security, 0)

三、 策略调整建议

  1. 空仓/清仓规避:如上文代码所示,在检测到 g.is_pre_holiday == True 时,直接调用 order_target(security, 0) 卖出所有持仓,锁定收益,空仓过节。
  2. 轻仓/减仓过节:如果不希望完全空仓,可以将仓位控制在极低水平(例如 20% 仓位)。
  3. 暂停信号触发:在节前最后一个交易日,即使技术指标发出了“买入”信号,也应当通过 return 屏蔽该信号,避免在长假前夕建仓。