データ形式¶
briskapi が返す Parquet(および CSV と JSON)の中身を、列ごとに説明します。データの出どころは 2つあります。
- クラウド API(
briskapi.Historical、brisk query):Databento の形のレコードで、リクエストごとに1つのスキーマ。クラウド API のレコード。briskapi.Liveは同じレコードを、お使いのコンピューターのフィードからライブで返します。同じセッションなら、列、型、値は同じです(ただし、バーが終わった後にこのコンピューターに届いた約定は、ライブでは次のバーに数えられ、クラウドではその約定自身の時刻で置かれます)。 - お使いのコンピューター上の記録(
brisk record、brisk pull、brisk live --output): NautilusTrader v2 の構成の Parquet テーブル4つのフォルダーで、デコーダーが出力したすべてを含みます。記録。
client.metadata.list_fields(schema) は、以下の表と同じ列を、型と意味とともに返します。
規約¶
- 時刻は UTC のナノ秒です(Parquet の
timestamp[ns, UTC])。東京は UTC+9 なので、to_df(tz="Asia/Tokyo")や.dt.tz_convert("Asia/Tokyo")を使うと、取引所と同じ時刻で表示されます。すべてのレコードにts_eventがあり、これはそのフレームが届いたときの BRiSK のサーバーのタイムスタンプです(マイクロ秒精度)。それが取引所自身のイベント時刻かどうかは確認できていません。レコードにはts_recvもあり、これは記録したコンピューターがそのフレームを受信した時刻です(ミリ秒精度)。デモの再生には意味のある受信時刻がないため、デモではts_recvはts_eventと等しくなります。 - 価格は円単位です。クラウド API は float64 で返します(BRiSK の分解能は 0.1 円)。
to_df(price_type="fixed")を指定すると、Databento と同じく 1e-9 円単位の整数で返します。記録ではdecimal128(38, 16)で正確な値を保持します。価格が null なのは、BRiSK が値を示さなかったこと(BRiSK の「値なし」を表す 0)を意味します。 - 数量(
size)は株数、件数(count)は注文数です。 - 銘柄コードと ID。
symbol(またはraw_symbol)は JPX の銘柄コードで、7203のような数字だけのもののほか、167Aのように英数字のものもあります。instrument_idは毎日同じ値です。数字だけのコードはその数値(7203)、それ以外は 100,000 にコードの36進数の値を足したものです(167Aは 154,694)。記録のissue_idはその日の銘柄マスター内の番号にすぎないので、代わりにidentifier(7203.XTKS)か銘柄コードを使ってください。 - BRiSK の値そのままの列(
issue_status、quote_flag、issue_type、tick_type)は、BRiSK が送ってきたままの値で保存されます。その意味はすべて分かっているわけではありません。
クラウド API のレコード¶
バー以外のすべてのスキーマは、同じ4列で始まり、symbol で終わります。
| 列 | 型 | 意味 |
|---|---|---|
ts_recv |
timestamp (ns, UTC) | アップロードしたコンピューターがフレームを受信した時刻(デモは ts_event) |
ts_event |
timestamp (ns, UTC) | フレームに付けられた BRiSK サーバーのタイムスタンプ |
publisher_id |
uint16 | XTKS.BRISK は 1、XTKS.BRISKDEMO は 2(metadata.list_publishers) |
instrument_id |
uint32 | 上記のとおり、コードごとに固定 |
symbol |
string | JPX の銘柄コード(map_symbols=False では省かれます) |
レコードは時刻順(ts_event、次に instrument_id、次に sequence)に並びます。自分の複数の記録が重なっている場合も、各レコードは1回だけ現れます。briskapi.Live は、フィードがバッチを受け取った順に、各バッチのレコードをこの順で届けます。
trades¶
| 列 | 型 | 意味 |
|---|---|---|
action |
string | 'T' |
side |
string | 仕掛けた側:'B' 買い手が仕掛けた、'A' 売り手が仕掛けた、'N' なし(寄付きの約定の多く) |
depth |
uint8 | 0 |
price |
float64 | 約定価格(円) |
size |
uint64 | 株数 |
flags |
uint8 | 0 |
sequence |
uint64 | BRiSK のフレーム番号 |
trade_id |
string | FRAME-PLACE:フレームと、その中での約定の位置。銘柄ごとに一意 |
mbp-10¶
| 列 | 型 | 意味 |
|---|---|---|
action |
string | 'N':BRiSK が送るのは板であり、板を変えた注文イベントではありません |
side |
string | 'N' |
depth |
uint8 | 0 |
price |
float64 | null |
size |
uint64 | 0 |
flags |
uint8 | セッションで各銘柄の最初の更新は 32(スナップショット)、それ以外は 0 |
sequence |
uint64 | BRiSK のフレーム番号 |
bid_px_NN |
float64 | 買い板の NN 本目の価格(円。NN は最良の 00 から 09 まで)。最後の本より先は null |
bid_sz_NN |
uint64 | 買い板の NN 本目の株数 |
bid_ct_NN |
uint32 | 買い板の NN 本目の注文件数 |
ask_px_NN |
float64 | 売り板の NN 本目の価格(円。NN は最良の 00 から 09 まで)。最後の本より先は null |
ask_sz_NN |
uint64 | 売り板の NN 本目の株数 |
ask_ct_NN |
uint32 | 売り板の NN 本目の注文件数 |
definition¶
| 列 | 型 | 意味 |
|---|---|---|
ts_recv |
timestamp (ns, UTC) | 取引日の日本時間0時 |
ts_event |
timestamp (ns, UTC) | 取引日の日本時間0時 |
publisher_id |
uint16 | XTKS.BRISK は 1、XTKS.BRISKDEMO は 2(metadata.list_publishers) |
instrument_id |
uint32 | コードごとに固定:数字だけのコードはその数値、それ以外は 100,000 に36進数の値を足したもの |
raw_symbol |
string | JPX の銘柄コード |
exchange |
string | 'XTKS' |
currency |
string | 'JPY' |
min_lot_size_round_lot |
int64 | 売買単位あたりの株数 |
min_price_increment |
float64 | BRiSK の価格の分解能(0.1 円)。呼値の単位(価格と tick_type によって決まる)ではありません |
high_limit_price |
float64 | その日の値幅制限の上限(円) |
low_limit_price |
float64 | その日の値幅制限の下限(円) |
base_price |
float64 | その日の基準値(円) |
name |
string | 銘柄名 |
issue_type |
uint64 | BRiSK の銘柄種別(値のまま) |
tick_type |
uint64 | BRiSK の呼値の種別(値のまま) |
symbol |
string | JPX の銘柄コード(map_symbols=false では省かれます) |
imbalance¶
| 列 | 型 | 意味 |
|---|---|---|
auction_type |
string | 'O' セッションの板寄せ、'C' 引け条件付き注文の板寄せ |
ref_price |
float64 | 予想約定の算出の起点となる価格(円。reference_price を参照) |
ind_match_price |
float64 | 予想約定価格(円) |
paired_qty |
uint64 | その価格で約定する株数 |
side |
string | その価格で売りが買いを上回る(または何も約定しない)ときは 'A'、それ以外は 'B' |
market_buy_qty |
uint64 | 成行買い注文(株数) |
market_sell_qty |
uint64 | 成行売り注文(株数) |
market_imbalance_qty |
uint64 | 成行買いと成行売りの差の絶対値(株数) |
market_imbalance_side |
string | 'B' 成行の買いが多い、'A' 売りが多い、'N' 同数 |
bid_total_qty |
uint64 | 板全体の買い気配の株数 |
ask_total_qty |
uint64 | 板全体の売り気配の株数 |
upper_collar |
float64 | その日の値幅制限の上限(円) |
lower_collar |
float64 | その日の値幅制限の下限(円) |
auction_time |
timestamp (ns, UTC) | 特別気配のタイマーの終了時刻。特別気配がなければ null |
sequence |
uint64 | BRiSK のフレーム番号 |
brisk-quotes¶
| 列 | 型 | 意味 |
|---|---|---|
bids |
list of | 買い板の上位10本(最良が先頭):{price(円)、size(株数)、count(注文件数)} |
asks |
list of | 売り板の上位10本(最良が先頭):{price、size、count} |
flags |
uint8 | 16。セッションで各銘柄の最初の更新には 32 が加わります(スナップショット) |
sequence |
uint64 | BRiSK のフレーム番号 |
last_price |
float64 | 直近の約定価格(円)。BRiSK が値を示さないときは null |
open_price |
float64 | セッションの始値(円) |
bid_price |
float64 | 最良買い気配(円) |
ask_price |
float64 | 最良売り気配(円) |
indicative_price |
float64 | 板寄せの予想約定価格(円)。引け条件付き注文を含まない |
closing_indicative_price |
float64 | 引け条件付き注文の予想約定価格(円) |
indicative_open_price |
float64 | 予想始値(円) |
reference_price |
float64 | 予想約定の算出の起点:特別気配の価格、なければ直近の約定価格、それもなければ基準値(円) |
max_frame |
uint64 | この更新の時点で BRiSK が受け取っていた最新のフレーム |
indicative_volume |
uint64 | 予想約定価格で約定する株数 |
indicative_imbalance_side |
uint64 | 予想約定価格で売りが買いを上回る(または何も約定しない)ときは 1、それ以外は 0 |
closing_indicative_volume |
uint64 | 引け条件付き注文についての同じ値 |
closing_indicative_imbalance_side |
uint64 | 引け条件付き注文についての同じ値 |
quote_flag |
uint64 | 特別気配のフラグ(BRiSK の値のまま) |
quote_side |
uint64 | 特別気配の側(BRiSK の値のまま:0 は買い、1 は売り) |
volume |
uint64 | その日の累計出来高(株数) |
issue_status |
uint64 | 証券会社の銘柄の状態(BRiSK の値のまま) |
market_buy_quantity |
uint64 | 成行買い注文(株数) |
market_sell_quantity |
uint64 | 成行売り注文(株数) |
closing_market_buy_quantity |
uint64 | 引け条件付きの成行買い注文(株数) |
closing_market_sell_quantity |
uint64 | 引け条件付きの成行売り注文(株数) |
bid_quantity |
uint64 | 最良買い気配の株数 |
bid_orders |
uint64 | 最良買い気配の注文件数 |
ask_quantity |
uint64 | 最良売り気配の株数 |
ask_orders |
uint64 | 最良売り気配の注文件数 |
bid_total_quantity |
uint64 | 板全体の買い気配の株数 |
bid_total_orders |
uint64 | 板全体の買い気配の注文件数 |
bid_closing_total_quantity |
uint64 | 引け条件付きの買い気配の株数 |
bid_closing_total_orders |
uint64 | 引け条件付きの買い気配の注文件数 |
ask_total_quantity |
uint64 | 板全体の売り気配の株数 |
ask_total_orders |
uint64 | 板全体の売り気配の注文件数 |
ask_closing_total_quantity |
uint64 | 引け条件付きの売り気配の株数 |
ask_closing_total_orders |
uint64 | 引け条件付きの売り気配の注文件数 |
special_quote_time |
timestamp (ns, UTC) | 特別気配のタイマーの終了時刻。特別気配がなければ null |
turnover |
float64 | その日の累計売買代金(円) |
closing_bids |
list of | 引け条件付き注文の買い板。bids と同じ形式 |
closing_asks |
list of | 引け条件付き注文の売り板 |
ohlcv-1s, ohlcv-1m, ohlcv-1h, ohlcv-1d¶
| 列 | 型 | 意味 |
|---|---|---|
ts_event |
timestamp (ns, UTC) | バーの開始時刻(日本時間に合わせた区切り。1日のバーは取引日の日本時間0時から始まります) |
open |
float64 | 最初の約定価格(円) |
high |
float64 | 高値(円) |
low |
float64 | 安値(円) |
close |
float64 | 最後の約定価格(円) |
volume |
uint64 | 約定した株数 |
バーが存在するのは約定のあった区間だけで、自分のアップロードだけから作られます。バーを受け取れるのは、自分のアップロードがその銘柄と、取引時間(前場 09:00〜11:30 と後場 12:30〜15:30、日本時間)内のそのバーの全期間をカバーしている場合だけです。XTKS.BRISKDEMO のバーは誰でも使えます。
CSV と JSON¶
encoding="csv" または "json"(1行に JSON オブジェクト1つ)でも、同じ列が得られます。
- タイムスタンプは ISO 8601 の文字列で、
pretty_ts=falseでは UTC のナノ秒です。 - 価格は円単位の数値で、
pretty_px=falseでは 1e-9 円単位の整数です。 brisk-quotesの板の列は JSON 配列です。JSON ではそのまま、CSV では JSON のテキストとして入ります。compression=zstdはレスポンス全体を圧縮します。
手元とクラウドの名前¶
Ticker と Market(ライブフィードか読み込んだ記録に対するもの)とクラウド API は、同じデータを異なる名前で返します。手元の呼び出しは BRiSK の名前のまま、円と東京の時刻で返し、クラウド API は
Databento の名前に従います。
手元(Ticker、Market) |
クラウド API | 備考 |
|---|---|---|
code |
symbol(definition では raw_symbol) |
JPX の銘柄コード |
issue_id |
instrument_id |
手元ではその日の銘柄マスター内の番号、クラウドではコードごとに固定 |
time |
ts_event |
手元では日本時間の datetime、クラウドでは UTC のナノ秒(to_df(tz="Asia/Tokyo")) |
received_unix_ms(Market().frames()) |
ts_recv |
記録したコンピューターがフレームを受信した時刻 |
frame |
sequence |
BRiSK のフレーム番号 |
trades(): price, quantity, side (buy, sell, None) |
trades: price, size, side (B, A, N) |
|
bids, asks: [{price, quantity, orders}] |
mbp-10: bid_px_NN, bid_sz_NN, bid_ct_NN(ask_… も同様); brisk-quotes: bids, asks を [{price, size, count}] として |
最良の本が先頭 |
indicative_price, closing_indicative_price |
imbalance: ind_match_price(auction_type が O と C の行) |
|
indicative_volume, closing_indicative_volume |
imbalance: paired_qty |
|
indicative_imbalance_side(1 または 0) |
imbalance: side(A または B) |
1 は A:売りが買いを上回る |
market_buy_quantity, market_sell_quantity(と closing_…) |
imbalance: market_buy_qty, market_sell_qty |
|
auction(): market_order_imbalance(買い − 売り) |
imbalance: market_imbalance_qty と market_imbalance_side |
手元では符号付き、クラウドでは数量と側に分かれる |
bid_total_quantity, ask_total_quantity(と bid_closing_…) |
imbalance: bid_total_qty, ask_total_qty |
引け条件付きの値は C の行に入る |
reference_price |
imbalance: ref_price |
|
special_quote: {side, price, until} |
imbalance: auction_time; brisk-quotes: quote_side, special_quote_time |
|
stocks(): name, lot_size, base_price, limit_up, limit_down, tick_type, issue_type |
definition: name, min_lot_size_round_lot, base_price, high_limit_price, low_limit_price, tick_type, issue_type |
|
その他の気配の項目(last_price、volume、turnover など) |
brisk-quotes、同じ名前 |
OHLCV バー(ohlcv-1s 〜 ohlcv-1d)は、クラウド API から、または briskapi.Live でライブで得られ、手元にはありません。Ticker.candles() は別のもので、証券会社の BRiSK 自身のバーです。
記録¶
記録は、data/order_book_depths.parquet、data/trades.parquet、data/equity.parquet、
data/custom/BriskBatch.parquet(パッケージ化されると manifest.json も加わります)を収めたフォルダーです。テーブルは NautilusTrader v2 のスキーマに従い、その後ろに BRiSK の項目が続きます。行は銘柄(issue)、次にバッチの順に並び、65,536行ずつの行グループに分かれているので、1銘柄を読むときはその部分だけが読まれます。briskapi.Recording(path)、Ticker、Market がこれらを読んでくれます。brisk export DIR --nautilus CATALOG は NautilusTrader v2 が読み込めるカタログを書き出します。
| ファイル | 1行の単位 | 列 |
|---|---|---|
data/order_book_depths.parquet |
気配更新 | bids, asks(最大10本、最良が先頭:price, size, count、および v2 の order_id(常に 0)), flags, sequence(フレーム), ts_event, ts_init(同じ値), identifier(CODE.XTKS), issue_id, seq(バッチ)。続いて、上記の brisk-quotes と同じ気配の項目(価格は decimal) |
data/trades.parquet |
約定 | price, size, aggressor_side(BUY, SELL, NO_AGGRESSOR), trade_id, ts_event, ts_init, identifier, issue_id, seq, frame, side(BRiSK の種別そのまま:1 は買い手が仕掛けた、2 は売り手が仕掛けた) |
data/equity.parquet |
銘柄 | v2 の Equity: id(CODE.XTKS), raw_symbol(銘柄コード), currency, price_precision, price_increment, lot_size, max_price/min_price(その日の値幅制限), ts_event/ts_init(日本時間0時)。続いて issue_id, tick_type, issue_type, name, base_price |
data/custom/BriskBatch.parquet |
デコードしたバッチ(フレーム) | seq, kind(bootstrap, history, quotes, end), received_unix_ms(ローカルの受信時刻), decode_ns, replay_lateness_ms, skipped_issues, frames, quote_updates, replay_wall_ms(クラッシュ後に修復した日では、end の frames と replay_wall_ms は記録から組み立て直したもの)。bootstrap の行には source, trading_date, input_transport, market_issue_count |
受信時刻は BriskBatch にあります。行の seq をバッチの received_unix_ms に結合してください。
history のバッチには、セッションのスナップショットがその日の早い時間から復元した約定が入っていて、すべて bootstrap の時刻になっています。
読み方¶
import pandas as pd
trades = pd.read_parquet("recordings/s1/data/trades.parquet")
toyota = trades[trades["identifier"] == "7203.XTKS"]
import polars as pl
books = pl.read_parquet("recordings/s1/data/order_book_depths.parquet").filter(pl.col("identifier") == "7203.XTKS")
import duckdb
duckdb.sql("""
select t.identifier, t.price, t.size, t.ts_event, b.received_unix_ms
from 'recordings/s1/data/trades.parquet' t
join 'recordings/s1/data/custom/BriskBatch.parquet' b using (seq)
order by t.ts_event
""")
decimal は pandas では decimal.Decimal として読み込まれます。pd.read_parquet(...).astype({"price": float})
や Polars の cast(pl.Float64) で浮動小数点数になります。