A fast orderbook implementation, in C, for Python
Project description
Orderbook
A fast L2/L3 orderbook data structure, in C, for Python
Basic Usage
from decimal import Decimal
import requests
from order_book import OrderBook
ob = OrderBook()
# get some orderbook data
data = requests.get("https://api.pro.coinbase.com/products/BTC-USD/book?level=2").json()
ob.bids = {Decimal(price): size for price, size, _ in data['bids']}
ob.asks = {Decimal(price): size for price, size, _ in data['asks']}
# OR
for side in data:
# there is additional data we need to ignore
if side in {'bids', 'asks'}:
ob[side] = {Decimal(price): size for price, size, _ in data[side]}
# Data is accessible by .index(), which returns a tuple of (price, size) at that level in the book
price, size = ob.bids.index(0)
print(f"Best bid price: {price} size: {size}")
price, size = ob.asks.index(0)
print(f"Best ask price: {price} size: {size}")
print(f"The spread is {ob.asks.index(0)[0] - ob.bids.index(0)[0]}\n\n")
# Data is accessible via iteration
# Note: bids/asks are iterators
print("Bids")
for price in ob.bids:
print(f"Price: {price} Size: {ob.bids[price]}")
print("\n\nAsks")
for price in ob.asks:
print(f"Price: {price} Size: {ob.asks[price]}")
# Data can be exported to a sorted dictionary
# In Python3.7+ dictionaries remain in insertion ordering. The
# dict returned by .to_dict() has had its keys inserted in sorted order
print("\n\nRaw asks dictionary")
print(ob.asks.to_dict())
Main Features
- Sides maintained in correct order
- Can perform orderbook checksums
- Supports max depth and depth truncation
Installation
The preferable way to install is via pip
- pip install order-book
. Installing from source will require a compiler and can be done with setuptools: python setup.py install
.
Running code coverage
The script coverage.sh
will compile the source using the -coverage
CFLAG
, run the unit tests, and build a coverage report in HTML. The script uses tools that may need to be installed (coverage, lcov, genhtml).
Running the performance tests
You can run the performance tests like so: python perf/performance_test.py
. The program will profile the time to run for random data samples of various sizes as well as the construction of a sorted orderbook using live L2 orderbook data from Coinbase.
The performance of constructing a sorted orderbook (using live data from Coinbase) using this C library, versus a pure Python sorted dictionary library:
Library | Time, in seconds |
---|---|
C Library | 0.00021767616271 |
Python Library | 0.00043988227844 |
The performance of constructing sorted dictionaries using the same libraries, as well as the cost of building unsorted, python dictionaies for dictionaries of random floating point data:
Library | Number of Keys | Time, in seconds |
---|---|---|
C Library | 100 | 0.00021600723266 |
Python Library | 100 | 0.00044703483581 |
Python Dict | 100 | 0.00022006034851 |
C Library | 500 | 0.00103306770324 |
Python Library | 500 | 0.00222206115722 |
Python Dict | 500 | 0.00097918510437 |
C Library | 1000 | 0.00202703475952 |
Python Library | 1000 | 0.00423812866210 |
Python Dict | 1000 | 0.00176715850830 |
This represents a roughly 2x speedup compared to a pure python implementation, and in many cases is close to the performance of an unsorted python dictionary.
For other performance metrics, run performance_test.py
as well as the other performance tests in perf/
Changelog
0.6.0 (2022-10-19)
- Update: Drop support for python 3.7
- Feature: to_list method
- Bugfix: Initialize iterator correctly
0.5.0 (2022-08-23)
- Bugfix: fix segmentation fault when calculating checksum on empty orderbook
- Bugfix: fix missing reference decrement
- Performance: Improvement to marking dirty keys
0.4.3 (2022-05-29)
- Bugfix: handle scientific notation of small values in Kraken checksum
- Update: calculate Kraken checksum on order books less than 10 levels deep
- Bugfix: fix occasional incorrect checksums for OKX, FTX and Bitget
0.4.2 (2022-04-17)
- Update: OKEx renamed OKX (for checksum validation)
- Feature: Add support for orderbook checksums with Bitget
0.4.1 (2021-10-12)
- Bugfix: unnecessary reference counting prevented sorted dictionaries from being deallocated
- Bugfix: setting ordering on a sorted dict before checking that it was created successfully
0.4.0 (2021-09-16)
- Feature: changes to code and setup.py to enable compiling on windows
- Feature: add from_type/to_type kwargs to the to_dict methods, allowing for type conversion when creating the dictionary
0.3.2 (2021-09-04)
- Bugfix: depth was incorrectly ignored when converting sorteddict to python dict
0.3.1 (2021-09-01)
- Bugfix: truncate and max_depth not being passed from orderbook to sorteddict object correctly
- Feature: let checksum_format kwarg be set to None
0.3.0 (2021-07-16)
- Update classifiers to indicate this projects only supports MacOS/Linux
- Bugfix: Using less than the minimum number of levels for a checksum with Kraken not raising error correctly
- Update: add del examples to test code
0.2.1 (2021-03-29)
- Bugfix: Invalid deallocation of python object
0.2.0 (2021-03-12)
- Feature: Add branch prediction hints around error handling code
- Bugfix: Fix regression from adding branch predictors
- Bugfix: Fix error corner case when iterating twice on an empty dataset
- Feature: Add contains function for membership test
- Bugfix: Fix issues around storing L3 data
- Feature: Enhance testing, add in L3 book test cases
0.1.1 (2021-02-12)
- Feature: Checksum support for orderbooks
- Feature: FTX checksum support
- Feature: Kraken checksum support
- Feature: OkEX/OKCoin checksum support
- Perf: Use CRC32 table to improve performance of checksum code
0.1.0 (2021-01-18)
- Minor: Use enums to make code more readable
- Bugfix: Add manifest file to ensure headers and changes file are included in sdist builds
- Feature: Add support for max depth and depth truncation
0.0.2 (2020-12-27)
- Bugfix: Fix sorted dictionary arg parsing
- Feature: Coverage report generation for C library
- Bugfix: Fix reference counting in index method in SortedDict
- Feature: New unit tests to improve SortedDict coverage
- Feature: Modularize files
- Feature: Add ability to set bids/asks to dictionaries via attributes or [ ]
- Docs: Update README with simple usage example
0.0.1 (2020-12-26)
- Initial Release
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
Built Distributions
Hashes for order_book-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c5e086acbc8a306c49d234701e76f3370b9dc20ebba6d07eb256fe2c4b7a929f |
|
MD5 | 65ca7718be78646131a4cdef601806f5 |
|
BLAKE2b-256 | 65952ef1ea330112c14abc2aa695645804cd2883fd3e301a6781122d12c2fb0c |
Hashes for order_book-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce6b87fcae2ac62d78c55be6d59f68936eff0304c5621f634fb426b94a0050b8 |
|
MD5 | 3d667cf2efdbf606b01cdc6ce6baa50a |
|
BLAKE2b-256 | 9d26e1e1fa182120520025125940245b9bf6d09d98d6bf485a250016405720ca |
Hashes for order_book-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59f1fa456eb664d5931872169d10ffe79ddccdc40d15bfa5d7cefcfd2db71410 |
|
MD5 | 00344b6ee610cdf3faf9ebad3f974230 |
|
BLAKE2b-256 | 780dc965adb45194474bbe17d141537bcbdfd77c8f7299fb1d5ffc9068aa19e9 |
Hashes for order_book-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | a8dee4474a2d5cd8049677a3eded07c1d14d9dc4a64b00f17b74b5ba6d90c242 |
|
MD5 | 1331ef6127a42f09271baaae0ff817b1 |
|
BLAKE2b-256 | 000c88b3d8b3beec10cbd503432e66ab8f1973c4672fc1ccea52f18a9d70535a |
Hashes for order_book-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b204a33f3dad88299f576748ba71d1f96d7162074d934b48bf6c5b52da1306ef |
|
MD5 | 3739b1003921c2c29abeb036a99a2b3a |
|
BLAKE2b-256 | 2dacdd94c17ffccdb431bccb56f7319c9f4664f8aecb324620f796d4e1eba383 |
Hashes for order_book-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ffd3ae3251bfe4b71ae379d6562a3954f0a1209673f142eaf63fa3a4941a8320 |
|
MD5 | 9ee48356d59d145f9e0219d8bcfd9b73 |
|
BLAKE2b-256 | 2b4b828d7e90a7e905e348814958d5bce39e320df14e4a47cf551feeef43e1d1 |