今天,我将详细介绍一种结合了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 运行结果
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并将其添加到图表中。
注意:
- • 作者:BigBeluga
- • 参数:默认值即可。
6.2 添加 STC 指标
继续在指标菜单中搜索并添加“Schaff Trend Cycle”到图表中。
注意:
- • 作者: everget
- • 参数:默认值即可。
6.3 趋势判断与识别
6.3.1 买入信号
满足如下条件:
- • 波动率高斯波段是上升趋势的信号。
- • 图表上形成一根看涨蜡烛。
- • 沙夫趋势周期(STC)高于 75,确认了看涨势头。
- • 证实 STC 的交叉性。
- • 在下一条支撑线或阻力线处离场。
- • 根据你的风险回报率设置止损。
6.3.2 卖出信号
满足如下条件:
- • 波动率高斯带预示下降趋势:高斯带预示看跌势头或价格压缩,可能导致下行。
- • 看跌蜡烛形态:图表上出现看跌蜡烛,预示着潜在下降趋势的开始。
- • 沙夫趋势周期(STC)跌破 25:STC 跌破 25,确认了看跌势头,并与下降趋势保持一致。
- • 确认 STC 交叉:STC 在信号线下方交叉,巩固了看跌情绪。
- • 触发卖出指令:一旦上述条件一致,且看跌势头得到确认,立即下达卖出指令。
- • 退出策略: 根据价格走势和整个市场环境,在下一个重要支撑位或阻力位平仓。
7. 总结
STC+波动率高斯带策略通过结合趋势指标和波动性分析,为比特币交易提供了一个系统化的方法。通过Python的模块化实现,交易员可以轻松获取数据、计算指标并可视化结果。
8. 联系方式
- • Github: github.com/KandyYe
感谢你看到这里,如果觉得文章对你有所收获,请在文末为我点个【赞】+【关注】,或者【转发】给身边更多有需要的人看,你的点赞就是对我莫大的支持与动力!