{"repo":"gbeced/basana","free":true,"listed":false,"github":"https://github.com/gbeced/basana","clone":"git clone https://github.com/gbeced/basana.git","description":"A Python async and event driven framework for algorithmic trading, with a focus on crypto currencies.","language":"Python","stars":857,"topics":["algorithmic-trading","asyncio","backtesting","binance","cryptocurrency","trading-algorithms","trading-bot"],"license":null,"category":"algo_trading_framework","readme_excerpt":"[![Testcases](https://github.com/gbeced/basana/actions/workflows/runtests.yml/badge.svg?branch=master)](https://github.com/gbeced/basana/actions/workflows/runtests.yml)\n[![PyPI version](https://badge.fury.io/py/basana.svg)](https://badge.fury.io/py/basana)\n[![Read The Docs](https://readthedocs.org/projects/basana/badge/?version=latest)](https://basana.readthedocs.io/en/latest/)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Downloads](https://static.pepy.tech/badge/basana/month)](https://pepy.tech/project/basana)\n\n# Basana\n\n**Basana** is a Python **async and event driven** framework for **algorithmic trading**, with a focus on **crypto currencies**.\n\n## Key Features\n\n* Backtesting exchange so you can try your trading strategies before using real funds.\n* Live trading at [Binance](https://www.binance.com/), [Bitstamp](https://www.bitstamp.net/) and 100+ crypto currency exchanges via [CCXT](https://docs.ccxt.com) integration.\n* Asynchronous I/O and event driven.\n\n## Getting Started\n\n### Installation\n\n```\n$ pip install basana[charts,ccxt]\n```\n\nThe examples use [TALIpp](https://github.com/nardew/talipp) for the technical indicators, pandas, statsmodels and also [Textual](https://textual.textualize.io/) if you want to run the Binance order book mirror.\n\n```\n$ pip install talipp pandas statsmodels textual\n```\n\nDownload and unzip [samples](https://github.com/gbeced/basana/releases/download/1.11/samples.zip) or clone the [GitHub](https://github.com/gbeced/basana/) repository.\n\n### Backtest a pairs trading strategy\n\n1. Download historical data for backtesting\n\n\t```\n\t$ python -m basana.external.binance.tools.download_bars -c BCH/USDT -p 1h -s 2021-12-01 -e 2021-12-26 -o binance_bchusdt_hourly.csv\n\t$ python -m basana.external.binance.tools.download_bars -c CVC/USDT -p 1h -s 2021-12-01 -e 2021-12-26 -o binance_cvcusdt_hourly.csv\n\t```\n\n2. Run the backtest\n\n\t```\n\t$ python -m samples.backtest_pairs_trading\n\t```\n\n![./docs/_static/readme_pairs_trading.png](./docs/_static/readme_pairs_trading.png)\n\n### Binance Order Book mirror\n\nThe following example demonstrates how to maintain a synchronized local copy of a Binance order book using Basana's event-driven architecture. It initializes the order book from a REST API snapshot, then continuously updates it with real-time diffs from a WebSocket stream while periodically verifying consistency against fresh snapshots to handle potential synchronization issues.\n\n![./docs/_static/order_book_mirror.png](./docs/_static/order_book_mirror.png)\n\nUse the following command to run the example:\n\n```\n$ python -m samples.binance_order_book_mirror\n```\n\nThe mirroring code can be found [here](./samples/binance/order_book_mirror.py).\n\nThe Basana repository comes with a number of [examples](./samples) you can experiment with or use as a template for your own projects:\n\n**Note that these examples are provided for educational purposes only. Use at your own risk.**\n\n## Documentation\n\n[https://basana.readthedocs.io/en/latest/](https://basana.readthedocs.io/en/latest/)\n\n## Help\n\nYou can seek help with using Basana in the discussion area on [GitHub](https://github.com/gbeced/basana/discussions).\n","default_branch":"develop","files":241,"tree":[".github/copilot-instructions.md",".github/workflows/runtests.yml",".gitignore",".readthedocs.yaml","AGENTS.md","CHANGELOG.md","CLAUDE.md","DEVELOPERS.md","LICENSE","README.md","basana/__init__.py","basana/backtesting/__init__.py","basana/backtesting/account_balances.py","basana/backtesting/charts.py","basana/backtesting/config.py","basana/backtesting/errors.py","basana/backtesting/exchange.py","basana/backtesting/fees.py","basana/backtesting/helpers.py","basana/backtesting/lending/__init__.py","basana/backtesting/lending/base.py","basana/backtesting/lending/margin.py","basana/backtesting/liquidity.py","basana/backtesting/loan_mgr.py","basana/backtesting/order_mgr.py","basana/backtesting/orders.py","basana/backtesting/prices.py","basana/backtesting/requests.py","basana/backtesting/value_map.py","basana/core/__init__.py","basana/core/bar.py","basana/core/config.py","basana/core/dispatcher/__init__.py","basana/core/dispatcher/backtesting.py","basana/core/dispatcher/base.py","basana/core/dispatcher/concurrency.py","basana/core/dispatcher/realtime.py","basana/core/dispatcher/scheduler.py","basana/core/dt.py","basana/core/enums.py","basana/core/errors.py","basana/core/event.py","basana/core/event_sources/__init__.py","basana/core/event_sources/csv.py","basana/core/event_sources/trading_signal.py","basana/core/helpers.py","basana/core/logs.py","basana/core/pair.py","basana/core/token_bucket.py","basana/core/websockets.py","basana/external/__init__.py","basana/external/binance/__init__.py","basana/external/binance/client/__init__.py","basana/external/binance/client/base.py","basana/external/binance/client/margin.py","basana/external/binance/client/spot.py","basana/external/binance/common.py","basana/external/binance/config.py","basana/external/binance/cross_margin.py","basana/external/binance/csv/__init__.py","basana/external/binance/csv/bars.py","basana/external/binance/exchange.py","basana/external/binance/helpers.py","basana/external/binance/isolated_margin.py","basana/external/binance/klines.py","basana/external/binance/margin.py","basana/external/binance/margin_requests.py","basana/external/binance/order_book.py","basana/external/binance/order_book_diff.py","basana/external/binance/spot.py","basana/external/binance/spot_requests.py","basana/external/binance/tools/__init__.py","basana/external/binance/tools/download_bars.py","basana/external/binance/trades.py","basana/external/binance/user_data.py","basana/external/binance/websocket_mgr.py","basana/external/binance/websockets.py","basana/external/bitstamp/__init__.py","basana/external/bitstamp/client.py","basana/external/bitstamp/config.py","basana/external/bitstamp/csv/__init__.py","basana/external/bitstamp/csv/bars.py","basana/external/bitstamp/exchange.py","basana/external/bitstamp/helpers.py","basana/external/bitstamp/order_book.py","basana/external/bitstamp/orders.py","basana/external/bitstamp/requests.py","basana/external/bitstamp/tools/__init__.py","basana/external/bitstamp/tools/download_bars.py","basana/external/bitstamp/trades.py","basana/external/bitstamp/websockets.py","basana/external/ccxt/__init__.py","basana/external/ccxt/bars.py","basana/external/ccxt/exchange.py","basana/external/ccxt/helpers.py","basana/external/ccxt/order_book.py","basana/external/ccxt/orders.py","basana/external/ccxt/requests.py","basana/external/ccxt/trades.py","basana/external/ccxt/watch_event_source.py","basana/external/common/__init__.py","basana/external/common/csv/__init__.py","basana/external/common/csv/bars.py","basana/external/yahoo/__init__.py","basana/external/yahoo/bars.py","docs/Makefile","docs/_static/backtesting_bbands.png","docs/_static/order_book_mirror.png","docs/_static/readme_pairs_trading.png","docs/api.rst","docs/backtesting_charts.rst","docs/backtesting_exchange.rst","docs/backtesting_fees.rst","docs/backtesting_lending.rst","docs/backtesting_liquidity.rst","docs/basana.rst","docs/binance_cross.rst","docs/binance_exchange.rst","docs/binance_isolated.rst","docs/binance_margin.rst","docs/binance_order_book.rst","docs/binance_order_book_diff.rst","docs/binance_spot.rst","docs/binance_trades.rst","docs/binance_user_data.rst","docs/bitstamp_exchange.rst","docs/bitstamp_order_book.rst","docs/bitstamp_orders.rst","docs/bitstamp_trades.rst","docs/ccxt_exchange.rst","docs/ccxt_order_book.rst","docs/ccxt_orders.rst","docs/ccxt_trades.rst","docs/conf.py","docs/help.rst","docs/index.rst","docs/make.bat","docs/quickstart.rst","non-shippable/backtest-benchmark.py","non-shippable/dispatcher-benchmark.py","pyproject.toml","samples/__init__.py","samples/backtest_bbands.py","samples/backtest_pairs_trading.py","samples/backtest_rsi.py","samples/backtest_sma.py","samples/backtesting/__init__.py","samples/backtesting/position_manager.py","samples/binance/__init__.py","samples/binance/order_book_mirror.py","samples/binance/position_manager.py","samples/binance_bbands.py","samples/binance_order_book_mirror.py","samples/binance_websockets.py","samples/bitstamp_websockets.py","samples/ccxt_bbands.py","samples/ccxt_util/__init__.py","samples/ccxt_util/position_manager.py","samples/ccxt_websockets.py","samples/core/__init__.py","samples/core/position_manager.py","samples/strategies/__init__.py","samples/strategies/bbands.py","samples/strategies/dmac.py","samples/strategies/pairs_trading.py","samples/strategies/rsi.py","samples/strategies/sma.py","setup.cfg","tasks.py","tests/__init__.py","tests/backtesting_exchange_orders_test_data.py","tests/common.py","tests/conftest.py","tests/data/binance_btc_usdt_exchange_info.json","tests/data/binance_btcusdt_day_2020.csv","tests/data/binance_cross_margin_account_details.json","tests/data/binance_depth_update.json","tests/data/binance_isolated_margin_account_details.json","tests/data/bitstamp_btcusd_day_2015.csv","tests/data/bitstamp_btcusd_day_2015.csv.utf16","tests/data/bitstamp_btcusd_min_2020_01_01.csv","tests/data/orcl-2000-yahoo-sorted.csv","tests/data/orcl-2000-yahoo.csv","tests/data/orcl-2001-yahoo.csv","tests/fixtures/__init__.py","tests/fixtures/binance.py","tests/fixtures/bitstamp.py","tests/fixtures/ccxt.py","tests/fixtures/dispatcher.py","tests/helpers.py","tests/test_backtesting_account_balances.py","tests/test_backtesting_charts.py","tests/test_backtesting_config.py","tests/test_backtesting_dispatcher.py","tests/test_backtesting_exchange.py","tests/test_backtesting_exchange_auto_lending.py","tests/test_backtesting_exchange_loans.py","tests/test_backtesting_exchange_orders.py","tests/test_backtesting_fees.py","tests/test_backtesting_liquidity.py","tests/test_backtesting_margin.py","tests/test_backtesting_orders.py","tests/test_backtesting_prices.py","tests/test_backtesting_value_map.py","tests/test_bar.py","tests/test_binance_bars.py","tests/test_binance_client.py","tests/test_binance_csv_bars.py","tests/test_binance_exchange.py","tests/test_binance_exchange_cross_margin.py","tests/test_binance_exchange_isolated_margin.py","tests/test_binance_exchange_spot.py","tests/test_binance_order_book updates.py","tests/test_binance_order_book.py","tests/test_binance_tools.py","tests/test_binance_trades.py","tests/test_binance_user_data.py","tests/test_bitstamp_bars.py","tests/test_bitstamp_client.py","tests/test_bitstamp_csv_bars.py","tests/test_bitstamp_exchange.py","tests/test_bitstamp_order_book.py","tests/test_bitstamp_orders.py","tests/test_bitstamp_tools.py","tests/test_bitstamp_trades.py","tests/test_ccxt_exchange.py","tests/test_config.py","tests/test_core_dt.py","tests/test_core_helpers.py","tests/test_core_websockets.py","tests/test_dispatcher_core.py","tests/test_enums.py","tests/test_event.py","tests/test_pair.py","tests/test_realtime_dispatcher.py","tests/test_samples_backtesting_pos_info.py","tests/test_samples_binance_order_book_mirror.py","tests/test_token_bucket.py","tests/test_trading_signal.py","tests/test_yahoo.py","uv.lock"],"storefront":"/r/gbeced","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/gbeced/basana/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}