Candlesticks in matplotlib

591 Views Asked by At

I'm trying to make a cryptoscanner but I'm struggling a bit. The code right now can loop through the different coins in symbols.csv and print plots for all of them. The plots include close price, SMA and bollinger bands. Now I really want the close price to be candlesticks and not a line. I've found that there are other plots like mpf to make candlesticks. The problem is that I don't know how to make the bollinger bands work with the mpf plots and I don't know how to make the candlesticks work with matplotlib. Can someone help me making candlesticks in matplotlib orrr make the bollingerbands in the mpf plots.

Thanks in advance!

The graph looks like this right now

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib



with open('symbols.csv') as f:
    symbols = f.read().splitlines()
    for symbol in symbols:
        df = yf.download(symbol, start='2020-01-01')
        # df = yf.download(symbol, period = '22h', interval = '15m')
        print(df)



# df = yf.download('ADA-USD', start='2021-01-01')

        df['SMA'] = df.Close.rolling(window=20).mean()
        df['stddev'] = df.Close.rolling(window=20).std()
        df['Upper'] = df.SMA + 2* df.stddev
        df['Lower'] = df.SMA - 2* df.stddev
        df['Buy_Signal'] = np.where(df.Lower > df.Close, True, False)
        df['Sell_Signal'] = np.where(df.Upper < df.Close, True, False)

        buys = []
        sells = []
        open_pos = False

        for i in range(len(df)):
            if df.Lower[i] > df.Close[i]:
                if open_pos == False:
                    buys.append(i)
                    open_pos = True
            elif df.Upper[i] < df.Close[i]:
                if open_pos:
                    sells.append(i)
                    open_pos = False



        plt.figure(figsize=(12, 6))

        plt.scatter(df.iloc[buys].index, df.iloc[buys].Close, marker = '^', color ='g')
        plt.scatter(df.iloc[sells].index, df.iloc[sells].Close, marker = '^', color ='r')


        plt.plot(df[['Close', 'SMA', 'Upper', 'Lower']])
        plt.fill_between(df.index, df.Upper, df.Lower, color='grey', alpha=0.3)
        plt.legend(['Close', 'SMA', 'Upper', 'Lower'])
        plt.show()

        merged = pd.concat([df.iloc[buys].Close, df.iloc[sells].Close], axis=1)
        merged.columns = ['Buys', 'Sells']
        print(merged)
        totalprofit = merged.shift(-1).Sells - merged.Buys
        print(totalprofit)
        relprofits = (merged.shift(-1).Sells - merged.Buys) / merged.Buys
        print(relprofits.mean())
1

There are 1 best solutions below

2
On BEST ANSWER

The links in the comments provide a wealth of examples. Since you want to graph candlesticks, Bollinger Bands, and SMAs in mpf, I have modified the additional plot examples from the previous examples to suit your needs. The graphs were created from data obtained in stocks instead of currencies.

import yfinance as yf
import pandas as pd
import mplfinance as mpf

df = yf.download("AAPL", start="2020-01-01")

df['SMA'] = df.Close.rolling(window=20).mean()
df['stddev'] = df.Close.rolling(window=20).std()
df['Upper'] = df.SMA + 2* df.stddev
df['Lower'] = df.SMA - 2* df.stddev
df['Buy_Signal'] = np.where(df.Lower > df.Close, True, False)
df['Sell_Signal'] = np.where(df.Upper < df.Close, True, False)

tcdf = df[['Lower','Upper','SMA']]
apd = mpf.make_addplot(tcdf)
mpf.plot(df, figratio=(8,4), type='candle', addplot=apd, volume=False, style='yahoo')

enter image description here