Skip to main content

Finance Plot

Finance 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.

Features

  • Great performance compared to mpl_finance, plotly and Bokeh
  • Clean api
  • Works with both stocks as well as cryptocurrencies on any time resolution
  • Show as many charts as you want on the same time axis, zoom on all of them at once
  • Auto-reload position where you were looking last run
  • Overlays, fill between, value bands, symbols, labels, legend, volume profile, heatmaps, etc.
  • Can show real-time updates, including orderbook. Save screenshot.
  • Comes with a dozen great examples.

feature1

feature2

feature3

feature3

What it is not

finplot 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

$ pip install finplot

Example

It's straight-forward to start using. This shows every daily candle of Apple since the 80'ies:

import finplot as fplt
import yfinance

df = yfinance.download('AAPL')
fplt.candlestick_ochl(df[['Open', 'Close', 'High', 'Low']])
fplt.show()

Example 2

sample

This 25-liner pulls some BitCoin data off of Bittrex and shows the above:

import finplot as fplt
import numpy as np
import pandas as pd
import requests

# pull some data
symbol = 'USDT-BTC'
url = 'https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=%s&tickInterval=fiveMin' % symbol
data = requests.get(url).json()

# format it in pandas
df = 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 axes
ax,ax2 = fplt.create_plot(symbol, rows=2)

# plot candle sticks
candles = df[['time','open','close','high','low']]
fplt.candlestick_ochl(candles, ax=ax)

# overlay volume on the top plot
volumes = df[['time','open','close','volume']]
fplt.volume_ocv(volumes, ax=ax.overlay())

# put an MA on the close price
fplt.plot(df['time'], df['close'].rolling(25).mean(), ax=ax, legend='ma-25')

# place some dumb markers on low wicks
lo_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 plot
fplt.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 again
fplt.autoviewrestore()

# we're done
fplt.show()

Realtime updating with realistic indicator

Included in this repo are a 40-liner Bitfinex example and a slightly longer BitMEX websocket example, which both update in realtime with Bitcoin/Dollar pulled from the exchange. They also shows realistic and useful indicators (TD Sequential for BFX; and Bollinger Bands and orderbook for BitMEX). The S&P500 example shows you how to display MACD.

Snippets

Background 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' # yellow
fplt.odd_plot_background = '#f0f' # purple
fplt.plot(df.Close)
fplt.show()

Unordered time series

finplot 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 comment here and issue 50 for more info.

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 closing

Time 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)
from dateutil.tz import gettz
fplt.display_timezone = gettz('Asia/Jakarta')

Scatter plot with X-offset

To offset your scatter markers (say 0.2 time intervals to the left), see my comment here.

Align X-axes

See issue 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)

Use fplt.set_x_pos(xmin, xmax, ax). See example-animate.py.

Place Region of Interest (ROI) markers

For placing ellipses, see issue 57. For drawing lines, see example-line.py. (Interactively use Ctrl+drag for lines and Ctrl+mbutton-drag for ellipses.)

More than one Y-axis in same viewbox

fplt.candlestick_ochl(df2[['Open','Close','High','Low']], ax=ax.overlay(scale=1.0, y_axis='linear'))

The scale parameter means it goes all the way to the top of the axis (volume normally stays at the bottom). The y_axis parameter can be one of False (hidden which is default), 'linear' or 'log'. See issue 52 for more info.

Plot non-timeseries

finplot is made for plotting time series. To plot something different use ax.disable_x_index(). See second axis of example-overlay-correlate.py.

Custom crosshair and legend

S&P500 example shows how to set crosshair texts and update legend text+color as a result of mouse hover.

Custom axes ticks

To use your own labels on the X-axis see comment on issue 50. If you want to roll your own Y-axis, inherit fplt.YAxisItem.

Saving screenshot

See example-line.py. To keep screenshot in RAM see issue 28.

Scaling plot heights

See issue 56. Changing the default window size can be achieved by setting fplt.winw = 900; fplt.winh = 500; before creating your plot.

Threading

See issue 55.

Titles on axes

See issue 41.

Beep

fplt.play_sound('bot-happy.wav') # Ooh! Watch me - I just made a profit!

Keys

Esc, Home, End, g, Left arrow, Right arrow. Ctrl+drag.

Missing snippets

Act on mouse hover, update an orderbook, etc.

Metadata

Release files for finplot 1.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for finplot 1.5.1
File Size Uploaded
finplot-1.5.1.tar.gz 44.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for finplot 1.5.1
File Interpreter ABI Platform
finplot-1.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 90.6 kB

Release files / finplot-1.5.1.tar.gz

Download URL finplot-1.5.1.tar.gz
Size 44.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f7f42308fb4fa39c08c02fd7470e84ec5bcb6ead8ddeb775472bee32f7f045b8
BLAKE2b-256 checksum
How to use checksums
379fe8a54ee57a8aa52009d9c2d394f6dedb3b0acdac6c1df07b280fbc534d8e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.9.0

Release files / finplot-1.5.1-py3-none-any.whl

Download URL finplot-1.5.1-py3-none-any.whl
Size 46.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
830b393d0917e02bb3f83d6afe5bfc403782898e4d69e6627e59686d25a7a456
BLAKE2b-256 checksum
How to use checksums
911e99db84c59ae8ed301b6498753566225ecef60d5721bbd0ad96687e2daea2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.6.1 requests/2.25.0 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.54.1 CPython/3.9.0

Release history Release notifications | RSS feed

1.9.7

2 release files

1.9.6

2 release files

1.9.5

2 release files

1.9.4

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.4

2 release files

1.8.3

2 release files

1.8.2

2 release files

1.8.1

2 release files

1.8

2 release files

1.7

2 release files

1.6

2 release files

1.5.4

2 release files

1.5.3

2 release files

1.5.2

2 release files

This release

1.5.1 This release

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.6

3 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.2

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page