薛斯通道由美国分析师薛斯(Schauss)提出,是一种
薛斯通道由美国分析师薛斯(Schauss)提出,是一种基于移动平均和波动率的自适应通道型指标,核心作用是识别股价的运行区间、趋势方向及超买超卖状态,兼具趋势跟踪和震荡市高抛低吸的双重功能。与布林带(BOLL)不同,薛斯通道通过“动态调整通道宽度+双轨分层”,更适配不同波动率的标的,尤其适合中长线趋势判断和波段交易。
一、薛斯通道核心原理
1. 指标本质:双轨双层的自适应价格通道
薛斯通道的核心逻辑是“股价围绕中长期趋势线波动,且波动幅度随市场波动率动态调整”,由两组通道(大通道+小通道)、四条轨道线构成:
- • 上层轨道(上轨):股价运行的压力位,基于周期均线向上偏移波动率幅度;
- • 下层轨道(下轨):股价运行的支撑位,基于周期均线向下偏移波动率幅度;
- • 大通道:反映长期趋势(如100/120周期),判断大方向;
- • 小通道:反映短期趋势(如10/20周期),捕捉波段机会。
2. 核心计算公式
薛斯通道的核心是“周期均价+波动率偏移”,经典参数为:
(1)基础周期均价(中轨)
- • 长期中轨(大通道):( MA_{长} = \frac{\sum_{i=0}^{n-1} (H_i + L_i + C_i)/3}{n} )(n=100/120,H=最高价,L=最低价,C=收盘价,取三者均值更平滑);
- • 短期中轨(小通道):( MA_{短} = \frac{\sum_{i=0}^{m-1} (H_i + L_i + C_i)/3}{m} )(m=10/20)。
(2)通道宽度(波动率偏移)
通道宽度=周期内价格波动幅度×调整系数(经典系数为0.02):
- • 长期波动率:( \sigma_{长} = \max(H_i - L_i) \times 0.02 )(100周期内最高价-最低价的最大值×系数);
- • 短期波动率:( \sigma_{短} = \max(H_i - L_i) \times 0.02 )(20周期内最高价-最低价的最大值×系数)。
(3)轨道线最终公式
3. 与布林带(BOLL)的核心区别
薛斯通道常被误认为是“升级版布林带”,但核心逻辑差异显著:
二、薛斯通道实战应用规则
1. 趋势判断(核心功能)
(1)长期趋势确认(大通道)
- • 多头趋势:股价站稳长期中轨,且长期上轨/下轨同步向上发散 → 持仓做多;
- • 空头趋势:股价跌破长期中轨,且长期上轨/下轨同步向下发散 → 持仓做空/空仓;
- • 震荡趋势:股价在长期通道内来回波动,上轨压力、下轨支撑有效 → 高抛低吸。
(2)短期趋势验证(小通道)
- • 短期多头确认:股价突破短期上轨,且短期中轨向上 → 加仓;
- • 短期空头确认:股价跌破短期下轨,且短期中轨向下 → 减仓;
- • 趋势背离:长期多头但短期下轨跌破 → 短期回调,不改长期趋势,可低吸。
2. 交易信号(买入/卖出)
(1)买入信号(优先级从高到低)
- 1. 长期多头+短期回调至短期下轨,且股价未跌破长期中轨 → 低吸(核心信号);
- 2. 股价突破长期上轨,且短期上轨同步向上发散 → 追涨(趋势加速);
- 3. 震荡市中,股价触及长期下轨反弹,且短期中轨拐头向上 → 波段买入。
(2)卖出信号(优先级从高到低)
- 1. 长期空头+短期反弹至短期上轨,且股价未突破长期中轨 → 高抛(核心信号);
- 2. 股价跌破长期下轨,且短期下轨同步向下发散 → 止损(趋势破位);
- 3. 震荡市中,股价触及长期上轨回落,且短期中轨拐头向下 → 波段卖出。
3. 实战示例(A股贵州茅台,日线级别)
假设参数:长期周期n=100,短期周期m=20,调整系数=0.02:
4. 适用场景与参数优化
(1)适用标的/周期
- • 标的:大盘蓝筹股、行业龙头(波动率稳定,趋势延续性强),如白酒、新能源、消费ETF;
- • 周期:日线/周线(中长线),不建议分钟级短线(通道宽度易失真)。
(2)参数优化(根据标的波动率调整)
三、薛斯通道Python完整实现
以下代码基于A股日线数据实现薛斯通道计算,并绘制可视化图表,适配Tushare/聚宽等数据源:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
# ---------------------- 1. 数据准备(模拟/真实数据源) ----------------------
defget_stock_data(stock_code='600519.SH', start_date='2022-01-01', end_date='2023-12-31'):
"""
获取股票日线数据(模拟数据,实盘可替换为Tushare/akshare)
:param stock_code: 股票代码
:param start_date: 开始日期
:param end_date: 结束日期
:return: 包含date/high/low/close的DataFrame
"""
# 生成模拟数据(实盘替换为:df = ts.pro_bar(ts_code=stock_code, start_date=start_date, end_date=end_date))
dates = pd.date_range(start=start_date, end=end_date, freq='D')
# 模拟股价趋势(先跌后涨再震荡)
base_price = 1800
trend = np.cumsum(np.random.randn(len(dates)) * 20 - 5)[:len(dates)]
close = base_price + trend
high = close + np.random.uniform(0, 50, len(dates)) # 最高价
low = close - np.random.uniform(0, 50, len(dates)) # 最低价
df = pd.DataFrame({
'date': dates,
'high': high,
'low': low,
'close': close
})
# 剔除非交易日(模拟)
df = df[df['date'].dt.dayofweek 5]
df.reset_index(drop=True, inplace=True)
return df
# ---------------------- 2. 薛斯通道计算核心函数 ----------------------
defcalculate_schauss_channel(df, long_period=100, short_period=20, adjust_coeff=0.02):
"""
计算薛斯通道指标
:param df: 包含high/low/close的DataFrame
:param long_period: 长期周期(大通道)
:param short_period: 短期周期(小通道)
:param adjust_coeff: 调整系数(通道宽度)
:return: 新增薛斯通道列的DataFrame
"""
df = df.copy()
# 步骤1:计算中轨((H+L+C)/3的移动平均)
df['mid_price'] = (df['high'] + df['low'] + df['close']) / 3
df['long_mid'] = df['mid_price'].rolling(window=long_period, min_periods=1).mean() # 长期中轨
df[
'short_mid'] = df['mid_price'].rolling(window=short_period, min_periods=1).mean() # 短期中轨
# 步骤2:计算通道宽度(周期内最大波幅×调整系数)
# 长期波动率:每个点对应long_period内的最大(H-L)
df['hl_range'] = df['high'] - df['low']
df['long_vol'] = df['hl_range'].rolling(window=long_period, min_periods=1).max() * adjust_coeff
# 短期波动率:每个点对应short_period内的最大(H-L)
df['short_vol'] = df['hl_range'].rolling(window=short_period, min_periods=1).max() * adjust_coeff
# 步骤3:计算四条轨道线
df['long_upper'] = df['long_mid'] + df['long_vol'] # 长期上轨
df['long_lower'] = df['long_mid'] - df['long_vol'] # 长期下轨
df['short_upper'] = df['short_mid'] + df['short_vol'] # 短期上轨
df['short_lower'] = df['short_mid'] - df['short_vol'] # 短期下轨
return df
# ---------------------- 3. 交易信号生成 ----------------------
defgenerate_trade_signals(df):
"""
基于薛斯通道生成买卖信号
:param df: 包含薛斯通道列的DataFrame
:return: 新增信号列的DataFrame
"""
df = df.copy()
df['signal'] = 0# 0=无信号,1=买入,-1=卖出
# 买入信号1:股价回调至短期下轨,且未跌破长期中轨
buy_condition1 = (df['close'] <= df['short_lower']) & (df['close'] >= df['long_mid'])
# 买入信号2:股价突破长期上轨,短期上轨向上
buy_condition2 = (df['close'] > df['long_upper']) & (df['short_upper'] > df['short_upper'].shift(1))
# 卖出信号1:股价反弹至短期上轨,且未突破长期中轨
sell_condition1 = (df['close'] >= df['short_upper']) & (df['close'] <= df['long_mid'])
# 卖出信号2:股价跌破长期下轨,短期下轨向下
sell_condition2 = (df['close'] < df['long_lower']) & (df['short_lower'] < df['short_lower'].shift(1))
# 赋值信号(避免重复信号,买入优先级高于卖出)
df.loc[buy_condition1 | buy_condition2, 'signal'] = 1
df.loc[sell_condition1 | sell_condition2, 'signal'] = -1
return df
# ---------------------- 4. 可视化薛斯通道与交易信号 ----------------------
defplot_schauss_channel(df):
"""
绘制薛斯通道+股价+交易信号
"""
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(15, 8))
# 绘制股价
ax.plot(df['date'], df['close'], label='收盘价', color=
'black', linewidth=1.5)
# 绘制长期通道(大通道)
ax.plot(df['date'], df['long_upper'], label='长期上轨', color='red', linestyle='--', linewidth=1)
ax.plot(df['date'], df['long_mid'], label='长期中轨', color='red', linewidth=1)
ax.plot(df['date'], df['long_lower'], label='长期下轨', color='red', linestyle='--', linewidth=1)
# 绘制短期通道(小通道)
ax.plot(df['date'], df['short_upper'], label='短期上轨', color='blue', linestyle='--', linewidth=1)
ax.plot(df['date'], df['short_mid'], label='短期中轨', color='blue', linewidth=1)
ax.plot(df['date'], df['short_lower'], label='短期下轨', color='blue', linestyle='--', linewidth=1)
# 绘制交易信号(买入=绿色向上箭头,卖出=红色向下箭头)
buy_signals = df[df['signal'] == 1]
sell_signals = df[df['signal'] == -1]
ax.scatter(buy_signals['date'], buy_signals['close'], marker='^', color='green', s=
100, label='买入信号')
ax.scatter(sell_signals['date'], sell_signals['close'], marker='v', color='red', s=100, label='卖出信号')
# 图表设置
ax.set_title('薛斯通道指标与交易信号', fontsize=16)
ax.set_xlabel('日期', fontsize=12)
ax.set_ylabel('价格(元)', fontsize=12)
ax.legend(loc='upper left')
ax.grid(True, alpha=0.3)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# ---------------------- 5. 主函数调用 ----------------------
if __name__ == "__main__":
# 步骤1:获取数据
stock_df = get_stock_data(stock_code='600519.SH', start_date='2022-01-01', end_date='2023-12-31')
# 步骤2:计算薛斯通道
schauss_df = calculate_schauss_channel(
df=stock_df,
long_period=100,
short_period=20,
adjust_coeff=0.02
)
# 步骤3:生成交易信号
signal_df = generate_trade_signals(schauss_df)
# 步骤4:可视化
plot_schauss_channel(signal_df)
# 输出关键数据
print("薛斯通道核心数据(最后10行):")
print(signal_df[['date', 'close', 'long_mid', 'short_mid', 'long_upper', 'long_lower'
, 'signal']].tail(10))
代码运行说明
- 1. 数据替换:实盘使用时,将
get_stock_data函数替换为Tushare/akshare的真实日线数据接口,需确保数据包含high(最高价)、low(最低价)、close(收盘价); - 2. 参数调整:根据标的波动率修改
long_period/short_period/adjust_coeff,如高波动科技股可将adjust_coeff调至0.025; - 3. 信号优化:可叠加MACD/均线等指标过滤信号(如仅在MACD金叉时执行买入信号),降低假信号概率。
四、实战风险控制与优化
1. 核心风险点
- • 假信号风险:震荡市中通道频繁突破/跌破,导致频繁交易;
- • 参数失效风险:标的波动率突变(如突发利空),原参数通道宽度失真;
- • 趋势反转风险:长期通道破位后未及时止损,导致大幅亏损。
2. 优化方案
(1)信号过滤
- • 叠加趋势指标:仅在MA60向上时执行买入信号,MA60向下时仅执行卖出信号;
- • 成交量验证:突破/跌破通道时,成交量需放大50%以上,确认信号有效性。
(2)动态参数调整
- • 波动率自适应:根据近30日波动率动态调整
adjust_coeff(波动率高则系数+0.005,低则-0.005); - • 周期滚动更新:每月重新计算最优周期(如用近1年数据回测,选择收益最高的周期参数)。
(3)止损止盈
- • 止盈:买入后若股价触及长期上轨,止盈50%仓位,剩余仓位用移动止损(短期下轨)持有。
五、总结:薛斯通道的核心价值与适用边界
1. 核心价值
- • 趋势+区间双重判断:既通过长期通道判断大趋势,又通过短期通道捕捉波段机会;
- • 自适应波动率:通道宽度随价格波动调整,比布林带更适配中长线趋势;
- • 交易信号明确:买入/卖出信号基于轨道支撑压力,规则清晰,易量化落地。
2. 适用边界
- • 适合:中长线趋势明确的标的(蓝筹股、行业龙头)、日线/周线周期、波段交易策略;
- • 不适合:短线分钟级交易、高波动小盘股、突发消息驱动的标的(通道来不及调整)。
3. 实战口诀
薛斯通道的本质是“用自适应区间锁定趋势和波动”,实战中需结合自身交易风格(中长线/波段)调整参数,并搭配风险控制规则,避免机械依赖指标信号。
风险提示:本文仅作为知识分享,模拟测试不构成任何投资建议,不作投资依据。