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

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

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

order_book-0.2.0-cp39-cp39-manylinux2010_x86_64.whl (59.0 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

order_book-0.2.0-cp39-cp39-manylinux1_x86_64.whl (59.0 kB view details)

Uploaded CPython 3.9

order_book-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl (24.5 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

order_book-0.2.0-cp38-cp38-manylinux2010_x86_64.whl (60.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

order_book-0.2.0-cp38-cp38-manylinux1_x86_64.whl (60.1 kB view details)

Uploaded CPython 3.8

order_book-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl (25.3 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

order_book-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl (57.9 kB view details)

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

order_book-0.2.0-cp37-cp37m-manylinux1_x86_64.whl (57.9 kB view details)

Uploaded CPython 3.7m

order_book-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl (25.0 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file order_book-0.2.0-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 59.0 kB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 341e040db70054b0e81a489597acff2b53308b7036b921179bf3e551b2fc3e69
MD5 c7eb95b85cc61bdba13c29861c4d5c40
BLAKE2b-256 8ba48a24bbb421c755fd236ca30abafe41f529db6f41795e97dbb326ac7c2f27

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp39-cp39-manylinux1_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 59.0 kB
  • Tags: CPython 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 83339b22d8050d9635c276e0a8337442674d9784db6887377c288673c75095db
MD5 3529eab941b2a990f21acac0bc2bfb87
BLAKE2b-256 585c02a73bdc95ef3c3f7a1164235efa244cb2805fd310988fb0e55f39740826

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: order_book-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 24.5 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b2d8dbcdeceb7d8c6e8ff8eb93501ff1446e2f104ef7dc10a9bb0db6741bf78f
MD5 3cd45fbc28ba1f26cfc60b2b26679ac6
BLAKE2b-256 258363ff2fc4376c66fbfb698c4ccd26c72d163117bac2c340a9c68f8b5ddc67

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 60.1 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 0c7991ae7ae9c462ca76eb802a6113d46ebbc62e9947360fbd528e5ce0df3895
MD5 c91d69cedcaa8a9ce3d1c7e22beff35a
BLAKE2b-256 db727d4b8a5dad58bde6463ea64abf4ae2d0e96357fb159fbd37f21fb1f82d06

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 60.1 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e3549968f4049c7a067031401095712dc0a7354934c4308c62d22553d80d79ef
MD5 cea35f0d83dbfe1b603205f3872a890a
BLAKE2b-256 8e7f6da0344797ddcb702b967674c30c3ddc65bdf1e78574f1d388a4f86cbd0f

See more details on using hashes here.

Provenance

File details

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

File metadata

  • Download URL: order_book-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 25.3 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0a25b4fe8b4ae985c4287d547d0837ed34099e9c14bddd78df9c2428b2e296fb
MD5 33ef056d4ea1a2d46c3f8abf8578602b
BLAKE2b-256 39df37432b21dbe91ccdda015810ac17312005e9210b80296ffb7df02cac87ca

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 57.9 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ce5d53264d7fe49a1310cd53cfdfc277302cfedecc6f1c84b6c0488af07c76e2
MD5 f9619e9f8938196097e59916c7e26a3d
BLAKE2b-256 6c5b5ac043997fc9ab576083a7d6b3735756661ef4cbbc59ae4722fe8d62025a

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 57.9 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 92dd07bc94593dd0c0b8f56b2e71c61b8cd40a2c21f78e89895605093987ddad
MD5 9035f19f5d7ebf19213373698f6b8294
BLAKE2b-256 5b09f0387d252fa692ef3f8d21659329d913e545b73d7ba48dcdf5cac92c9c31

See more details on using hashes here.

Provenance

File details

Details for the file order_book-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: order_book-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/51.0.0.post20201207 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.9.1

File hashes

Hashes for order_book-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5a723920a5d2b909695144d23be27ff32625f7e6dede42d5fa0085532999e31f
MD5 33ee7004caf647e024cf1dc2ce4e546b
BLAKE2b-256 d41899d0b8b64af34579fe0dbfbb2cfd67d608519cf8075353dda348917a465e

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