Skip to main content

Rapidly build & deploy cross-exchange trading bots

Project description



💨 Rapidly build and deploy quantitative models for stocks, crypto, and forex 🚀


View Docs · Our Website · Join Our Newsletter · Getting Started


Why Blankly?

​ Blankly is a live trading engine, backtest runner and development framework wrapped into one powerful open source package. Models can be instantly backtested, paper traded, sandbox tested and run live by simply changing a single line. We built blankly for every type of quant including training & running ML models in the same environment, cross-exchange/cross-symbol arbitrage, and even long/short positions on stocks (all with built-in websockets).

​ Convert your existing model or build a new one - unlock the ability to run & optimize across all of our supported exchanges. Getting started is easy - just pip install blankly and blankly init.

Check out our website and our docs.

YouTube - Under 25 Lines Build an Alpaca RSI Trading Bot

Trade Stocks, Crypto, and Forex Seamlessly

from blankly import Alpaca, CoinbasePro

stocks = Alpaca()
crypto = CoinbasePro()

# Easily perform the same actions across exchanges & asset types
stocks.interface.market_order('AAPL', 'buy', 1)
crypto.interface.market_order('BTC-USD', 'buy', 1)

Backtest Instantly Across Symbols

from blankly import Alpaca, Strategy, StrategyState


def price_event(price, symbol, state):
    # Trading logic here
    state.interface.market_order(symbol, 'buy', 1)


# Authenticate
alpaca = Alpaca()
strategy = Strategy(alpaca)

# Check price every hour and send to the strategy function
# Easily switch resolutions and data
strategy.add_price_event(price_event, 'AAPL', '1h')
strategy.add_price_event(price_event, 'MSFT', '15m')

# Run the backtest
strategy.backtest(to='1y')

Accurate Backtest Holdings

Useful Metrics

Blankly Metrics: 
Compound Annual Growth Rate (%):   54.0%
Cumulative Returns (%):            136.0%
Max Drawdown (%):                  60.0%
Variance (%):                      26.15%
Sortino Ratio:                     0.9
Sharpe Ratio:                      0.73
Calmar Ratio:                      0.99
Volatility:                        0.05
Value-at-Risk:                     358.25
Conditional Value-at-Risk:         34.16

Go Live in One Line

Seamlessly run your model live!

# Just turn this
strategy.backtest(to='1y')
# Into this
strategy.start()

Dates, times, and scheduling adjust on the backend to make the experience instant.

Quickstart

Installation

  1. First install Blankly using pip. Blankly is hosted on PyPi.
$ pip install blankly
  1. Next, just run:
$ blankly init

This will initialize your working directory.

The command will create the files keys.json, settings.json, backtest.json, blankly.json and an example script called bot.py.

If you don't want to use our init command, you can find the same files in the examples folder under settings.json and keys_example.json

  1. From there, insert your API keys from your exchange into the generated keys.json file.

More information can be found on our docs

Directory format

The working directory format should have at least these files:

Project
   |-bot.py
   |-keys.json
   |-settings.json

Additional Info

Make sure you're using a supported version of python. The module is currently tested on these versions:

  • Python 3.7
  • Python 3.8
  • Python 3.9
  • Python 3.10

For more info, and ways to do more advanced things, check out our getting started docs.

Supported Exchanges

Exchange Live Trading Websockets Paper Trading Backtesting
Coinbase Pro 🟢 🟢 🟢 🟢
Binance 🟢 🟢 🟢 🟢
Alpaca 🟢 🟢 🟢 🟢
OANDA 🟢 🟡 🟢 🟢
FTX 🟢 🟢 🟢 🟢
KuCoin 🟢 🟡 🟢 🟢
Kraken 🟡 🟡 🟡 🟡
Keyless Backtesting 🟢
TD Ameritrade 🔴 🔴 🔴 🔴
Webull 🔴 🔴 🔴 🔴
Robinhood 🔴 🔴 🔴 🔴

🟢 = working

🟡 = in development, some or most features are working

🔴 = planned but not yet in development

RSI Example

We have a pre-built cookbook examples that implement strategies such as RSI, MACD, and the Golden Cross found in our examples.

The model below will run an RSI check every 30 minutes - buying below 30 and selling above 70. Try switching the exchange and assets and see how it instantly works on Binance, Coinbase Pro or anything else you trade on.

import blankly
from blankly import StrategyState


def price_event(price, symbol, state: StrategyState):
    """ This function will give an updated price every 15 seconds from our definition below """
    state.variables['history'].append(price)
    rsi = blankly.indicators.rsi(state.variables['history'])
    
    if rsi[-1] < 30 and not state.variables['has_bought']:
        # Dollar cost average buy
        state.variables['has_bought'] = True
        state.interface.market_order(symbol, side='buy', size=1)
    elif rsi[-1] > 70 and state.variables['has_bought']:
        # Dollar cost average sell
        state.variables['has_bought'] = False
        state.interface.market_order(symbol, side='sell', size=1)


def init(symbol, state: StrategyState):
    # Download price data to give context to the algo
    state.variables['history'] = state.interface.history(symbol, to='1y', return_as='list')['open']
    state.variables['has_bought'] = False


if __name__ == "__main__":
    # Authenticate on alpaca to create a strategy
    alpaca = blankly.Alpaca()

    # Use our strategy helper on alpaca
    strategy = blankly.Strategy(alpaca)

    # Run the price event function every time we check for a new price - by default that is 15 seconds
    strategy.add_price_event(price_event, symbol='NCLH', resolution='30m', init=init)
    strategy.add_price_event(price_event, symbol='CRBP', resolution='1h', init=init)
    strategy.add_price_event(price_event, symbol='D', resolution='15m', init=init)
    strategy.add_price_event(price_event, symbol='GME', resolution='30m', init=init)

    # Start the strategy. This will begin each of the price event ticks
    # strategy.start()
    # Or backtest using this
    strategy.backtest(to='1y')

Other Info

Subscribe to our news!

https://blankly.substack.com/p/coming-soon

Bugs

Please report any bugs or issues on the GitHub's Issues page.

Disclaimer

Trading is risky. We are not responsible for losses incurred using this software, software fitness for any particular purpose, or responsibility for any issues or bugs. This is free software.

Contributing

If you would like to support the project, pull requests are welcome. You can also contribute just by telling us what you think of Blankly: https://forms.gle/4oAjG9MKRTYKX2hP9

Licensing

Blankly is distributed under the LGPL License. See the LICENSE for more details.

New updates every day 💪.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blankly-1.16.0b0.tar.gz (277.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

blankly-1.16.0b0-py3-none-any.whl (214.4 kB view details)

Uploaded Python 3

File details

Details for the file blankly-1.16.0b0.tar.gz.

File metadata

  • Download URL: blankly-1.16.0b0.tar.gz
  • Upload date:
  • Size: 277.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.0

File hashes

Hashes for blankly-1.16.0b0.tar.gz
Algorithm Hash digest
SHA256 74d7cee13ff00f630b4d36af5ae7a5e7a31d62a1512bf751f3100d7034a87060
MD5 14e4c68480337dd483be7dbeff43ec00
BLAKE2b-256 040364b37fabb9b6b6cf77963f4a1ae895feae35c134556e50ae74cdad047349

See more details on using hashes here.

File details

Details for the file blankly-1.16.0b0-py3-none-any.whl.

File metadata

  • Download URL: blankly-1.16.0b0-py3-none-any.whl
  • Upload date:
  • Size: 214.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.0 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.7.0

File hashes

Hashes for blankly-1.16.0b0-py3-none-any.whl
Algorithm Hash digest
SHA256 0a9a39ce15ccbf50a7acedaab079ac5e4c65e1398f61e5cf057d607c16413d05
MD5 d35ae08a0ff81f35b1b648878ebd6cd4
BLAKE2b-256 cdbc3231da1dab45c8a2ffe8237d7a5e58ce9a0b79ca2766e0d2b16d92c851d9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page