交易新利器:STC+波动率高斯带策略深度揭秘

421 阅读7分钟

今天,我将详细介绍一种结合了STC(Schaff Trend Cycle,沙夫趋势周期)和波动率高斯带的交易策略——STC+波动率高斯带策略。这种策略通过趋势识别和波动性分析,帮助交易员在比特币的剧烈价格波动中确定买入和卖出点。

1. 策略原理

1.1 STC指标

STC指标是一种基于周期和趋势的振荡指标,由Doug Schaff开发,旨在识别市场趋势的方向和转折点。它结合了MACD(移动平均线收敛-发散指标)的平滑特性与随机指标(Stochastic Oscillator)的周期性,能够更早地捕捉趋势变化。STC的值通常在0到100之间:

  • • 高于80:表示超买,可能预示价格回调。
  • • 低于20:表示超卖,可能预示价格反弹。

1.2 波动率高斯带

波动率高斯带是以价格的移动平均线为中心,结合波动率(标准差)构建的动态通道。与布林带类似,但波动率高斯带更强调正态分布假设下的价格波动范围:

  • • 上轨:移动平均线 + k × 标准差
  • • 下轨:移动平均线 - k × 标准差 其中,k是一个可调参数,通常设为1.5或2,标准差反映了价格的波动性。

1.3 STC+波动率高斯带的结合

单独使用STC可能导致过于频繁的信号,而单独使用波动率高斯带可能错过趋势性机会。结合两者,我们可以通过以下方式优化:

  • • 用STC判断趋势方向和超买/超卖状态。
  • • 用波动率高斯带确认价格是否突破关键支撑或阻力,作为入场或离场的过滤条件。

2. 买入和卖出点的确定方法

2.1 买入信号

  • • STC条件:STC从20以下向上突破20,表明市场从超卖状态转为潜在上升趋势。
  • • 波动率高斯带条件:价格接近或跌破下轨(例如,移动平均线 - 2 × 标准差),表明价格可能被低估。
  • • 综合逻辑:当STC发出买入信号且价格靠近下轨时,认为这是一个低风险的买入点。

2.2 卖出信号

  • • STC条件:STC从80以上向下突破80,表明市场从超买状态转为潜在下跌趋势。
  • • 波动率高斯带条件:价格接近或突破上轨(例如,移动平均线 + 2 × 标准差),表明价格可能被高估。
  • • 综合逻辑:当STC发出卖出信号且价格靠近上轨时,认为这是一个合适的卖出点。

2.3 风险管理

  • • 设置止损:买入后若价格继续跌破下轨一定幅度(如5%),止损离场;卖出后若价格继续突破上轨一定幅度,止损离场。
  • • 时间过滤:避免在重大新闻事件或低流动性时段交易。

3. 编程实现

3.1 python实现

import ccxt
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from datetime import datetime

class STCVolatilityStrategy:
    def __init__(self, exchange='binance', symbol='BTC/USDT', timeframe='1h', limit=500, ma_period=20, std_dev_factor=2):
        """初始化参数"""
        self.exchange = getattr(ccxt, exchange)()
        self.symbol = symbol
        self.timeframe = timeframe
        self.limit = limit
        self.ma_period = ma_period
        self.std_dev_factor = std_dev_factor
        self.data = None

    def fetch_data(self):
        """获取OHLCV数据"""
        ohlcv = self.exchange.fetch_ohlcv(self.symbol, self.timeframe, limit=self.limit)
        self.data = pd.DataFrame(ohlcv, columns=['timestamp''open''high''low''close''volume'])
        self.data['timestamp'] = pd.to_datetime(self.data['timestamp'], unit='ms')
        self.data.set_index('timestamp', inplace=True)

    def calculate_stc(self, fast_period=23, slow_period=50, cycle_period=10):
        """计算STC指标"""
        # 计算MACD
        ema_fast = self.data['close'].ewm(span=fast_period, adjust=False).mean()
        ema_slow = self.data['close'].ewm(span=slow_period, adjust=False).mean()
        macd = ema_fast - ema_slow
        
        # 计算随机指标的平滑版本
        macd_min = macd.rolling(window=cycle_period).min()
        macd_max = macd.rolling(window=cycle_period).max()
        stoch = 100 * (macd - macd_min) / (macd_max - macd_min)
        
        # 平滑得到STC
        self.data['STC'] = stoch.ewm(span=cycle_period, adjust=False).mean()

    def calculate_volatility_bands(self):
        """计算波动率高斯带"""
        self.data['MA'] = self.data['close'].rolling(window=self.ma_period).mean()
        self.data['STD'] = self.data['close'].rolling(window=self.ma_period).std()
        self.data['UpperBand'] = self.data['MA'] + self.std_dev_factor * self.data['STD']
        self.data['LowerBand'] = self.data['MA'] - self.std_dev_factor * self.data['STD']

    def generate_signals(self):
        """生成交易信号"""
        self.data['Signal'] = 0
        # 买入信号:STC从20以下上穿20且价格靠近下轨
        buy_condition = (self.data['STC'].shift(1) < 20) & (self.data['STC'] >= 20) & \
                        (self.data['close'] <= self.data['LowerBand'])
        # 卖出信号:STC从80以上下穿80且价格靠近上轨
        sell_condition = (self.data['STC'].shift(1) > 80) & (self.data['STC'] <= 80) & \
                         (self.data['close'] >= self.data['UpperBand'])
        
        self.data.loc[buy_condition, 'Signal'] = 1  # 买入
        self.data.loc[sell_condition, 'Signal'] = -1  # 卖出

    def plot_results(self):
        """绘制结果"""
        fig = go.Figure()

        # 绘制K线图
        fig.add_trace(go.Candlestick(x=self.data.index,
                                     open=self.data['open'],
                                     high=self.data['high'],
                                     low=self.data['low'],
                                     close=self.data['close'],
                                     name='Candlestick'))

        # 绘制波动率高斯带
        fig.add_trace(go.Scatter(x=self.data.index, y=self.data['MA'], name='MA', line=dict(color='blue')))
        fig.add_trace(go.Scatter(x=self.data.index, y=self.data['UpperBand'], name='Upper Band', line=dict(color='red')))
        fig.add_trace(go.Scatter(x=self.data.index, y=self.data['LowerBand'], name='Lower Band', line=dict(color='green')))

        # 绘制交易信号
        buy_signals = self.data[self.data['Signal'] == 1]
        sell_signals = self.data[self.data['Signal'] == -1]
        fig.add_trace(go.Scatter(x=buy_signals.index, y=buy_signals['close'], mode='markers', name='Buy',
                                 marker=dict(symbol='triangle-up', size=10, color='green')))
        fig.add_trace(go.Scatter(x=sell_signals.index, y=sell_signals['close'], mode='markers', name='Sell',
                                 marker=dict(symbol='triangle-down', size=10, color='red')))

        # 布局设置
        fig.update_layout(title=f'{self.symbol} STC + Volatility Band Strategy',
                          yaxis_title='Price (USDT)',
                          xaxis_title='Time',
                          template='plotly_dark')
        fig.show()

    def run(self):
        """运行策略"""
        self.fetch_data()
        self.calculate_stc()
        self.calculate_volatility_bands()
        self.generate_signals()
        self.plot_results()

# 使用示例
if __name__ == "__main__":
    strategy = STCVolatilityStrategy()
    strategy.run()

3.2 运行结果

Pasted image 20250407164942.png

4. 代码说明

4.1 STCVolatilityStrategy类:

  • • init:初始化交易所、交易对、时间框架等参数。
  • • fetch_data:通过ccxt从Binance获取比特币OHLCV数据。
  • • calculate_stc:实现STC指标的计算,基于MACD和随机指标的平滑。
  • • calculate_volatility_bands:计算移动平均线和波动率高斯带。
  • • generate_signals:根据STC和波动率高斯带生成买入/卖出信号。
  • • plot_results:使用plotly绘制K线图、波动率高斯带和交易信号。
  • • run:整合所有步骤,运行策略。

4.2 依赖库:

  • • ccxt:获取实时行情数据。
  • • pandas:数据处理。
  • • numpy:数值计算。
  • • plotly:交互式图表绘制。

4.3 参数调整:

  • • 可通过调整ma_period(移动平均周期)、std_dev_factor(标准差倍数)、STC的fast_period和slow_period等参数,优化策略表现。

5. 策略优势与局限

5.1 优势

  • • 趋势与波动结合:STC捕捉趋势转折,波动率高斯带提供价格边界,双重确认减少假信号。
  • • 适应性强:适用于比特币等高波动性资产,可通过参数调整适应不同市场环境。
  • • 可视化支持:通过plotly直观展示信号,便于回测和优化。

5.2 局限

  • • 滞后性:STC和移动平均线均为滞后指标,可能错过快速反转。
  • • 假突破:高波动市场中,价格可能频繁突破高斯带,导致无效信号。
  • • 数据依赖:需要高质量的实时数据,API延迟可能影响效果。

6. 在tradingView设置

6.1 添加波动率高斯带指标

进入 Tradingview 平台,搜索 Volatility Gaussian Bands并将其添加到图表中。 Pasted image 20250407163906.png 注意:

  • • 作者:BigBeluga
  • • 参数:默认值即可。

6.2 添加 STC 指标

继续在指标菜单中搜索并添加“Schaff Trend Cycle”到图表中。 Pasted image 20250407164147.png 注意:

  • • 作者: everget
  • • 参数:默认值即可。

6.3 趋势判断与识别

6.3.1 买入信号

满足如下条件:

  • • 波动率高斯波段是上升趋势的信号。
  • • 图表上形成一根看涨蜡烛。
  • • 沙夫趋势周期(STC)高于 75,确认了看涨势头。
  • • 证实 STC 的交叉性。
  • • 在下一条支撑线或阻力线处离场。
  • • 根据你的风险回报率设置止损。 Pasted image 20250407164729.png

6.3.2 卖出信号

满足如下条件:

  • • 波动率高斯带预示下降趋势:高斯带预示看跌势头或价格压缩,可能导致下行。
  • • 看跌蜡烛形态:图表上出现看跌蜡烛,预示着潜在下降趋势的开始。
  • • 沙夫趋势周期(STC)跌破 25:STC 跌破 25,确认了看跌势头,并与下降趋势保持一致。
  • • 确认 STC 交叉:STC 在信号线下方交叉,巩固了看跌情绪。
  • • 触发卖出指令:一旦上述条件一致,且看跌势头得到确认,立即下达卖出指令。
  • • 退出策略: 根据价格走势和整个市场环境,在下一个重要支撑位或阻力位平仓。
    Pasted image 20250407164553.png

7. 总结

STC+波动率高斯带策略通过结合趋势指标和波动性分析,为比特币交易提供了一个系统化的方法。通过Python的模块化实现,交易员可以轻松获取数据、计算指标并可视化结果。

8. 联系方式

感谢你看到这里,如果觉得文章对你有所收获,请在文末为我点个【赞】+【关注】,或者【转发】给身边更多有需要的人看,你的点赞就是对我莫大的支持与动力!