使用Python实现超级趋势指标(Super Trend Indicator)

趋势指标(Super Trend Indicator)

超级趋势指标是一种显示当前趋势方向的指标,很像移动平均线。和其他的趋势指标相似,可以在趋势市场中运行良好,但震荡市场中,可能会给出过多错误信号。
这个指标听过见过很多次,但是在国内的行情软件上很少见,原因我觉得也无他:他并没有表现的比其他趋势指标优秀。

在这里插入图片描述
1、超级趋势指标(Super Trend Indicator)计算公式:
在这里插入图片描述

2、Python实现

import numpy as np
import pandas as pd


def super_trend(df, atr_period, multiplier):
	high = df['high']
	low = df['low']
	close = df['close']
	
	# 首先计算ATR
	price_diffs = [high - low, high - close.shift(), close.shift() - low]
	true_range = pd.concat(price_diffs, axis=1)
	true_range = true_range.abs().max(axis=1)
	atr = true_range.ewm(alpha=1 / atr_period, min_periods=atr_period).mean()
	
	#计算超级趋势指标
	hl2 = (high + low) / 2
	final_upperband = hl2 + (multiplier * atr)
	final_lowerband = hl2 - (multiplier * atr)

	st = [True] * len(df) # True代表上行趋势,False代表下行趋势
	
	for i in range(1, len(df.index)):
	    curr, prev = i, i - 1
	
	    # 如果当前收盘价上传上轨
	    if close[curr] > final_upperband[prev]:
	        st[curr] = True
	    # 当前收盘价下穿下轨
	    elif close[curr] < final_lowerband[prev]:
	        st[curr] = False
	    # 否则趋势延续
	    else:
	        st[curr] = st[prev]
	        if st[curr] and final_lowerband[curr] < final_lowerband[prev]:
	            final_lowerband[curr] = final_lowerband[prev]
	        if not st[curr] and final_upperband[curr] > final_upperband[prev]:
	            final_upperband[curr] = final_upperband[prev]
	
	    # 根据趋势方向分别移除相应的上下轨
	    if st[curr]:
	        final_upperband[curr] = np.nan
	    else:
	        final_lowerband[curr] = np.nan
    return pd.DataFrame({
        'Supertrend': st,
        'Final Lowerband': final_lowerband,
        'Final Upperband': final_upperband
    }, index=df.index)

3、测试
以东方财富2021-01-04~2022-05-20的日K数据测试,并使用mplfinance绘制图形。
在这里插入图片描述

import mplfinace as mpf
data = pd.read_csv('../csv_data/stocks/300059.SZ.csv', parse_dates=["trade_date"], index_col=0)
data = data[['trade_date', 'open', 'high', 'low', 'close', 'vol']].sort_index(ascending=False)
data = data.reset_index(drop=True)
data.set_index('trade_date', drop=True, inplace=True)

atr_period = 34
atr_multiplier = 3.0
supertrend = super_trend(data, atr_period, atr_multiplier)
data = data.join(supertrend)
print(data.tail())
std = [mpf.make_addplot(data['Final Upperband'], color='g'), mpf.make_addplot(data['Final Lowerband'], color='r')]
mpf.plot(data, type='candle', style='charles', addplot=std, tight_layout=True)

绘制的图形如下:
在这里插入图片描述
看上去正确的刻画了趋势,也符合直觉。OVER!

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值