共计 1893 个字符,预计需要花费 5 分钟才能阅读完成。
为什么选择 3sigma 策略?
3sigma 原则源于统计学中的正态分布特性,指 99.7% 的数据会落在均值±3 倍标准差范围内。在量化交易中,我们利用这个特性来识别价格异常波动:

- 适合捕捉趋势反转点
- 计算逻辑直观,易于实现
- 不需要复杂机器学习模型
- 特别适合波动率稳定的品种
但要注意,市场价格并不严格服从正态分布,实际应用中需要配合其他指标验证。
数据准备阶段
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()
生产环境注意事项
- 过拟合防范
- 使用 Walk-Forward 分析
- 参数敏感性测试
-
多品种验证
-
滑点处理
- 设置 1 - 2 个 tick 的滑点缓冲
-
避免在流动性差的时段交易
-
实时数据延迟
- 使用 websocket 获取实时数据
- 设置心跳检测机制
- 本地时间同步校准
延伸思考
- 如何结合 EWMA 改进标准差计算?
- 在趋势行情中,3sigma 策略可能连续亏损,如何识别市场状态?
- 怎样将波动率加权应用于 sigma 倍数调整?
关键优化方向
- 动态调整 sigma 倍数(如波动率增大时降低倍数)
- 结合交易量过滤假突破
- 多时间框架验证信号
完整代码示例见 GitHub 仓库(伪链接)。实际应用中建议从小资金开始验证,任何策略都需要经过充分回测才能投入实盘。
正文完
发表至: 未分类
近两天内
