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


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.5.0.tar.gz (27.5 kB view details)

Uploaded Source

Built Distributions

order_book-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl (27.2 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

order_book-0.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (67.3 kB view details)

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

order_book-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl (26.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

order_book-0.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (68.8 kB view details)

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

order_book-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl (27.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

order_book-0.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (66.0 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.5.0.tar.gz.

File metadata

  • Download URL: order_book-0.5.0.tar.gz
  • Upload date:
  • Size: 27.5 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.5.0.tar.gz
Algorithm Hash digest
SHA256 3ca1aed68078ef5ff3b15fe35ae150fcbced6d21605dee72e9fef91c49752187
MD5 f51f47e558371569e643b7c4b280d377
BLAKE2b-256 b0ee0a9bf06103fd8dfce7de898be78c103a412d1c9906666e360e76eab56599

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: order_book-0.5.0-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 27.2 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.5.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ac5dff7685b1b6cc90500323a8d0eee3038963a692d2859759d14055b90b869b
MD5 7f9567e29807ca6d30735b23d0f137e5
BLAKE2b-256 f4aa9985fb226ad59dc136e1a9a4af1114fb39e2dc5aa2603820ce4a856d8db9

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.5.0-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.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 2847054a632d229badd5517a4e299723b66415c91f73760fe104473dbfff3a23
MD5 e7fdcf2dfdce8f6aace80cbf5e49685a
BLAKE2b-256 86f81aa9a88e2ae388d199ec78a42eb556d0877cd8e0992e3a2f7a09c8bc16d5

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: order_book-0.5.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 26.3 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.5.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f7846561d937d4203ad5a3f11dc06951e86b05970f7b651e9db725f75b3d1178
MD5 da268c1bc60ce6e2237e49f48729317c
BLAKE2b-256 105eeaa5c2def3b402410adef2ed71fcb7db02196220dd67cf1cb8d1a3f056dd

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.5.0-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.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 49395006b6fc7d57cf3f11855694771e5d34fb2fb3ac16833d2794a3090f1f39
MD5 c49cf02f77a9d2d1cdc688b1dacae5b7
BLAKE2b-256 d04b67ed4ffeaa5a5e9f06d22abb5b57a958c120aff99a84868ab8e8601bc0a1

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: order_book-0.5.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 27.1 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.5.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2c47a4b06e849476ccc5e789c2c7fd018ea532588c2ee359ac05003d4b12690f
MD5 52649b5a5bd2f5ccd5e6547721bfa7b6
BLAKE2b-256 bcb636f66f696cf8a7634529ec4fd18bfca844240e2b8567cb3e88653eb3fad0

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.5.0-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.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 68b9059f44abc780d2e85640a12d006e2879f899e98cfe06b686b28db0d0f268
MD5 41acdadec94d38bc14b4f8f899c7630f
BLAKE2b-256 6ceff701e6374771db04a887f60c4d84f1aac2220ec947906bcf101a5303b6a4

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