Package: quantlplot
Finance PlotFinance Plotter, or finplot, is a performant library with a clean api to help you with your backtesting. It's
optionated with good defaults, so you can start doing your work without having to setup plots, colors, scales,
autoscaling, keybindings, handle panning+vertical zooming (which all non-finance libraries have problems with).
And best of all: it can show hundreds of thousands of datapoints without batting an eye.FeaturesGreat performance compared to mpl_finance, plotly and BokehClean apiWorks with both stocks as well as cryptocurrencies on any time resolutionShow as many charts as you want on the same time axis, zoom on all of them at onceAuto-reload position where you were looking last runOverlays, fill between, value bands, symbols, labels, legend, volume profile, heatmaps, etc.Can show real-time updates, including orderbook. Save screenshot.Comes with adozengreat examples.What it is notfinplot is not a web app. It does not help you create an homebrew exchange. It does not work with Jupyter Labs.It is only intended for you to do backtesting in. That is not to say that you can't create a ticker or a trade
widget yourself. The library is based on the eminent pyqtgraph, which is fast and flexible, so feel free to hack
away if that's what you want.Easy installation$pipinstallfinplotExampleIt's straight-forward to start using. This shows every daily candle of Apple since the 80'ies:importfinplotasfpltimportyfinancedf=yfinance.download('AAPL')fplt.candlestick_ochl(df[['Open','Close','High','Low']])fplt.show()Example 2This 25-liner pulls some BitCoin data off of Bittrex and shows the above:importfinplotasfpltimportnumpyasnpimportpandasaspdimportrequests# pull some datasymbol='USDT-BTC'url='https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=%s&tickInterval=fiveMin'%symboldata=requests.get(url).json()# format it in pandasdf=pd.DataFrame(data['result'])df=df.rename(columns={'T':'time','O':'open','C':'close','H':'high','L':'low','V':'volume'})df=df.astype({'time':'datetime64[ns]'})# create two axesax,ax2=fplt.create_plot(symbol,rows=2)# plot candle stickscandles=df[['time','open','close','high','low']]fplt.candlestick_ochl(candles,ax=ax)# overlay volume on the top plotvolumes=df[['time','open','close','volume']]fplt.volume_ocv(volumes,ax=ax.overlay())# put an MA on the close pricefplt.plot(df['time'],df['close'].rolling(25).mean(),ax=ax,legend='ma-25')# place some dumb markers on low wickslo_wicks=df[['open','close']].T.min()-df['low']df.loc[(lo_wicks>lo_wicks.quantile(0.99)),'marker']=df['low']fplt.plot(df['time'],df['marker'],ax=ax,color='#4a5',style='^',legend='dumb mark')# draw some random crap on our second plotfplt.plot(df['time'],np.random.normal(size=len(df)),ax=ax2,color='#927',legend='stuff')fplt.set_y_range(-1.4,+3.7,ax=ax2)# hard-code y-axis range limitation# restore view (X-position and zoom) if we ever run this example againfplt.autoviewrestore()# we're donefplt.show()Real-time examplesIncluded in this repo area 40-liner Bitfinex exampleanda slightly longer BitMEX websocket example,
which both update in realtime with Bitcoin/Dollar pulled from the exchange.A more complicated exampleshow real-time
updates and interactively varying of asset, time scales, indicators and color scheme.finplot is mainly intended for backtesting, so the API is clunky for real-time applications. Theexamples/complicated.pywas written a result
of popular demand.MACD, Parabolic SAR, RSI, volume profile and othersThere are plenty of examples that show different indicators.IndicatorExampleMACDS&P 500RSIAnalyzeSMAAnalyze 2EMAAnalyzeTD sequentialBitfinexBollinger bandsBitMEXParabolic SARBitMEXHeikin ashiAnalyzeRenkoRenko dark modeAccumulation/distributionAnalyzeOn balance volumeAnalyzeHeat mapHeatmapVolume profileVolume profileVWAPVolume profilePeriod returnsAnalyze 2Asset correlationOverlay correlateLinesBitcoin long termms time resolutionLineFor interactively modifying what indicators are shown, seeexamples/complicated.py.SnippetsBackground color# finplot uses no background (i.e. white) on even rows and a slightly different color on odd rows.# Set your own before creating the plot.fplt.background='#ff0'# yellowfplt.odd_plot_background='#f0f'# purplefplt.plot(df.Close)fplt.show()Unordered time seriesfinplot requires time-ordered time series - otherwise you'll get a crosshair and an X-axis showing the
millisecond epoch instead of the actual time. See my commenthereandissue 50for more info.It is also imperative that you either put your datetimes in your index, or in the first column. If your
datetime is in the first column, you normally want to have a zero-based range index,df.reset_index(drop=True), before plotting.Restore the zoom at startup# By default finplot shows all or a subset of your time series at startup. To store/restore zoom position:fplt.autoviewrestore()fplt.show()# will load zoom when showing, and save zoom when closingTime zone# Pandas normally reads datetimes in UTC time zone.# finplot by default use the local time zone of your computer (for crosshair and X-axis)fromdateutil.tzimportgettzfplt.display_timezone=gettz('Asia/Jakarta')# ... or in UTC = "display same as timezone-unaware data"importdatetimefinplot.display_timezone=datetime.timezone.utcScatter plot with X-offsetTo offset your scatter markers (say 0.2 time intervals to the left), see my commenthere.Align X-axesSeeissue 27, and possibly (rarely a problem)issue 4.Disable zoom/pan sync between axes# finplot assumes all your axes are in the same time span. To decouple the zoom/pan link, use:ax2.decouple()Move viewport along X-axis (and autozoom)Usefplt.set_x_pos(xmin, xmax, ax). Seeexamples/animate.py.Place Region of Interest (ROI) markersFor placing ellipses, seeissue 57.
For drawing lines, seeexamples/line.py.
(Interactively use Ctrl+drag for lines and Ctrl+mbutton-drag for ellipses.)More than one Y-axis in same viewboxfplt.candlestick_ochl(df2[['Open','Close','High','Low']],ax=ax.overlay(scale=1.0,yaxis='linear'))Thescaleparameter means it goes all the way to the top of the axis (volume normally stays at the bottom).
Theyaxisparameter can be one ofFalse(hidden which is default),'linear'or'log'.
Seeissue 52for more info.Plot non-timeseriesfinplot is made for plotting time series. To plot something different useax.disable_x_index(). See second
axis ofexamples/overlay-correlate.py.Custom crosshair and legendS&P500 exampleshows how
to set crosshair texts and update legend text+color as a result of mouse hover.Custom axes ticksTo use your own labels on the X-axis seecomment on issue 50.
If you want to roll your own Y-axis, inheritfplt.YAxisItem.Saving screenshotSeeexamples/line.py.
To keep screenshot in RAM seeissue 28.For creating multiple screenshots seeissue 71.Scaling plot heightsSeeissue 56. Changing the default window size can be
achieved by settingfplt.winw = 900; fplt.winh = 500;before creating your plot.ThreadingSeeissue 55.Titles on axesSeeissue 41. To show grid and further adapt axes, etc:ax.set_visible(crosshair=False,xaxis=False,yaxis=True,xgrid=True,ygrid=True)Fixing auto-zoom on realtime updatesSeeissue 131.Beepfplt.play_sound('bot-happy.wav')# Ooh! Watch me - I just made a profit!KeysEsc,Home,End,g,Left arrow,Right arrow.Ctrl+drag.Missing snippetsPlot valign on mouse hover, update an orderbook, etc.CoffeeFor future support and features, consider a small donation.BTC: bc1qk8m8yh86l2pz4eypflchr0tkn5aeud6cmt426mETH: 0x684d7d4C52ed428AE9a36B2407ba909D896cDB67