ピナクルのオッズ急落とスチームをリアルタイムで検知する
スチームとは、ピナクルのように市場の基準となるブックメーカーで起きる、急速かつ大きな価格の下落のことです。多くの場合、シャープな資金が一方に入ったことが原因です。ソフトなブックメーカーは数秒から数分遅れて追随することが多いため、スチームのアラートはライブフィードから得られる最も有用なシグナルの一つです。このガイドでは、PinnFeedのWebSocket上で検知器を作ります。これは統計ツールであり、予想システムではありません。
ステップ 1 — スチームを定義する#
調整しやすい実用的な定義の例です。
- ある結果の小数オッズが、直近2分間の最大値から5%以上下落した。
- マーケットの最大賭け金が100以上である。ピナクルは価格への確信が高まるにつれて上限を引き上げるため、流動性の低いマーケットの動きはノイズが多くなります。
- アラートはティックごとではなく、結果とウィンドウごとに1回だけ出す。
ステップ 2 — オッズブックをストリーミングで受信する#
PythonとNodeのガイドのPythonクライアントを使います。下のスクリプトと同じ場所に pinnfeed_stream.py として保存してください。マーケットが変化するたびに on_market(old, new, event) が呼び出されます。
ステップ 3 — 各結果の移動最大値を追跡する#
マーケットと結果ごとに (timestamp, price) の短いdequeを保持し、ウィンドウより古いものを破棄して、現在の価格とウィンドウ内の最大値を比較します。
# steam.py: ライブのWebSocketから、ピナクルのスチーム(急速で大きな価格下落)を検知します。
# Python/Nodeガイドの pinnfeed_stream.py を使用します。pip install websockets
import asyncio, collections, os, time
from pinnfeed_stream import stream, SIDES
WINDOW_S = int(os.environ.get("WINDOW_S", 120)) # 監視するウィンドウ
MIN_DROP = float(os.environ.get("MIN_DROP", 0.05)) # ウィンドウ内でオッズが5%以上下がったらアラート
MIN_STAKE = float(os.environ.get("MIN_STAKE", 100)) # 流動性の低いマーケットは無視(ピナクルの最大賭け金は確信度のシグナル)
history = collections.defaultdict(collections.deque) # (マーケットID, 結果) -> deque[(ts, decimal)]
alerted = {}
def on_market(old, new, event):
if not event or (new.get("maxStake") or 0) < MIN_STAKE:
return
now = time.time()
for o in new["outcomes"]:
if o["name"] not in SIDES:
continue
h = history[(new["id"], o["name"])]
h.append((now, o["decimal"]))
while h and now - h[0][0] > WINDOW_S:
h.popleft()
high = max(p for _, p in h)
drop = 1 - o["decimal"] / high
key = (new["id"], o["name"])
if drop >= MIN_DROP and now - alerted.get(key, 0) > WINDOW_S:
alerted[key] = now
pts = o.get("points")
line = "" if pts is None else f" {pts:g}" if new["type"] == "total" else f" {pts:+g}"
print(f'STEAM {event["sport"]} | {event["home"]} v {event["away"]} | {new["type"]}{line} {o["name"]}: '
f'{high:.3f} -> {o["decimal"]:.3f} (-{drop:.1%} in {WINDOW_S}s) fair {o["fair"]:.3f} max stake {new["maxStake"]}')
asyncio.run(stream({"sports": ["soccer", "tennis", "basketball"], "markets": ["moneyline", "spread", "total"],
"main": True, "specials": False}, on_market))
python steam.py で実行します。しきい値は環境変数で指定できます。たとえば、5分間で3%の下落なら MIN_DROP=0.03 WINDOW_S=300 python steam.py です。出力例:
STEAM tennis | Sebastian Baez v Daniil Glinka | moneyline away: 2.260 -> 2.050 (-9.3% in 120s) fair 2.143 max stake 975
ステップ 4 — またはRESTのエンドポイントに問い合わせる#
定期的な一覧で十分な場合は、GET /v1/drops がスライディングウィンドウ内の大きな下落をサーバー側で計算して返します。
curl -H "x-api-key: $PINNFEED_KEY" "https://pinnfeed.io/v1/drops?sport=soccer&live=true&minutes=10&min_pct=5"
各行にはイベント、マーケット、ライン、結果、from、to、dropPct、movedAt が含まれます。すべてのプランで利用でき、30秒遅延のFreeプランでもお使いいただけます。
ステップ 5 — アラートからピックへ#
- ソフトなブックメーカーと比較する。 スチームが役立つのは、ソフトな価格がまだ動いていない場合だけです。バリューベットのガイドで、ピナクルのフェアオッズを使ってその差を数値化する方法を紹介しています。
- ソフトなブックメーカーの遅れを狙うならプレマッチを優先する。 ライブでは、動きはシャープな資金よりもスコアによることが多いためです。
- クロージングラインバリューで検証する。 スチームのピックが平均してクロージングオッズを上回っていれば、そのシグナルは本物です。
- 配信する。 Telegramの予想ボットで、これらのアラートをチャンネルに送信できます。
よくある質問#
オッズの急落とスチームの違いは何ですか?#
オッズの急落は、あらゆる価格の下落を指します。スチームは、シャープなブックメーカーで起きる急速かつ大きな下落で、通常は情報を持った資金によって引き起こされ、その後ほかのブックメーカーにも波及する傾向があります。
スチームの検知にピナクルを使う理由は何ですか?#
ピナクルは高い上限で賭けを受け付け、シャープな動きに合わせて価格を調整するため、その動きが市場で最も信頼できるシグナルになります。ソフトなブックメーカーはそれを模倣するか、遅れて追随します。
WebSocketなしでもできますか?#
はい。すべてのプランで使える /v1/drops をポーリングすれば可能です。WebSocketは動きを発生時点で捉えますが、ポーリングでは次のリクエスト時にしか捉えられません。