老帅李华杰
管理员
管理员
  • UID2
  • 粉丝35
  • 关注0
  • 发帖数464
  • 社区居民
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:83回复:1

跨期套利策略(低风险)

楼主#
更多 发布于:2026-03-17 22:23
跨期套利策略(低风险)
核心逻辑:利用同一品种不同合约的价差偏离均值进行交易,胜率高(70%+),收益稳定但绝对值低。


import pandas as pd
import numpy as np

def spread_arbitrage_strategy(near_df, far_df, zscore_threshold=2):
    # 对齐时间索引
    df = pd.DataFrame({
        'near_close': near_df['close'],
        'far_close': far_df['close']
    }).dropna()
    
    # 计算价差和Z-score
    df['spread'] = df['far_close'] - df['near_close']  # 远月-近月
    df['spread_mean'] = df['spread'].rolling(window=60).mean()
    df['spread_std'] = df['spread'].rolling(window=60).std()
    df['zscore'] = (df['spread'] - df['spread_mean']) / df['spread_std']
    
    # 初始化信号和仓位
    df['signal'] = 0  # 0:无仓位, 1:买近卖远, -1:卖近买远
    df['position'] = 0
    df['pnl'] = 0
    
    # 遍历计算信号
    for i in range(60, len(df)):
        current_zscore = df.iloc['zscore']
        prev_position = df.iloc[i-1]['position']
        
        # Z-score过高:价差偏大,卖近买远
        if current_zscore > zscore_threshold and prev_position == 0:
            df.iloc[i, df.columns.get_loc('signal')] = -1
            df.iloc[i, df.columns.get_loc('position')] = -1
        # Z-score过低:价差偏小,买近卖远
        elif current_zscore < -zscore_threshold and prev_position == 0:
            df.iloc[i, df.columns.get_loc('signal')] = 1
            df.iloc[i, df.columns.get_loc('position')] = 1
        # Z-score回归0:平仓
        elif abs(current_zscore) < 0.5 and prev_position != 0:
            df.iloc[i, df.columns.get_loc('signal')] = 0
            df.iloc[i, df.columns.get_loc('position')] = 0
        else:
            df.iloc[i, df.columns.get_loc('position')] = prev_position
        
        # 计算套利盈亏
        if prev_position != 0:
            spread_change = df.iloc['spread'] - df.iloc[i-1]['spread']
            # 买近卖远:价差缩小盈利(prev_position=1)
            # 卖近买远:价差扩大盈利(prev_position=-1)
            df.iloc[i, df.columns.get_loc('pnl')] = -prev_position * spread_change * 10
    
    df['cum_pnl'] = df['pnl'].cumsum()
    return df

# 回测示例
if __name__ == "__main__":
    # 加载同一品种不同合约的数据(如螺纹钢2405和2410)
    near_df = load_futures_data('rb2405.csv')
    far_df = load_futures_data('rb2410.csv')
    result = spread_arbitrage_strategy(near_df, far_df)
    
    total_trades = len(result[result['signal'] != 0]) // 2
    win_trades = len(result[result['pnl'] > 0])
    win_rate = win_trades / total_trades if total_trades > 0 else 0
    total_pnl = result['cum_pnl'].iloc[-1]
    
    print(f"跨期套利策略 - 总交易次数:{total_trades}")
    print(f"跨期套利策略 - 胜率:{win_rate:.2%}")
    print(f"跨期套利策略 - 累计盈亏:{total_pnl:.2f}元")
好的指标等于至高的阵地,明察秋毫自然马到成功; 微信手机同号:15907742318 老帅李华杰
老帅李华杰
管理员
管理员
  • UID2
  • 粉丝35
  • 关注0
  • 发帖数464
  • 社区居民
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2026-03-17 22:24
策略运行前置条件

数据准备:

需要期货合约的 K 线数据(至少包含 datetime, open, high, low, close, volume)
推荐数据源:Tushare(需付费)、Wind、同花顺 iFinD,或交易所公开数据


依赖安装:bash运行pip install pandas numpy talib matplotlib


TA-Lib 安装提示:Windows 用户可下载预编译包(https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

风险控制:

仓位管理:单品种仓位不超过总资金的 10%-20%
最大回撤:设置总资金最大回撤阈值(如 20%),触发后暂停交易
品种选择:优先选择流动性好的品种(如螺纹钢、原油、沪深 300 股指期货)
好的指标等于至高的阵地,明察秋毫自然马到成功; 微信手机同号:15907742318 老帅李华杰
游客

返回顶部