README.md


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

    Sponsored Promotion

    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 your trades, events, websockets, and custom data

    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.EventReader('./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

    Accurate Backtest Holdings

    Check out the demo link here.

    Iterate & Train using your Metrics, Trades and Performance

    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 or take advantage of the CLI keys prompt.

    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 🟢 🟢 🟢 🟢
    Okx 🟢 🟢 🟢 🟢
    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 💪.

    项目简介

    🚀 💸 Easily build, backtest and deploy your algo in just a few lines of code. Trade stocks, cryptos, and forex across exchanges w/ one package.

    🚀 Github 镜像仓库 🚀

    源项目地址

    https://github.com/blankly-finance/blankly

    发行版本 27

    v1.17.0-beta

    全部发行版

    贡献者 16

    全部贡献者

    开发语言

    • Python 100.0 %