源码文件:vnpy_spreadtrading.strategies.statistical_arbitrage_strategy

1. 策略概述

StatisticalArbitrageStrategy 是一个经典的 均值回归 (Mean Reversion) 策略,应用于价差交易。 其核心假设是:两个相关性极高的品种(如豆油/棕榈油,螺纹/热卷),它们的价差会围绕一个均值波动。当价差偏离均值过大(突破布林带上轨/下轨)时,大概率会回归。

  • 基类SpreadStrategyTemplate
  • 核心指标:Bollinger Bands (布林带)
  • 交易逻辑:逆势交易(高抛低吸)

2. 核心参数

参数名默认值含义
boll_window20布林带均线周期
boll_dev2布林带标准差倍数
max_pos10最大持仓量
payup10算法执行时的超价跳数
interval5算法撤单重发间隔(秒)

3. 策略逻辑详解

3.1 K 线合成与指标计算

策略使用 BarGenerator 合成价差的 K 线(注意:是价差本身的 K 线,不是单腿的)。 在 on_spread_bar 中计算布林带:

1
2
self.boll_mid = self.am.sma(self.boll_window)
self.boll_up, self.boll_down = self.am.boll(self.boll_window, self.boll_dev)

3.2 交易信号

策略逻辑非常清晰,分为三种状态:

  1. 空仓时 (spread_pos == 0)

    • 做空价差:价差 > 上轨 (boll_up)。预期价差回归下跌。
    • 做多价差:价差 < 下轨 (boll_down)。预期价差回归上涨。
    1
    2
    3
    4
    
    if bar.close_price >= self.boll_up:
        self.start_short_algo(bar.close_price - 10, self.max_pos, ...)
    elif bar.close_price <= self.boll_down:
        self.start_long_algo(bar.close_price + 10, self.max_pos, ...)
    
  2. 持有空头 (spread_pos < 0)

    • 平仓:价差回归到中轨 (boll_mid) 以下。
    1
    2
    
    if bar.close_price <= self.boll_mid:
        self.start_long_algo(bar.close_price + 10, abs(self.spread_pos), ...)
    
  3. 持有多头 (spread_pos > 0)

    • 平仓:价差回归到中轨 (boll_mid) 以上。
    1
    2
    
    if bar.close_price >= self.boll_mid:
        self.start_short_algo(bar.close_price - 10, abs(self.spread_pos), ...)
    

3.3 算法执行细节

在启动算法时,策略使用了较为激进的价格设置:

  • 买入时:bar.close_price + 10
  • 卖出时:bar.close_price - 10

这实际上是为了确保算法能尽快启动并成交,因为统计套利捕捉的是瞬间的价差偏离,对执行速度要求较高。

4. 总结

StatisticalArbitrageStrategy 是价差交易中最基础也最有效的模型之一。

  • 优点:逻辑简单,在震荡市(价差横盘)中表现极佳。
  • 风险:如果基本面发生根本性变化(如单腿出现单边极端行情),价差可能长期不回归(“破位”),导致策略深套。因此实盘通常需要配合止损逻辑。