Order flow 方法論 — OBI × CVD 4 象限
Order flow 4 象限のソース・サイジング・読み方:深さから派生した板情報、taker フロー CVD、ローリング P95 正規化、ゾーン分類、HTF レジーム、鮮度規則。
ライブ・ウィジェットを見る: /perpetuals/positioning.
データソース
2 つの Binance USDT-M フューチャーズ・ストリームが資産別の単一マイクロストラクチャー・デーモンに供給されます。4 象限は v1.0.0 でシングルソース。クロス取引所拡張(取引所別 OBI と CVD + ダイバージェンス・フラグ)は後続リリース予定。
- 深さ。
wss://fstream.binance.com/stream?streams=<symbol>@depth@100ms— REST スナップショット・ブック(1000 レベル)に適用される diff ストリーム。維持されるブックが OBI 計算と広い深さ表面の両方を支えます。 - Taker プリント。
wss://fstream.binance.com/market/ws/<symbol>@aggTrade— フロー符号を与えるis_buyer_makerフラグ付きの全集計 taker プリント。
デーモン scripts/microstructure_daemon.py は 30 秒ごとに data/<asset>/microstructure_snapshot.json にハートビート・スナップショットを書き、 data/<asset>/microstructure_bars.jsonl(トレイル・ヒストリー表面)に分あたり 1 バーを書きます。バックエンドの /ws/market WebSocket は ~10 秒ごとにスナップショットを、購読時とウィンドウ変更時に trail/normaliser フレームをプッシュします。
板情報(OBI)
OBI は中値周辺の狭い帯内の待機流動性偏りを測定します。帯外のレベルは除外 — スプレッドを取る取引に影響しないため。
mid = (best_bid + best_ask) / 2 band = [mid * 0.998, mid * 1.002] // ±0.2 % bid_qty = 帯内のビッド qty の合計 ask_qty = 帯内のアスク qty の合計 OBI = (bid_qty - ask_qty) / (bid_qty + ask_qty) 範囲: [-1, +1] +1 → アスクが空、全重みがビッドに -1 → ビッドが空、全重みがアスクに 0 → 帯内バランス
計算は帯内の各サイド上位 50 レベルを取ります。4 象限の X 軸として平滑化なしでプロット。ウィジェットは OBI ラベルを 3 桁の小数で表示し、0.01 の動きが見えるようにします。
累積ボリュームデルタ(CVD)
CVD はローリング・ウィンドウ内の符号付き taker 名目を合計。符号規約は業界のテープ・リーディング慣行に従い、taker 買いは上に、taker 売りは下に。
各 aggTrade イベントについて: notional = qty * price // USD is_buyer_maker == false の場合: delta = +notional // taker 買い そうでなければ: delta = -notional // taker 売り (ts, delta) を 2 時間 deque に追加 cvd_30m_usd = Σ delta, ts ∈ [now - 30m, now] cvd_2h_usd = Σ delta, ts ∈ [now - 2h, now]
2 時間 deque は最長ホライズン。30 分ウィンドウは書き込みごとに同じバッファからスライス。bars ファイルは分あたり 1 行と両ウィンドウを保持し、デーモン再起動後にトレイルがヒストリーをリプレイできるようにします。イベントあたりスループットは取引所アクティビティに応じて ~10–50 prints/s。
Y 軸ノーマライザー
生の 30 分 CVD 大きさは BTC($1M クラスの動き)と ETH・SOL・小規模パーペチュアル間で 2 桁の差があります。生 USD をプロットすると小さな資産はフラットなラインに押し潰されます。したがって Y 軸は資産別にローリング 7 日 |cvd_30m_usd| P95 で割り、結果を [-1, +1] にクランプします。
y_norm = clamp(cvd_30m_usd / p95_30m_usd, -1, +1)
p95_30m_usd: ローリング 7 日パーセンタイル、スナップショット・エンドポイントで更新
fallback: ローリング・パーセンタイルがまだ利用不可のとき
(コールド・スタートまたは薄いサンプル)2_000_000 USD を使用エンドポイント /api/market/cvd-normalizer?asset=… が資産別 P95 値を提供し、WebSocket の normalizer フレームとしてミラーされるため、FE はその値がトレイル・データの後に到着するときトレイルを一貫して再スケールできます。
ゾーン分類(v2)
生の 4 象限ルール(OBI 符号、CVD 符号)は sub-bp ノイズで判定がちらつかないように 3 層パイプラインで包まれています。各層が順次発火し、3 層すべてを通過する信号のみが表示されるゾーンとなります。
層 1 — OBI に EMA(CVD はすでにスライディング・ウィンドウ集計)
obi_ema(t) = α · obi_raw(t) + (1 - α) · obi_ema(t-1)
α = 1 - exp(-dt / span_seconds)
span_seconds: 30m トレイルでデフォルト 30s(資産別チューニング可能)
層 2 — 大きさデッドバンド(Schmitt-trigger 下限)
デッドバンド内、候補ゾーン = 現在ゾーン:
candidate_zone = current_zone if |obi_ema| < OBI_DB
or |cvd| < CVD_DB_PCT × p95_30m_usd
そうでなければ候補 = (obi_ema, cvd) の 4 象限。
OBI_DB 資産別:BTC/ETH 0.05, SOL 0.07, XRP 0.08, BNB 0.10, DOGE 0.12
CVD_DB_PCT 資産ローリング 7d |cvd_30m| p95 の 10 %
層 3 — 最小テナー(Schmitt-trigger 上限)
新しい候補は現在になる前に ≥ MIN_TENURE_S 持続する必要があります。
MIN_TENURE_S 30m トレイル 60s; 4h 300s; 24h 1800s。4 象限命名は v1.0 から変更なし:
x >= 0 かつ y >= 0 → "買い手優勢" x < 0 かつ y < 0 → "売り手優勢" x < 0 かつ y >= 0 → "需要吸収中" x >= 0 かつ y < 0 → "板が支持"
候補がテナーを満たす途中のとき、FE は判定の下に明示的な candidate_pendingサブラインをレンダリング (“売り手 · 4m 22s 持続 · 買い手候補 18s / 60s”)。クラシファイヤはブラックボックスではなく可視ステート・マシン。
パラメータは資産別 7 日グリッド・スイープ(scripts/replay_classifier.py)からチューニング。選ばれた値は backend/classifier/config.py に存在し、再デプロイなしのホットパッチ用に env オーバーライド(例:MICRO_DEADBAND_DOGE=0.20)可能。状態(OBI EMA、候補タイマー、entered-at)はアグリゲーター・サイクル間で Redis に永続化されるため、デーモン再起動はコールド・スタートではなく同じゾーンから再開します。
トレイル・ヒストリー
トレイルは最近 N 個の 4 象限位置を年齢別にフェードするポリラインで描きます。選択可能なウィンドウは 30m、4h、24h。各ウィンドウは bars ファイルからダウンサンプリングされたシーケンスを取得し、24 時間リプレイが 1440 の生分をストリームする必要がないようにします:
- 30 分。 1 分バケット。
- 4 時間。 5 分バケット。
- 24 時間。 30 分バケット。
FE はレンダリングされたトレイルを 60 点に制限し、24 時間ウィンドウがオーバープロットなしで収まるようにします。ライブ・スナップショットは同じバッファに追加され、バケット・シーケンスの後に痕跡を残します。資産切替時にローカル・バッファはリセットされ、新しい 4 象限が前の資産のトレイルで汚染されないようにします。
HTF レジーム・タグ
ウィジェット・ヘッダーの Trend BULL/BEAR/NEUTRAL タグは scripts/btc_monitor.py の htf_regime() がスナップショット・デーモンの 5 分ケイデンスで計算:
300 1 分キャンドルを取得(>= 289 有効バーが必要) pct_4h = (close - close_4h_ago) / close_4h_ago * 100 pct_24h = (close - close_24h_ago) / close_24h_ago * 100 BULL if pct_4h > +0.5 or pct_24h > +1.5 BEAR if pct_4h < -0.5 or pct_24h < -1.5 NEUTRAL そうでなければ(サンプル不足時も)
タグは HTF コンテキストのみで、フロー・リーディングではありません。4 象限の短ウィンドウ判定(30 分 CVD)が複数時間方向に対して sanity チェックできるように存在します。
Long/Short 比率
L/S スタットは Binance の globalLongShortAccountRatio(15 分期間)をスナップショット・デーモンが ~5 分ごとにポーリング。1.0 上は小売アカウント net long、下は net short。これはアカウントのポジショニングでフローではない — 4 象限平面ではなく OBI と CVD とともにサイド・パネルに位置します。
鮮度
3 つの独立信号がウィジェットを非ライブとしてマークできます:
micro_book_state≠"ok"— WS 再接続後デーモンが再同期中。REST スナップショットが再到着するまで OBI は古くなる。ステータス pill がDaemon <state>に切り替わる。micro_stale— ハートビートがウィンドウより古い。FE はトレイルに新しい点の追加を停止。- トレイルが
partial: trueマーク — ウィンドウを支える jsonl が要求された lookback より短い(デーモン再起動直後に一般的)。キャンバスにアンバー pill が表示される。
限界
- シングルソース。 v1.0.0 は Binance のみ読み取る。したがって 4 象限判定は Binance のマイクロストラクチャーを反映、集計クロス取引所圧力ではない。ダイバージェンス・インジケーター付きのクロス取引所 OBI と CVD は後続リリース予定。
- 硬い 4 象限境界。 OBI の 0 の両側 0.01 位置で言語判定が反転。v1.0.0 にはデッドバンドも低フロー・ガードもない — 原点近くの位置を厳密なゾーン・リードではなく未決定として読んでください。
- ±0.2 % 帯は固定ノブ。 OBI 帯は全資産で同じ幅。タイト・スプレッドのメジャー(BTC、ETH)は薄いブックのアルトより帯内で深いブックを見ます — これが CVD が一次判定で OBI が補助軸である理由の 1 つ。
- Taker 側符号規約は取引所依存。 Binance aggTrade の
is_buyer_makerフラグがここでは権威的信号。クロス取引所拡張はまずサイド・セマンティクスを正規化する必要があります(Bybit と OKX はサイドを異なる方法でエンコード)。 - L/S は Binance の小売ポジショニング。 比率は Binance のアカウントを数えクロス取引所集計ではなく、すべてのアカウントをサイズに関係なく同等重み付け。フロー入力ではなくソフトなコンテキストとして使用してください。
- HTF レジームは全資産に BTC スタイル閾値使用。 4h ±0.5 % / 24h ±1.5 % 閾値は BTC に対してチューニングされた。高ボラ資産(DOGE、SOL)では BULL/BEAR が直感より早く発火 — タグをキャリブレーションされたトレンド・フィルターではなく粗いコンテキストとして扱ってください。
バージョン管理
方法論バージョン v2.0.0 · 更新 2026-05-12。重要な変更(取引所追加、公式微調整、閾値変更)はバージョンを上げ、上の構造化データの dateModified を更新。