-
-
Save praveenbm5/b7f0cb3a5500a756c8a783c5819ec522 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
import numpy as np | |
from datetime import datetime | |
import yfinance as yf | |
import math | |
import matplotlib.pyplot as plt | |
def Supertrend(df, atr_period, multiplier): | |
high = df['High'] | |
low = df['Low'] | |
close = df['Close'] | |
# calculate 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) | |
# default ATR calculation in supertrend indicator | |
atr = true_range.ewm(alpha=1/atr_period,min_periods=atr_period).mean() | |
# df['atr'] = df['tr'].rolling(atr_period).mean() | |
# HL2 is simply the average of high and low prices | |
hl2 = (high + low) / 2 | |
# upperband and lowerband calculation | |
# notice that final bands are set to be equal to the respective bands | |
final_upperband = upperband = hl2 + (multiplier * atr) | |
final_lowerband = lowerband = hl2 - (multiplier * atr) | |
# initialize Supertrend column to True | |
supertrend = [True] * len(df) | |
for i in range(1, len(df.index)): | |
curr, prev = i, i-1 | |
# if current close price crosses above upperband | |
if close[curr] > final_upperband[prev]: | |
supertrend[curr] = True | |
# if current close price crosses below lowerband | |
elif close[curr] < final_lowerband[prev]: | |
supertrend[curr] = False | |
# else, the trend continues | |
else: | |
supertrend[curr] = supertrend[prev] | |
# adjustment to the final bands | |
if supertrend[curr] == True and final_lowerband[curr] < final_lowerband[prev]: | |
final_lowerband[curr] = final_lowerband[prev] | |
if supertrend[curr] == False and final_upperband[curr] > final_upperband[prev]: | |
final_upperband[curr] = final_upperband[prev] | |
# to remove bands according to the trend direction | |
if supertrend[curr] == True: | |
final_upperband[curr] = np.nan | |
else: | |
final_lowerband[curr] = np.nan | |
return pd.DataFrame({ | |
'Supertrend': supertrend, | |
'Final Lowerband': final_lowerband, | |
'Final Upperband': final_upperband | |
}, index=df.index) | |
atr_period = 10 | |
atr_multiplier = 3.0 | |
symbol = 'AAPL' | |
df = yf.download(symbol, start='2020-01-01') | |
supertrend = Supertrend(df, atr_period, atr_multiplier) | |
df = df.join(supertrend) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment