Find your trading edge, using the fastest engine for backtesting, algorithmic trading, and research.
Alternatives To Vectorbt
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Freqtrade24,451216 hours ago59November 30, 202346gpl-3.0Python
Free, open source crypto trading bot
2 days ago1March 29, 201610mitPython
Zipline16,88379610 days ago30October 05, 2020361apache-2.0Python
Zipline, a Pythonic Algorithmic Trading Library
Awesome Quant15,205
a day ago9Python
A curated list of insanely awesome libraries, packages and resources for Quants (Quantitative Finance)
4 months ago2gpl-3.0Python
阿布量化交易系统(股票,期权,期货,比特币,机器学习) 基于python的开源量化交易,量化投资架构
a day ago6December 05, 2023370apache-2.0Python
Open source software that helps you create and deploy high-frequency crypto trading bots
Stocksharp6,409171a day ago177December 08, 20238apache-2.0C#
Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
Financial Machine Learning5,345
a day ago5Python
A curated list of practical financial machine learning tools and applications.
Jesse5,080220 hours ago209December 04, 20235mitPython
An advanced crypto trading bot written in Python
Crypto Signal4,618
9 days ago66mitPython - Trading & Technical Analysis Bot - 4,100+ stars, 1,100+ forks
Alternatives To Vectorbt
Select To Compare

Alternative Project Comparisons

✨ Usage

vectorbt allows you to easily backtest strategies with a couple of lines of Python code.

  • Here is how much profit we would have made if we invested $100 into Bitcoin in 2014:
import vectorbt as vbt

price ='BTC-USD').get('Close')

pf = vbt.Portfolio.from_holding(price, init_cash=100)
  • Buy whenever 10-day SMA crosses above 50-day SMA and sell when opposite:
fast_ma =, 10)
slow_ma =, 50)
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

pf = vbt.Portfolio.from_signals(price, entries, exits, init_cash=100)
  • Generate 1,000 strategies with random signals and test them on BTC and ETH:
import numpy as np

symbols = ["BTC-USD", "ETH-USD"]
price =, missing_index='drop').get('Close')

n = np.random.randint(10, 101, size=1000).tolist()
pf = vbt.Portfolio.from_random_signals(price, n=n, init_cash=100, seed=42)

mean_expectancy = pf.trades.expectancy().groupby(['randnx_n', 'symbol']).mean()
fig = mean_expectancy.unstack().vbt.scatterplot(xaxis_title='randnx_n', yaxis_title='mean_expectancy')


  • For fans of hyperparameter optimization: here is a snippet for testing 10,000 window combinations of a dual SMA crossover strategy on BTC, USD, and LTC:
symbols = ["BTC-USD", "ETH-USD", "LTC-USD"]
price =, missing_index='drop').get('Close')

windows = np.arange(2, 101)
fast_ma, slow_ma = vbt.MA.run_combs(price, window=windows, r=2, short_names=['fast', 'slow'])
entries = fast_ma.ma_crossed_above(slow_ma)
exits = fast_ma.ma_crossed_below(slow_ma)

pf_kwargs = dict(size=np.inf, fees=0.001, freq='1D')
pf = vbt.Portfolio.from_signals(price, entries, exits, **pf_kwargs)

fig = pf.total_return().vbt.heatmap(
    x_level='fast_window', y_level='slow_window', slider_level='symbol', symmetric=True,
    trace_kwargs=dict(colorbar=dict(title='Total return', tickformat='%')))

Digging into each strategy configuration is as simple as indexing with pandas:

pf[(10, 20, 'ETH-USD')].stats()
Start                          2015-08-07 00:00:00+00:00
End                            2021-08-01 00:00:00+00:00
Period                                2183 days 00:00:00
Start Value                                        100.0
End Value                                  620402.791485
Total Return [%]                           620302.791485
Benchmark Return [%]                        92987.961948
Max Gross Exposure [%]                             100.0
Total Fees Paid                             10991.676981
Max Drawdown [%]                               70.734951
Max Drawdown Duration                  760 days 00:00:00
Total Trades                                          54
Total Closed Trades                                   53
Total Open Trades                                      1
Open Trade PnL                              67287.940601
Win Rate [%]                                   52.830189
Best Trade [%]                               1075.803607
Worst Trade [%]                               -29.593414
Avg Winning Trade [%]                          95.695343
Avg Losing Trade [%]                          -11.890246
Avg Winning Trade Duration    35 days 23:08:34.285714286
Avg Losing Trade Duration                8 days 00:00:00
Profit Factor                                   2.651143
Expectancy                                   10434.24247
Sharpe Ratio                                    2.041211
Calmar Ratio                                      4.6747
Omega Ratio                                     1.547013
Sortino Ratio                                   3.519894
Name: (10, 20, ETH-USD), dtype: object

The same for plotting:

pf[(10, 20, 'ETH-USD')].plot().show()


It's not all about backtesting - vectorbt can be used to facilitate financial data analysis and visualization.

  • Let's generate a GIF that animates the %B and bandwidth of Bollinger Bands for different symbols:
symbols = ["BTC-USD", "ETH-USD", "ADA-USD"]
price =, period='6mo', missing_index='drop').get('Close')
bbands =

def plot(index, bbands):
    bbands = bbands.loc[index]
    fig = vbt.make_subplots(
        rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.15,
        subplot_titles=('%B', 'Bandwidth'))
    fig.update_layout(template='vbt_dark', showlegend=False, width=750, height=400)
        trace_kwargs=dict(zmin=0, zmid=0.5, zmax=1, colorscale='Spectral', colorbar=dict(
            y=(fig.layout.yaxis.domain[0] + fig.layout.yaxis.domain[1]) / 2, len=0.5
        )), add_trace_kwargs=dict(row=1, col=1), fig=fig)
            y=(fig.layout.yaxis2.domain[0] + fig.layout.yaxis2.domain[1]) / 2, len=0.5
        )), add_trace_kwargs=dict(row=2, col=1), fig=fig)
    return fig

vbt.save_animation('bbands.gif', bbands.wrapper.index, plot, bbands, delta=90, step=3, fps=3)
100%|██████████| 31/31 [00:21<00:00,  1.21it/s]

And this is just the tip of the iceberg of what's possible. Check out the website to learn more.


pip install -U vectorbt

To also install optional dependencies:

pip install -U "vectorbt[full]"


This work is fair-code distributed under Apache 2.0 with Commons Clause license. The source code is open and everyone (individuals and organizations) can use it for free. However, it is not allowed to sell products and services that are mostly just this software.

If you have any questions about this or want to apply for a license exception, please contact the author.

Installing optional dependencies may be subject to a more restrictive license.

Star History

Star History Chart


This software is for educational purposes only. Do not risk money which you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS.

Popular Trading Projects
Popular Algorithmic Trading Projects
Popular Economics Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Machine Learning
Data Science
Data Visualization
Time Series
Algorithmic Trading
Trading Strategies
Quantitative Finance