Skip to main content

A fast orderbook implementation, in C, for Python

Project description

Orderbook

License Python PyPi coverage-lines coverage-functions

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


Download files

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

Source Distribution

order_book-0.4.3.tar.gz (27.3 kB view details)

Uploaded Source

Built Distributions

order_book-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl (27.0 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

order_book-0.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (66.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

order_book-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl (26.2 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

order_book-0.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (68.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

order_book-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl (27.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

order_book-0.4.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (65.7 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

File details

Details for the file order_book-0.4.3.tar.gz.

File metadata

  • Download URL: order_book-0.4.3.tar.gz
  • Upload date:
  • Size: 27.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for order_book-0.4.3.tar.gz
Algorithm Hash digest
SHA256 9aac232649729346484ee58809c9bbded09618a00a822823bf13e19a27ea5790
MD5 4dc5cec9dd603c4d363d2dc940de0d7e
BLAKE2b-256 09c4143970c3289ca79d7a5141998ed761395fdb5209ec314c1d75640bde5dac

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: order_book-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 27.0 kB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for order_book-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b53fb7ab8fa8c15ce83450ed61d4958cf78cca1b1d7a0aaea907a22d43d37bcc
MD5 d7730190516bdde1d4aba1dc2e302051
BLAKE2b-256 d73cb1f34f5691ec708f5e12bc9c36c6f8e53b835656fec8856d016ecc5bd3f3

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for order_book-0.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2bd7f98b211595fb5a59895a0084dfb2981939ec407e1955cf14fac9b9ef8126
MD5 b4fbef3ab8952e674bdc91bfb0341603
BLAKE2b-256 b3af3daa0fcdf948804dbeeda10601b08f6f14e6d4ce7c09ff3eebf4bb8fbb37

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: order_book-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 26.2 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for order_book-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8ee48b94c04d2d74e8d16660208ad885b0c47bbdeb2dd819c1a71cc4d9ce63f7
MD5 6d635a27ab208f0200af171a96175580
BLAKE2b-256 e85696e9fbc0102f40bac7d920b2aa4c5867c3cda233f82b41471e9ae0292697

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for order_book-0.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 6c68a5fcff3c12c05cc8688ce03f47268d61e581a412a7d35269faabaa820f7d
MD5 297ac94f726f0bba63c860ecd5fc35a1
BLAKE2b-256 b83c22e5042f697bb9757e07534a02f96180c3824291bc324653e87d00bfd3f3

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: order_book-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 27.0 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.7.1 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.10.0

File hashes

Hashes for order_book-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3ccfddbd5d73885bc861d9c7e684c01a313a909eab777469c24f9b470ce8ceaf
MD5 b22a2494f31dd34909c328a4cd97660f
BLAKE2b-256 d18a39434f45c1f21fbdfd782675f6b452294b6f0a3ee7bcab601e57ef371070

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.4.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for order_book-0.4.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f4ead1a0b38ef9b69586250311e1e238f7c28842d1de8560f8589c54f68c14ba
MD5 42344d683f33cee64bb170bbacf0a151
BLAKE2b-256 59eac7317582a8858fef207f2ce9576e7e5b8265f27c5c511f2ccfe9d6ab3598

See more details on using hashes here.

Provenance

Supported by

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