MarketTrace
M1ポジショニングM2フットプリントM3ロスカットM4ファンディング
方法論 · v2.0.0 · 更新 2026-05-12

Order flow 方法論 — OBI × CVD 4 象限

Order flow 4 象限のソース・サイジング・読み方:深さから派生した板情報、taker フロー CVD、ローリング P95 正規化、ゾーン分類、HTF レジーム、鮮度規則。

ライブ・ウィジェットを見る: /perpetuals/positioning.

データソース

2 つの Binance USDT-M フューチャーズ・ストリームが資産別の単一マイクロストラクチャー・デーモンに供給されます。4 象限は v1.0.0 でシングルソース。クロス取引所拡張(取引所別 OBI と CVD + ダイバージェンス・フラグ)は後続リリース予定。

デーモン 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 象限位置を年齢別にフェードするポリラインで描きます。選択可能なウィンドウは 30m4h24h。各ウィンドウは bars ファイルからダウンサンプリングされたシーケンスを取得し、24 時間リプレイが 1440 の生分をストリームする必要がないようにします:

FE はレンダリングされたトレイルを 60 点に制限し、24 時間ウィンドウがオーバープロットなしで収まるようにします。ライブ・スナップショットは同じバッファに追加され、バケット・シーケンスの後に痕跡を残します。資産切替時にローカル・バッファはリセットされ、新しい 4 象限が前の資産のトレイルで汚染されないようにします。

HTF レジーム・タグ

ウィジェット・ヘッダーの Trend BULL/BEAR/NEUTRAL タグは scripts/btc_monitor.pyhtf_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 つの独立信号がウィジェットを非ライブとしてマークできます:

限界

バージョン管理

方法論バージョン v2.0.0 · 更新 2026-05-12。重要な変更(取引所追加、公式微調整、閾値変更)はバージョンを上げ、上の構造化データの dateModified を更新。