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

ptrade 平台如何利用 get_instruments 监控期货交割日并实现自动平仓防范强平风险?

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

问题描述

ptrade 期货风控:利用 get_instruments 监控交割日防范强平风险
期货实盘中面临临期合约强平风险,如何调用 get_instruments 获取交割日期(delivery_date),并在到期前 N 天自动平仓?

解决方案

在期货量化交易中,临近交割月的合约会面临交易所强制平仓或大幅提高保证金的风险。因此,在策略中建立交割日监控与自动平仓风控机制至关重要。

在 ptrade 平台中,我们可以通过 get_instruments 接口获取期货合约的详细上市信息,其中包括交割日期(delivery_date)。

一、接口介绍:get_instruments

  • 接口名称get_instruments(contract)
  • 参数contract (str) - 期货合约代码,例如 'CU2112.XSGE'
  • 返回对象属性
    • contract_code:合约代码
    • contract_name:合约名称
    • exchange:交易所
    • delivery_date:交割日期(格式通常为 'YYYYMMDD''YYYY-MM-DD' 的字符串)
    • margin_rate:保证金比例

二、核心风控逻辑与 Python 源码

以下是一个完整的 ptrade 策略示例。策略在每日盘前(before_trading_start)获取持仓期货合约的交割日期,计算当前日期距离交割日的天数。如果距离交割日小于或等于设定的安全天数 $N$(例如 5 天),则在盘中自动执行平仓操作。

import datetime

def initialize(context):
    # 设置操作的期货合约池
    g.security = ['CU2505.XSGE']  # 示例合约
    set_universe(g.security)
    
    # 设定风控参数:距离交割日小于等于 N 天时强制平仓
    g.safe_days_limit = 5
    # 记录需要强平的合约列表
    g.force_close_list = []

def before_trading_start(context, data):
    g.force_close_list = []
    today = context.blotter.current_dt.date()
    
    # 遍历当前持仓
    for position in context.portfolio.positions.values():
        sid = position.sid
        # 仅对期货业务进行风控判断
        if position.business_type == 'future' and (position.long_amount > 0 or position.short_amount > 0):
            try:
                # 获取合约信息
                instrument_info = get_instruments(sid)
                if instrument_info and instrument_info.delivery_date:
                    # 解析交割日期
                    deliv_date_str = instrument_info.delivery_date.replace('-', '')
                    delivery_date = datetime.datetime.strptime(deliv_date_str, '%Y%m%d').date()
                    
                    # 计算距离交割日的剩余天数
                    days_to_delivery = (delivery_date - today).days
                    log.info("合约 %s 距离交割日 %s 还有 %d 天" % (sid, delivery_date, days_to_delivery))
                    
                    # 如果进入临期危险期,加入强平名单
                    if days_to_delivery <= g.safe_days_limit:
                        g.force_close_list.append(sid)
                        log.warning("警告:合约 %s 已进入临期危险期,将被强制平仓!" % sid)
            except Exception as e:
                log.error("获取合约 %s 信息失败: %s" % (sid, str(e)))

def handle_data(context, data):
    # 盘中执行强平逻辑
    if g.force_close_list:
        for sid in g.force_close_list:
            position = get_position(sid)
            
            # 1. 平多仓
            if position.long_amount > 0:
                log.info("执行风控:卖出平仓多头合约 %s,数量 %d" % (sid, position.long_amount))
                sell_close(sid, position.long_amount)
                
            # 2. 平空仓
            if position.short_amount > 0:
                log.info("执行风控:买入平仓空头合约 %s,数量 %d" % (sid, position.short_amount))
                buy_close(sid, position.short_amount)

三、注意事项

  1. 日期格式兼容性:不同行情源返回的 delivery_date 格式可能带有 -(如 2025-05-15)或不带(如 20250515)。源码中使用了 .replace('-', '') 进行兼容处理。
  2. 平今与平昨:在平仓上海期货交易所(XSGE)的合约时,如果涉及今仓,请注意 sell_closebuy_close 接口的 close_today 参数设置。
  3. 非交易日计算:上述代码计算的是自然日差额。如果需要按交易日计算,可结合 get_trade_days 接口进行过滤。