Skip to content

Instantly share code, notes, and snippets.

Created Aug 17, 2021
What would you like to do?
if __name__ == '__main__':
# the subdirectory for my project you may need to change this
base_dir = "./BollingerBot/"
img_dir = base_dir + "imgs/"
tickers = pd.read_csv(base_dir + "sp500tickers.csv")["symbol"].tolist()
end_dt =
start_dt = datetime.datetime(end_dt.year - 1, end_dt.month,
api = YahooFinanceAPI(Interval.DAILY)
progress_count = 1
results_dict = {
"ticker": [],
"profit": [],
"avg_return": [],
"start_price": []
for ticker in tickers:
print("Processing ticker symbol {} ({} out of {}).".format(ticker.upper(), progress_count, len(tickers)))
# fetch the data
data = api.get_ticker_data(ticker, start_dt, end_dt)
# don't care if we can't
progress_count += 1
data['ma'] = get_sma(data["Close"], 20) # get 20-period SMA
data['upper'], data['lower'] = get_bollinger_bands(data['Close'], data['ma'], 20)
# plot the bands + close price
data['Close'][20:].plot(label='close', color='darkcyan')
data['ma'].plot(label='mid', linestyle='--', linewidth='0.9', color='darkturquoise')
data['upper'].plot(label='upper', linestyle='--', linewidth='1.1', color='indianred')
data['lower'].plot(label='lower', linestyle='--', linewidth='1.1', color='lightgreen')
# determine trades, calculate profit, and store results
trades = get_buy_sell_points(data)
avg_return, profit = calculate_profits(trades, ticker, base_dir)
print("Average return per trade: {}\t\tTotal profit trading one share: {}".format(avg_return, profit))
# plot the trades and make the graph prettier
plt.scatter(trades["buy_indices"], trades["buy_prices"], marker="^", color="darkgreen", s=100, label="buy")
plt.scatter(trades["sell_indices"], trades["sell_prices"], marker="v", color="darkred", s=100, label="sell")
plt.title("Bollinger Bands w/ Trades for {}".format(ticker.upper()))
plt.legend(loc='upper left')
plt.savefig(img_dir + "{}_plot.png".format(ticker.upper()))
progress_count += 1
# export the results to CSV
results_df = pd.DataFrame.from_dict(results_dict)
results_df.to_csv(base_dir + "results.dat", index=False)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment