ClickHouse¶
Server¶
Please refer to Yandex’ official documentation here.
An official image is available from Docker Hub.
Important
Port 8123 must be accessible by the host.
You can do this by adding the --publish 8123:8123
flag to the
Docker command-line.
Client¶
Clickhouse ships with a command-line interface named clickhouse-client
.
Adapter¶
The roq-clickhouse
adapter can be started like this
$ roq-clickhouse \
--name clickhouse \
--uri http://localhost:8123 \
--database_name roq \
--create_database true \
--event_log_dir $EVENT_LOG_DIR
Note
The event-log dir should be an absolute path.
This assumes a database server running on the same host and gateway event-logs being written to the home directoy.
The adapter will monitor the event-log directory tree and automatically export updates to ClickHouse.
For further details, please refer to the reference documentation here.
Admin¶
Create¶
To create a database
:) create database roq
Note
This will automatically be done when using the --create_database=true
command-line flag with roq-clickhouse
.
Statistics¶
Measurements¶
Get a list of tables
:) show tables
┌─name───────────────┐
│ cancel_all_orders │
│ cancel_order │
│ create_order │
│ custom_metrics │
│ external_latency │
│ funds │
│ gateway_settings │
│ gateway_status │
│ market_by_order │
│ market_by_price │
│ market_status │
│ modify_order │
│ order_ack │
│ orders │
│ positions │
│ rate_limit_trigger │
│ reference_data │
│ statistics │
│ stream_status │
│ top_of_book │
│ trade_summary │
│ trades │
└────────────────────┘
Fields¶
Get a list of the fields
:) desc statistics
┌─name───────────────────┬─type───────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ gateway │ LowCardinality(String) │ │ │ │ │ │
│ session_id │ UUID │ │ │ │ │ │
│ seqno │ UInt64 │ │ │ │ │ │
│ source │ LowCardinality(String) │ │ │ │ │ │
│ receive_time_utc │ DateTime64(9) │ │ │ │ │ │
│ receive_time │ UInt64 │ │ │ │ │ │
│ source_send_time │ UInt64 │ │ │ │ │ │
│ source_receive_time │ UInt64 │ │ │ │ │ │
│ origin_create_time │ UInt64 │ │ │ │ │ │
│ origin_create_time_utc │ DateTime64(9) │ │ │ │ │ │
│ is_last │ Int8 │ │ │ │ │ │
│ stream_id │ UInt16 │ │ │ │ │ │
│ exchange │ LowCardinality(String) │ │ │ │ │ │
│ symbol │ LowCardinality(String) │ │ │ │ │ │
│ type │ LowCardinality(String) │ │ │ │ │ │
│ value │ Float64 │ │ │ │ │ │
│ begin_time_utc │ DateTime64(0) │ │ │ │ │ │
│ end_time_utc │ DateTime64(0) │ │ │ │ │ │
│ update_type │ LowCardinality(String) │ │ │ │ │ │
│ exchange_time_utc │ DateTime64(9) │ │ │ │ │ │
└────────────────────────┴────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
Count¶
Get a row-count for a table
:) select count(*) from market_by_price
┌───count()─┐
│ 333875641 │
└───────────┘
Query¶
Reference Data¶
We select the latest values for each column.
TODO
Top of Book (ToB)¶
Table: market_by_price
SELECT *
FROM
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(price_0, receive_time_utc) AS bid_price,
argMax(quantity_0, receive_time_utc) AS bid_quantity
FROM market_by_price
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL' AND
side = 'BUY'
GROUP BY time
) AS lhs
FULL OUTER JOIN
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(price_0, receive_time_utc) AS ask_price,
argMax(quantity_0, receive_time_utc) AS ask_quantity
FROM market_by_price
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL' AND
side = 'SELL'
GROUP BY time
) AS rhs
USING time
ORDER BY time
Query id: 6eb21d1a-20be-4f7c-849e-9ca8f79e66a6
┌────────────────time─┬─bid_price─┬─bid_quantity─┬─ask_price─┬─ask_quantity─┐
│ 2021-12-07 03:48:00 │ 50934 │ 2316 │ 50934.5 │ 14727 │
│ 2021-12-07 03:49:00 │ 50954.5 │ 9 │ 50955 │ 12316 │
│ 2021-12-07 03:50:00 │ 50964 │ 16659 │ 50964.5 │ 634 │
│ 2021-12-07 03:51:00 │ 50980.5 │ 9711 │ 50981 │ 26 │
│ 2021-12-07 03:52:00 │ 50980.5 │ 9808 │ 50981 │ 26 │
│ 2021-12-07 03:53:00 │ 51020 │ 7261 │ 51020.5 │ 602 │
│ 2021-12-07 03:54:00 │ 51013 │ 4142 │ 51013.5 │ 250 │
│ 2021-12-07 03:55:00 │ 51024 │ 15070 │ 51024.5 │ 1 │
│ 2021-12-07 03:56:00 │ 51053 │ 4 │ 51053.5 │ 9743 │
│ 2021-12-07 03:57:00 │ 51040 │ 1 │ 51040.5 │ 500 │
│ 2021-12-07 03:58:00 │ 51049 │ 8233 │ 51049.5 │ 1266 │
└─────────────────────┴───────────┴──────────────┴───────────┴──────────────┘
11 rows in set. Elapsed: 0.780 sec. Processed 12.47 million rows, 356.97 MB (15.98 million rows/s., 457.69 MB/s.)
Weighted Mid Price¶
Table: market_by_price
InfluxQL
SELECT time, (bp * aq + ap * bq) / (bq + aq) AS mid
FROM
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(price_0, receive_time_utc) AS bp,
argMax(quantity_0, receive_time_utc) AS bq
FROM market_by_price
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL' AND
side = 'BUY'
GROUP BY time
) AS lhs
FULL OUTER JOIN
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(price_0, receive_time_utc) AS ap,
argMax(quantity_0, receive_time_utc) AS aq
FROM market_by_price
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL' AND
side = 'SELL'
GROUP BY time
) AS rhs
USING time
ORDER BY time
Query id: b8850ea4-39a9-43fd-8cfb-aaa769b9a6ad
┌────────────────time─┬────────────────mid─┐
│ 2021-12-07 03:49:00 │ 50954.50036511156 │
│ 2021-12-07 03:50:00 │ 50964.48166888336 │
│ 2021-12-07 03:51:00 │ 50980.998664886516 │
│ 2021-12-07 03:52:00 │ 50980.99867805572 │
│ 2021-12-07 03:53:00 │ 51020.461719445506 │
│ 2021-12-07 03:54:00 │ 51013.471539162114 │
│ 2021-12-07 03:55:00 │ 51024.4999668237 │
│ 2021-12-07 03:56:00 │ 51053.00020519134 │
│ 2021-12-07 03:57:00 │ 51040.00099800399 │
│ 2021-12-07 03:58:00 │ 51035.29381443299 │
└─────────────────────┴────────────────────┘
10 rows in set. Elapsed: 0.587 sec. Processed 12.89 million rows, 368.53 MB (21.94 million rows/s., 627.29 MB/s.)
Open-High-Low-Close (OHLC)¶
Table: trade_summary
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMin(price_vwap, receive_time_utc) AS open,
max(price_vwap) AS high,
min(price_vwap) AS low,
argMax(price_vwap, receive_time_utc) AS close,
sum(quantity) AS volume
FROM trade_summary
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL'
GROUP BY time
ORDER BY time
Query id: 342a86d7-c5ff-47ce-a276-1685c9b37d89
┌────────────────time─┬──────────────open─┬────high─┬───────────────low─┬─────────────close─┬─volume─┐
│ 2021-12-07 03:49:00 │ 50964 │ 50964 │ 50954.5 │ 50954.5 │ 26 │
│ 2021-12-07 03:50:00 │ 50954.5 │ 50964 │ 50943.5 │ 50964 │ 2193 │
│ 2021-12-07 03:51:00 │ 50965.03095684803 │ 50970.5 │ 50965.03095684803 │ 50970.5 │ 2044 │
│ 2021-12-07 03:52:00 │ 50980.5 │ 50980.5 │ 50970.5 │ 50976 │ 1458 │
│ 2021-12-07 03:53:00 │ 50981 │ 51062 │ 50981 │ 51019.93382352941 │ 33287 │
│ 2021-12-07 03:54:00 │ 51025.23174316075 │ 51049.5 │ 50991.27149321267 │ 51007 │ 44248 │
│ 2021-12-07 03:55:00 │ 51013.5 │ 51064 │ 51013.5 │ 51024 │ 24942 │
│ 2021-12-07 03:56:00 │ 51024.5 │ 51062 │ 51024.5 │ 51057 │ 43454 │
│ 2021-12-07 03:57:00 │ 51055 │ 51065 │ 51022 │ 51040.5 │ 31499 │
│ 2021-12-07 03:58:00 │ 51041.5 │ 51066.5 │ 51040.06862745098 │ 51040.06862745098 │ 7897 │
└─────────────────────┴───────────────────┴─────────┴───────────────────┴───────────────────┴────────┘
10 rows in set. Elapsed: 0.018 sec. Processed 368.17 thousand rows, 1.68 MB (20.87 million rows/s., 95.02 MB/s.)
Volume Weighted Average Price (VWAP)¶
Table: trade_summary
SELECT time, sum(pq) / sum(q) AS vwap
FROM
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
price_vwap * quantity AS pq,
quantity AS q
FROM trade_summary
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-PERPETUAL'
)
GROUP BY time
ORDER BY time
Query id: 62b742ea-7a79-4c39-b97c-945484698601
┌────────────────time─┬───────────────vwap─┐
│ 2021-12-07 03:50:00 │ 50959.2018121911 │
│ 2021-12-07 03:51:00 │ 50967.42465753425 │
│ 2021-12-07 03:52:00 │ 50971.43827160494 │
│ 2021-12-07 03:53:00 │ 51040.53448793823 │
│ 2021-12-07 03:54:00 │ 51026.675036159824 │
│ 2021-12-07 03:55:00 │ 51037.22947237591 │
│ 2021-12-07 03:56:00 │ 51046.56853224099 │
│ 2021-12-07 03:57:00 │ 51046.88280580336 │
│ 2021-12-07 03:58:00 │ 51052.71748765354 │
└─────────────────────┴────────────────────┘
9 rows in set. Elapsed: 0.020 sec. Processed 368.17 thousand rows, 1.68 MB (18.05 million rows/s., 82.22 MB/s.)
Index Values (Deribit specific)¶
Note
Maybe there is a better way to create pivot tables?
Table: statistics
SELECT time, index_value, settlement_price
FROM
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(value, receive_time_utc) AS index_value
FROM statistics
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-DERIBIT-INDEX' AND
type = 'INDEX_VALUE'
GROUP BY time
) AS col1
FULL OUTER JOIN
(
SELECT
toStartOfMinute(receive_time_utc) AS time,
argMax(value, receive_time_utc) AS settlement_price
FROM statistics
WHERE
receive_time_utc > toDateTime64(now() - toIntervalMinute(10), 9, 'UTC') AND
symbol = 'BTC-DERIBIT-INDEX' AND
type = 'SETTLEMENT_PRICE'
GROUP BY time
) AS col2
USING time
ORDER BY time
Query id: ce44238e-ab7f-4232-8a43-97ffbb930ae4
┌────────────────time─┬─index_value─┬─settlement_price─┐
│ 2021-12-07 03:50:00 │ 50927.73 │ 50927.73 │
│ 2021-12-07 03:51:00 │ 50940.41 │ 50940.41 │
│ 2021-12-07 03:52:00 │ 50948.58 │ 50948.58 │
│ 2021-12-07 03:53:00 │ 50998.4 │ 50998.4 │
│ 2021-12-07 03:54:00 │ 50979.03 │ 50979.03 │
│ 2021-12-07 03:55:00 │ 50996.49 │ 50996.49 │
│ 2021-12-07 03:56:00 │ 51015.76 │ 51015.76 │
│ 2021-12-07 03:57:00 │ 51004.35 │ 51004.35 │
│ 2021-12-07 03:58:00 │ 51007.89 │ 51007.89 │
│ 2021-12-07 03:59:00 │ 51014.62 │ 51014.62 │
│ 2021-12-07 04:00:00 │ 51032.08 │ 51032.08 │
└─────────────────────┴─────────────┴──────────────────┘
11 rows in set. Elapsed: 0.062 sec. Processed 1.74 million rows, 33.10 MB (28.12 million rows/s., 533.87 MB/s.)
Options¶
Table: reference_data
SELECT
symbol,
argMax(base_currency, receive_time_utc) AS base_currency,
argMax(strike_price, receive_time_utc) AS strike_price,
argMax(tick_size, receive_time_utc) AS tick_size,
argMax(multiplier, receive_time_utc) AS multiplier
FROM reference_data
WHERE
exchange='deribit' AND
security_type='OPTION' AND
option_type='CALL' AND
quote_currency='BTC'
GROUP BY symbol
ORDER BY symbol
Query id: ecb6f2c0-aff2-4c1e-ace0-0a9fd4763a20
┌─symbol───────────────┬─base_currency─┬─strike_price─┬─────────────tick_size─┬─multiplier─┐
│ BTC-10DEC21-100000-C │ USD │ 100000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-30000-C │ USD │ 30000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-35000-C │ USD │ 35000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-40000-C │ USD │ 40000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-42000-C │ USD │ 42000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-44000-C │ USD │ 44000 │ 0.0005000000000000001 │ 1 │
│ BTC-10DEC21-45000-C │ USD │ 45000 │ 0.0005000000000000001 │ 1 │
...
│ BTC-8DEC21-50000-C │ USD │ 50000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-51000-C │ USD │ 51000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-52000-C │ USD │ 52000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-53000-C │ USD │ 53000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-54000-C │ USD │ 54000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-55000-C │ USD │ 55000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-56000-C │ USD │ 56000 │ 0.0005000000000000001 │ 1 │
│ BTC-8DEC21-58000-C │ USD │ 58000 │ 0.0005000000000000001 │ 1 │
└──────────────────────┴───────────────┴──────────────┴───────────────────────┴────────────┘
267 rows in set. Elapsed: 0.015 sec. Processed 13.96 thousand rows, 327.60 KB (911.31 thousand rows/s., 21.39 MB/s.)