本文目录导读:

先明确“必发指数”指什么
必发(Betfair)是博彩交易所,它的核心数据不是传统赔率,而是:
| 数据 | 含义 |
|---|---|
| Back/Lay 赔率 | 买入/卖出价格 |
| Available(挂单量) | 该价位可成交金额 |
| Matched(已成交量) | 已撮合金额 |
| Traded Volume(总成交量) | 全场累计成交 |
| Last Traded Price(LTP) | 最新成交价 |
| SP(Starting Price) | 开赛/结算价 |
所谓“必发指数”,通常指由这些原始数据推算出的指标,
- 隐含概率 = 1 / 赔率(去掉抽水后归一化)
- 资金占比 = 某选项成交量 / 总成交量
- 指数 = 成交量加权价格,或 Back/Lay 中间价
- 大单/资金流向 = 挂单或成交的突变
分析必发指数变化”本质是:对时间序列的赔率、成交量、挂单量做特征提取和异常检测。
通用分析流程(开源项目一般这么做)
数据采集
- 官方 API:Betfair Exchange API(需申请 app key,有免费延迟流和付费实时流)
- 开源抓取:
betfairlightweight(Python,最常用)、betfair(Node) - 第三方聚合:部分项目用 Oddsportal、闪电站等爬虫
数据存储
- 时序库:InfluxDB、TimescaleDB、ClickHouse
- 轻量:SQLite / Parquet 文件
- 典型表结构:
timestamp, market_id, selection_id, back, lay, back_volume, lay_volume, matched, ltp
特征工程(关键)
开源项目通常计算这些指标:
# 伪代码 df['implied_prob'] = 1 / df['ltp'] df['mid_price'] = (df['back'] + df['lay']) / 2 df['spread'] = df['lay'] - df['back'] df['volume_delta'] = df['matched'].diff() df['price_momentum'] = df['ltp'].pct_change(periods=N) df['volume_weighted_price'] = (df['ltp'] * df['volume_delta']).rolling(N).sum() / df['volume_delta'].rolling(N).sum() df['money_flow'] = df['back_volume'] - df['lay_volume'] # 买卖压力
变化检测 / 信号
- 阈值法:赔率在 X 分钟内变动 > Y%
- Z-score / 滑动窗口:偏离均值 N 倍标准差
- 突变点检测:
ruptures库(PELT、BinSeg) - 异常检测:Isolation Forest、LOF、Prophet 残差
- 资金流:大额 matched 突增 + 赔率同向移动 = 主力介入
可视化
- 赔率/成交量双轴时间序列
- 热力图(多选项 × 时间)
- 资金流向桑基图
- 常见库:Plotly、Matplotlib、Grafana
一个最小可运行示例
import pandas as pd
import numpy as np
# 假设 df 有 timestamp, selection, ltp, matched
df = df.sort_values('timestamp')
df['prob'] = 1 / df['ltp']
df['prob_norm'] = df['prob'] / df.groupby('timestamp')['prob'].transform('sum')
df['vol_delta'] = df.groupby('selection')['matched'].diff().fillna(0)
df['flow'] = df['vol_delta'] * df['ltp']
# 滚动窗口动量
df['momentum_5m'] = df.groupby('selection')['ltp'].pct_change(periods=5)
# 异常:赔率突变
df['zscore'] = df.groupby('selection')['ltp'].transform(
lambda s: (s - s.rolling(30).mean()) / s.rolling(30).std()
)
signals = df[df['zscore'].abs() > 3]
这类开源项目常见的坑
- 抽水未处理:必发佣金 2–5%,隐含概率之和 > 1,必须归一化。
- LTP 稀疏:冷门市场可能长时间无成交,LTP 滞后,要用 back/lay 中间价。
- 挂单≠成交:Available 可能随时撤单,只有 Matched 才是真金白银。
- 时间同步:API 时间戳是 UTC,注意时区。
- 过拟合:很多项目回测漂亮是因为用了未来数据(look-ahead bias)。
如果你想我针对具体项目讲
请补充:
- 项目名 / GitHub 链接
- 你关心的是代码架构、指标算法,还是怎么跑起来
- 数据源是 Betfair 官方 API 还是第三方
发我之后我可以逐文件、逐函数地拆解它到底怎么算“必发指数变化”。