3sigma量化入门指南:从零构建你的第一个量化交易策略

1次阅读
没有评论

共计 1893 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

为什么选择 3sigma 策略?

3sigma 原则源于统计学中的正态分布特性,指 99.7% 的数据会落在均值±3 倍标准差范围内。在量化交易中,我们利用这个特性来识别价格异常波动:

3sigma 量化入门指南:从零构建你的第一个量化交易策略

  • 适合捕捉趋势反转点
  • 计算逻辑直观,易于实现
  • 不需要复杂机器学习模型
  • 特别适合波动率稳定的品种

但要注意,市场价格并不严格服从正态分布,实际应用中需要配合其他指标验证。

数据准备阶段

1. 获取历史数据

推荐使用 AKShare 或 yfinance 获取数据,这里以沪深 300ETF 为例:

import akshare as ak

def get_historical_data(symbol):
    """
    获取股票历史数据
    :param symbol: 股票代码,如 '510300'
    :return: 包含 OHLC 的 DataFrame
    """df = ak.stock_zh_a_hist(symbol=symbol, period="daily")
    df['date'] = pd.to_datetime(df['日期'])
    df.set_index('date', inplace=True)
    return df[['开盘', '最高', '最低', '收盘', '成交量']]

2. 数据清洗要点

  • 处理缺失值:前向填充或删除
  • 异常值处理:3sigma 本身可检测异常,但需先处理明显错误数据
  • 复权处理:确保价格连续性

核心策略实现

3. 计算滚动标准差

import numpy as np

def calculate_3sigma(df, window=20):
    """
    计算 3sigma 通道
    :param window: 滚动窗口大小
    """df['MA'] = df[' 收盘 '].rolling(window).mean()
    df['Std'] = df['收盘'].rolling(window).std() 
    df['Upper'] = df['MA'] + 3 * df['Std']
    df['Lower'] = df['MA'] - 3 * df['Std']
    return df

4. 信号生成逻辑

  • 当价格突破上轨:做空信号
  • 当价格跌破下轨:做多信号
  • 回到均值区间:平仓
def generate_signals(df):
    """生成交易信号"""
    df['Signal'] = 0
    df.loc[df['收盘'] > df['Upper'], 'Signal'] = -1
    df.loc[df['收盘'] < df['Lower'], 'Signal'] = 1
    df['Position'] = df['Signal'].replace(0, np.nan).ffill().fillna(0)
    return df

回测验证

使用 Backtrader 框架示例:

import backtrader as bt

class ThreeSigmaStrategy(bt.Strategy):
    params = (('window', 20),)

    def __init__(self):
        self.sma = bt.indicators.SMA(period=self.p.window)
        self.std = bt.indicators.StdDev(self.data.close, period=self.p.window)
        self.upper = self.sma + 3 * self.std
        self.lower = self.sma - 3 * self.std

    def next(self):
        if not self.position:
            if self.data.close[0] > self.upper[0]:
                self.sell()
            elif self.data.close[0] < self.lower[0]:
                self.buy()
        elif self.position.size > 0 and self.data.close[0] >= self.sma[0]:
            self.close()
        elif self.position.size < 0 and self.data.close[0] <= self.sma[0]:
            self.close()

生产环境注意事项

  1. 过拟合防范
  2. 使用 Walk-Forward 分析
  3. 参数敏感性测试
  4. 多品种验证

  5. 滑点处理

  6. 设置 1 - 2 个 tick 的滑点缓冲
  7. 避免在流动性差的时段交易

  8. 实时数据延迟

  9. 使用 websocket 获取实时数据
  10. 设置心跳检测机制
  11. 本地时间同步校准

延伸思考

  1. 如何结合 EWMA 改进标准差计算?
  2. 在趋势行情中,3sigma 策略可能连续亏损,如何识别市场状态?
  3. 怎样将波动率加权应用于 sigma 倍数调整?

关键优化方向

  • 动态调整 sigma 倍数(如波动率增大时降低倍数)
  • 结合交易量过滤假突破
  • 多时间框架验证信号

完整代码示例见 GitHub 仓库(伪链接)。实际应用中建议从小资金开始验证,任何策略都需要经过充分回测才能投入实盘。

正文完
 0
评论(没有评论)