View Docs Β· Our Website Β· Join Our Newsletter Β· Getting Started
Blankly is an ecosystem for algotraders enabling anyone to build, monetize and scale their trading algorithms for stocks, crypto, futures or forex. The same code can be backtested, paper traded, sandbox tested and run live by simply changing a single line. Develop locally then deploy, iterate and share using the blankly platform.
Add simulated latency, social media & websocket backtests to existing models or build a new one using live data natively. 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
from blankly import Alpaca, CoinbasePro
stocks = Alpaca()
crypto = CoinbasePro()
futures = BinanceFutures()
# Easily perform the same actions across exchanges & asset types
stocks.interface.market_order('AAPL', 'buy', 1)
crypto.interface.market_order('BTC-USD', 'buy', 1)
# Full futures featureset
futures.interface.get_hedge_mode()
import blankly
"""
This example shows how backtest over tweets
"""
class TwitterBot(blankly.Model):
def main(self, args):
while self.has_data:
self.backtester.value_account()
self.sleep('1h')
def event(self, type_: str, data: str):
# Now check if it's a tweet about Tesla
if 'tsla' in data.lower() or 'gme' in data.lower():
# Buy, sell or evaluate your portfolio
pass
if __name__ == "__main__":
exchange = blankly.Alpaca()
model = TwitterBot(exchange)
# Add the tweets json here
model.backtester.add_custom_events(blankly.data.JsonEventReader('./tweets.json'))
# Now add some underlying prices at 1 month
model.backtester.add_prices('TSLA', '1h', start_date='3/20/22', stop_date='4/15/22')
# Backtest or run live
print(model.backtest(args=None, initial_values={'USD': 10000}))
Check out alternative data examples here
Check out the demo link here.
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
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.
- First install Blankly using
pip
. Blankly is hosted on PyPi.
$ pip install blankly
- 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
- From there, insert your API keys from your exchange into the generated
keys.json
file or take advantage of the CLI keys prompt.
More information can be found on our docs
- Pull a python docker container
$ docker pull python
- Move to a directory to initialize and run
$ blankly init
The working directory format should have at least these files:
Project
|-bot.py
|-keys.json
|-settings.json
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.
Exchange | Live Trading | Websockets | Paper Trading | Backtesting |
---|---|---|---|---|
Coinbase Pro | π’ | π’ | π’ | π’ |
Binance | π’ | π’ | π’ | π’ |
Alpaca | π’ | π’ | π’ | π’ |
OANDA | π’ | π’ | π’ | |
FTX | π’ | π’ | π’ | π’ |
KuCoin | π’ | π’ | π’ | π’ |
Binance Futures | π’ | π’ | π’ | π’ |
FTX Futures | π‘ | π‘ | π’ | π’ |
Okx | π’ | π’ | π’ | π’ |
Kraken | π‘ | π‘ | π‘ | π‘ |
Keyless Backtesting | π’ | |||
TD Ameritrade | π΄ | π΄ | π΄ | π΄ |
Webull | π΄ | π΄ | π΄ | π΄ |
Robinhood | π΄ | π΄ | π΄ | π΄ |
π’ = working
π‘ = in development, some or most features are working
π΄ = planned but not yet in development
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')
https://blankly.substack.com/p/coming-soon
Please report any bugs or issues on the GitHub's Issues page.
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.
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
Blankly is distributed under the LGPL License. See the LICENSE for more details.
New updates every day πͺ.