MarketTrace
M1ポジショニングM2フットプリントM3ロスカットM4ファンディングM5ボリューム・プロファイル
方法論 · v2.0.0 · 更新 2026-07-04

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

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

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

データソース

4 象限は待機深さと taker フローを 4 つの無期限取引所、Binance、Bybit、OKX、Hyperliquid、から両軸について集計します。ランタイムは全 Rust で、hot path に Python デーモンはありません。

バックエンドの /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 →      帯内バランス

計算は帯内の各サイド上位 200 レベルを取ります(TOP_LEVELS_PER_SIDE = 200)。プロットされる X 軸は下のクロス取引所ブレンドで、この段階では平滑化なし。ウィジェットは OBI ラベルを 3 桁の小数で表示し、0.01 の動きが見えるようにします。

クロス取引所 OBI 集計(flow-weighted)

各取引所の取引所別 OBI(上)は、その取引所の直近の taker フローで重み付けした単一のクロス取引所 OBI に結合されます、flow-weighted (FW)、逆分散ではありません。取引所の重みは実際に約定が出ている場所を追うため、静かなブックはほとんど寄与せず、活発なブックがコンセンサスを主導します。

2026-05-26 に集計は逆分散重み付け(IVW)から FW に切り替わりました。IVW では Hyperliquid がブレンドを支配していました:nSigFigs で量子化された(粗い)ブックは人為的に低分散の OBI を生み、IVW は背後にどれだけ小さいサイズしかなくても高い重みで報います。Flow-weighting は重みを実現された攻撃側ボリュームに結び付けるため、粗い量子化の取引所はもはやマージされた読みを支配できません。

累積ボリュームデルタ(CVD)

CVD はローリング・ウィンドウ内の符号付き taker 名目を 4 取引所すべてにわたって合計します。符号規約は業界のテープ・リーディング慣行に従い、taker 買いは上に、taker 売りは下に。各取引所の攻撃側はインジェストで正規化され(Bybit、OKX、Hyperliquid は Binance と異なる方法でエンコード)、すべてのプリントが同じ符号を寄与します。

各 taker プリント(任意の取引所)について:
  notional = qty * price                       // USD
  攻撃側 == 買い の場合: 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 行と両ウィンドウを保持し、再起動後にトレイルがヒストリーをリプレイできるようにします。4 取引所の合算スループットはアクティビティに応じて ~40–200 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 資産別:BTC/ETH/SOL/DOGE 120s, BNB 60s, XRP 5s

層 2、大きさデッドバンド(Schmitt-trigger 下限)
  両軸ともデッドバンド内  → 候補 = "balanced"(フラットな市場:
    |obi_ema| < OBI_DB  かつ  |cvd| < CVD_DB_PCT × p95_30m_usd、どちらにも偏りなし)。
  ちょうど一軸のみ内      → 現在ゾーンを保持(曖昧)。
  両軸とも外             → 候補 = (obi_ema, cvd) の 4 象限。
  OBI_DB      資産別:BTC 0.12, ETH 0.20, SOL 0.12, BNB 0.12, XRP 0.05, DOGE 0.20
  CVD_DB_PCT  資産別、ローリング |cvd_30m| p95 の割合:
              BTC 0.15, ETH 0.05, SOL 0.20, BNB 0.10, XRP 0.20, DOGE 0.20

層 3、最小テナー(Schmitt-trigger 上限)
  新しい候補は現在になる前に ≥ MIN_TENURE_S 持続する必要があります。デッドバンドへの
  一度のディップはもはや成熟中の候補を消しません。タイマーは連続ホールドの最大 3s
  の猶予まで存続します(CVD は平滑化されていない)。
  MIN_TENURE_S  30m トレイル 300s(DOGE 30s); 4h 300s; 24h 1800s。

4 つの方向性象限、そしてどちらの軸にも偏りがないときの balanced 状態:

x >= 0 かつ y >= 0    → "買い手優勢"
x <  0 かつ y <  0    → "売り手優勢"
x <  0 かつ y >= 0    → "需要吸収中"
x >= 0 かつ y <  0    → "板が支持"
両軸ともデッドバンド内 → "Balanced"(明確な支配なし)

候補がテナーを満たす途中のとき、FE は判定の下に明示的な candidate_pendingサブラインをレンダリング (“売り手 · 4m 22s 持続 · 買い手候補 18s / 5m”)。クラシファイヤはブラックボックスではなく可視ステート・マシン。

パラメータは資産別 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.py(維持される cron writer)の htf_regime() がスナップショット cron の 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 分期間)をスナップショット cron が ~5 分ごとにポーリング。1.0 上は小売アカウント net long、下は net short。これはアカウントのポジショニングでフローではない、4 象限平面ではなく OBI と CVD とともにサイド・パネルに位置します。

鮮度

3 つの独立信号がウィジェットを非ライブとしてマークできます:

限界

バージョン管理

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