免责声明:本文基于个人使用体验,与任何厂商无商业关系。内容仅供技术交流参考,不构成投资建议。


一、前言

价差套利、跨期套利是期货量化中常见策略。多合约需要同时订阅、计算价差、按条件开平仓。做了多年期货量化,我积累了一些多合约套利策略的代码框架。

今天分享用Python实现期货价差与跨期套利的思路和框架。


二、价差与跨期概念

# 价差:两合约价格之差(如 rb2510 - rb2501)
# 跨期:同一品种不同到期月
# 套利:价差偏离历史区间时开仓,回归时平仓

三、多合约数据获取

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("账户", "密码"))

# 跨期:螺纹钢近月、远月
symbol_near = "SHFE.rb2501"
symbol_far = "SHFE.rb2510"
k_near = api.get_kline_serial(symbol_near, 300, 500)
k_far = api.get_kline_serial(symbol_far, 300, 500)
q_near = api.get_quote(symbol_near)
q_far = api.get_quote(symbol_far)

# 价差 = 近月 - 远月(或按合约乘数调整)
# spread = near_price - far_price
api.close()

四、价差套利策略框架

from tqsdk import TqApi, TqAuth, TqAccount

def spread_strategy(api, symbol_a, symbol_b, mean_period=20, std_threshold=2.0):
    """价差均值回归套利框架"""
    k_a = api.get_kline_serial(symbol_a, 300, 500)
    k_b = api.get_kline_serial(symbol_b, 300, 500)
    pos_a = api.get_position(symbol_a)
    pos_b = api.get_position(symbol_b)
    
    while True:
        api.wait_update()
        if not api.is_changing(k_a) or not api.is_changing(k_b):
            continue
        if len(k_a) < mean_period or len(k_b) < mean_period:
            continue
        
        close_a = k_a["close"].iloc[-1]
        close_b = k_b["close"].iloc[-1]
        spread = close_a - close_b
        
        spread_series = k_a["close"] - k_b["close"]
        mean_spread = spread_series.rolling(mean_period).mean().iloc[-1]
        std_spread = spread_series.rolling(mean_period).std().iloc[-1]
        
        if std_spread <= 0:
            continue
        
        zscore = (spread - mean_spread) / std_spread
        
        # 价差过高:卖A买B
        if zscore > std_threshold and pos_a.pos_short == 0:
            api.insert_order(symbol_a, "SELL", "OPEN", 1)
            api.insert_order(symbol_b, "BUY", "OPEN", 1)
        # 价差过低:买A卖B
        elif zscore < -std_threshold and pos_a.pos_long == 0:
            api.insert_order(symbol_a, "BUY", "OPEN", 1)
            api.insert_order(symbol_b, "SELL", "OPEN", 1)
        # 回归平仓
        elif abs(zscore) < 0.5 and (pos_a.pos_long > 0 or pos_a.pos_short > 0):
            if pos_a.pos_long > 0:
                api.insert_order(symbol_a, "SELL", "CLOSE", pos_a.pos_long)
                api.insert_order(symbol_b, "BUY", "CLOSE", pos_b.pos_short)
            else:
                api.insert_order(symbol_a, "BUY", "CLOSE", pos_a.pos_short)
                api.insert_order(symbol_b, "SELL", "CLOSE", pos_b.pos_long)

五、注意事项

# 1. 合约乘数、保证金可能不同,需按比例手数
# 2. 流动性:优先选主力合约
# 3. 交割月:避免临近交割
# 4. 滑点与手续费:套利空间要覆盖成本

六、总结

多合约套利需要同时订阅多合约、计算价差与统计指标、按区间开平仓。天勤量化多合约API统一,适合做价差与跨期策略框架。实际使用要注意合约比例、流动性和成本。量化交易有风险,套利策略也需严格风控。


声明:本文基于个人学习经验整理,仅供技术交流参考,不构成任何投资建议。

更多推荐