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

ptrade 期货跨期套利策略编写与回测指南(附 Python 完整源码)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: ptrade 期货跨期套利策略编写与回测指南

Question: 请帮我编写一个 ptrade 期货跨期套利策略

解决方案

ptrade 期货跨期套利策略编写与回测指南

跨期套利(Calendar Spread Arbitrage)是一种利用同一期货品种不同交割月份合约之间的价差进行买卖的无风险或低风险套利策略。当近月与远月合约的价差偏离合理区间(均值)时,买入相对低估的合约、卖出相对高估的合约,待价差回归均值后平仓获利。

本指南将介绍如何在 ptrade 量化交易平台实现一个基于 Bollinger Bands(布林带)价差回归的期货跨期套利策略。


策略逻辑说明

  1. 标的选择:选择同一品种的近月合约与远月合约(例如:螺纹钢近月合约与远月合约)。
  2. 价差计算:$
    \text{Price Diff} = \text{Price}{\text{近月}} - \text{Price}{\text{远月}}
    $
  3. 信号指标:计算历史价差的移动平均线(MA)及标准差(STD),构建上轨(MA + 2STD)和下轨(MA - 2STD)。
  4. 开平仓条件
    • 价差突破上轨(近月被高估,远月被低估):卖出开仓近月合约(sell_open),买入开仓远月合约(buy_open)。
    • 价差跌破下轨(近月被低估,远月被高估):买入开仓近月合约(buy_open),卖出开仓远月合约(sell_open)。
    • 价差回归均值(回归 MA):将持有的套利头寸平仓(buy_close / sell_close)。

Python 完整策略源码

在 ptrade 的策略编辑器中,输入以下 Python 代码:

import numpy as np

def initialize(context):
    # 设置套利合约对:近月与远月(示例以螺纹钢RB为例,实际使用时请替换为具体合约)
    g.near_contract = 'RB2401.XSGE'
    g.far_contract = 'RB2405.XSGE'
    g.security = [g.near_contract, g.far_contract]
    
    # 设置订阅股票池/合约池
    set_universe(g.security)
    
    # 策略参数设置
    g.window = 30        # 计算价差均值和标准差的窗口大小
    g.dev_num = 2.0      # 布林带倍数
    g.trade_lots = 1     # 每次套利交易手数
    
    # 设置期货保证金比例(可选)
    set_margin_rate('RB', 0.10)

def handle_data(context, data):
    near = g.near_contract
    far = g.far_contract
    
    # 获取历史收盘价数据计算价差
    hist_near = get_history(g.window + 1, '1d', 'close', security_list=near, fq=None, include=False)
    hist_far = get_history(g.window + 1, '1d', 'close', security_list=far, fq=None, include=False)
    
    if hist_near is None or hist_far is None:
        return
        
    # 计算历史价差序列
    price_diff_series = hist_near['close'] - hist_far['close']
    
    # 计算均值与标准差
    ma_diff = price_diff_series.mean()
    std_diff = price_diff_series.std()
    
    upper_bound = ma_diff + g.dev_num * std_diff
    lower_bound = ma_diff - g.dev_num * std_diff
    
    # 获取当前最新价差
    current_near_price = data[near]['close']
    current_far_price = data[far]['close']
    current_diff = current_near_price - current_far_price
    
    # 获取当前持仓情况
    pos_near = get_position(near)
    pos_far = get_position(far)
    
    # 1. 价差高于上轨:近月高估,远月低估 -> 做空近月,做多远月
    if current_diff > upper_bound:
        if pos_near.short_amount == 0 and pos_far.long_amount == 0:
            # 先平掉反向头寸(若有)
            if pos_near.long_amount > 0:
                sell_close(near, pos_near.long_amount)
            if pos_far.short_amount > 0:
                buy_close(far, pos_far.short_amount)
            
            # 执行套利开仓
            sell_open(near, g.trade_lots)
            buy_open(far, g.trade_lots)
            log.info("【做空价差】卖开近月 %s,买开远月 %s,当前价差: %.2f" % (near, far, current_diff))
            
    # 2. 价差低于下轨:近月低估,远月高估 -> 做多近月,做空远月
    elif current_diff < lower_bound:
        if pos_near.long_amount == 0 and pos_far.short_amount == 0:
            # 先平掉反向头寸(若有)
            if pos_near.short_amount > 0:
                buy_close(near, pos_near.short_amount)
            if pos_far.long_amount > 0:
                sell_close(far, pos_far.long_amount)
                
            # 执行套利开仓
            buy_open(near, g.trade_lots)
            sell_open(far, g.trade_lots)
            log.info("【做多价差】买开近月 %s,卖开远月 %s,当前价差: %.2f" % (near, far, current_diff))
            
    # 3. 价差回归均值附近:平仓止盈
    else:
        # 如果持有用做空价差组合(空近多远),价差回归到均值下方则平仓
        if pos_near.short_amount > 0 and pos_far.long_amount > 0 and current_diff <= ma_diff:
            buy_close(near, pos_near.short_amount)
            sell_close(far, pos_far.long_amount)
            log.info("【回归平仓】空近多远组合平仓,当前价差: %.2f" % current_diff)
            
        # 如果持有用做多价差组合(多近空远),价差回归到均值上方则平仓
        elif pos_near.long_amount > 0 and pos_far.short_amount > 0 and current_diff >= ma_diff:
            sell_close(near, pos_near.long_amount)
            buy_close(far, pos_far.short_amount)
            log.info("【回归平仓】多近空远组合平仓,当前价差: %.2f" % current_diff)

ptrade 期货API核心接口说明

  1. buy_open(contract, amount, limit_price=None):买入开仓(做多)。
  2. sell_open(contract, amount, limit_price=None):卖出开仓(做空)。
  3. sell_close(contract, amount, limit_price=None, close_today=False):卖出平仓(平多仓)。针对上期所(XSGE)可指定 close_today=True 仅平今仓。
  4. buy_close(contract, amount, limit_price=None, close_today=False):买入平仓(平空仓)。
  5. get_position(contract):获取指定合约的持仓对象,常用属性包括 long_amount(多头持仓)、short_amount(空头持仓)。

实用注意事项

  • 合约换月:期货合约有到期交割日,实盘或长期回测时需动态更新 g.near_contractg.far_contract
  • 上期所平今仓:上海期货交易所对平今仓有特殊规则(区分平今与平昨),在平仓时需根据要求合理设置 close_today 参数。
  • 滑点与下单价格:实盘中建议设置 limit_price 限价委托,防止盘口流动性不足导致成交滑点过大。