3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
跨期套利(Calendar Spread Arbitrage)是一种利用同一期货品种不同交割月份合约之间的价差进行买卖的无风险或低风险套利策略。当近月与远月合约的价差偏离合理区间(均值)时,买入相对低估的合约、卖出相对高估的合约,待价差回归均值后平仓获利。
本指南将介绍如何在 ptrade 量化交易平台实现一个基于 Bollinger Bands(布林带)价差回归的期货跨期套利策略。
sell_open),买入开仓远月合约(buy_open)。buy_open),卖出开仓远月合约(sell_open)。buy_close / sell_close)。在 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)
buy_open(contract, amount, limit_price=None):买入开仓(做多)。sell_open(contract, amount, limit_price=None):卖出开仓(做空)。sell_close(contract, amount, limit_price=None, close_today=False):卖出平仓(平多仓)。针对上期所(XSGE)可指定 close_today=True 仅平今仓。buy_close(contract, amount, limit_price=None, close_today=False):买入平仓(平空仓)。get_position(contract):获取指定合约的持仓对象,常用属性包括 long_amount(多头持仓)、short_amount(空头持仓)。g.near_contract 与 g.far_contract。close_today 参数。limit_price 限价委托,防止盘口流动性不足导致成交滑点过大。