Python分析必发指数变化案例
必发指数(Betfair Index)反映的是交易所成交量与价格的关系,分析它需要结合赔率、成交量、时间三个维度,下面给你一套完整的分析思路和代码案例。

必发指数的本质
必发指数的核心公式(常见的两种):
单场指数 = (某选项成交量 / 全场总成交量) × 100
或结合赔率加权:
指数 = 成交量占比 × 赔率 × 系数
关键理解:指数变化 ≠ 赔率变化,指数是"资金流向"的体现,赔率是"价格"的体现,二者背离时最有分析价值。
数据准备
典型数据结构(CSV 或 API):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 示例数据:某场比赛主胜选项的必发指数时序
df = pd.DataFrame({
'timestamp': pd.date_range('2024-01-01 08:00', periods=20, freq='30min'),
'home_odds': [2.10,2.08,2.05,2.02,2.00,1.98,1.95,1.93,1.92,1.90,
1.88,1.87,1.85,1.84,1.83,1.82,1.82,1.81,1.80,1.79],
'home_volume':[1000,1200,1500,1800,2200,2600,3000,3400,3800,4200,
4600,5000,5300,5600,5900,6100,6300,6500,6700,6900],
'total_volume':[3000,3400,3800,4200,4800,5400,6000,6600,7200,7800,
8400,9000,9500,10000,10500,11000,11400,11800,12200,12600]
})
# 计算必发指数
df['bf_index'] = df['home_volume'] / df['total_volume'] * 100
# 指数变化率(相邻时间点)
df['index_change'] = df['bf_index'].diff()
# 赔率变化率
df['odds_change'] = df['home_odds'].pct_change()
# 成交量变化率
df['volume_change'] = df['home_volume'].pct_change()
核心分析方法
指数趋势分析(判断资金方向)
def analyze_trend(df, window=5):
"""用滑动平均判断指数趋势"""
df['index_ma'] = df['bf_index'].rolling(window).mean()
df['trend'] = np.where(df['bf_index'] > df['index_ma'], '上升', '下降')
# 整体趋势斜率
x = np.arange(len(df))
slope = np.polyfit(x, df['bf_index'], 1)[0]
print(f"整体趋势斜率: {slope:.4f}")
if slope > 0.1:
print("→ 资金持续流入该选项")
elif slope < -0.1:
print("→ 资金持续流出该选项")
else:
print("→ 资金流向平稳")
return df
analyze_trend(df)
赔率-指数背离分析(最重要的信号)
def divergence_analysis(df):
"""
赔率下降 + 指数上升 → 强烈看好(正常)
赔率下降 + 指数下降 → 诱盘/主力出货(危险信号)
赔率上升 + 指数上升 → 反向操作
赔率上升 + 指数下降 → 强烈看衰
"""
df['odds_dir'] = np.sign(df['home_odds'].diff())
df['index_dir'] = np.sign(df['bf_index'].diff())
def classify(row):
if row['odds_dir'] == 0 or row['index_dir'] == 0:
return '平稳'
if row['odds_dir'] < 0 and row['index_dir'] > 0:
return '良性看好'
if row['odds_dir'] < 0 and row['index_dir'] < 0:
return '背离-警惕诱盘'
if row['odds_dir'] > 0 and row['index_dir'] > 0:
return '背离-反向信号'
if row['odds_dir'] > 0 and row['index_dir'] < 0:
return '双重看衰'
df['signal'] = df.apply(classify, axis=1)
return df
df = divergence_analysis(df)
print(df[['timestamp','home_odds','bf_index','signal']].tail(10))
关键时间窗口分析(赛前 1 小时最关键)
def key_window_analysis(df, window_minutes=60):
"""分析赛前关键窗口的指数突变"""
last_time = df['timestamp'].max()
cutoff = last_time - pd.Timedelta(minutes=window_minutes)
recent = df[df['timestamp'] >= cutoff].copy()
# 指数突变检测
recent['jump'] = recent['bf_index'].diff().abs()
threshold = recent['jump'].mean() + 2 * recent['jump'].std()
jumps = recent[recent['jump'] > threshold]
print(f"检测到 {len(jumps)} 次指数突变:")
print(jumps[['timestamp','bf_index','jump']])
return jumps
key_window_analysis(df, 300)
成交量-指数效率分析
def volume_efficiency(df):
"""
指数变化 / 成交量变化 = 资金效率
单位成交量推动指数越大,说明主力介入越明显
"""
df['efficiency'] = df['index_change'] / (df['volume_change'] + 1e-8)
# 边际效率(近期越大越有效)
df['eff_ma'] = df['efficiency'].rolling(5).mean()
high_eff = df[df['eff_ma'] > df['eff_ma'].quantile(0.75)]
print("高资金效率时段(主力可能介入):")
print(high_eff[['timestamp','bf_index','efficiency']].tail())
return df
volume_efficiency(df)
可视化(识别形态)
fig, axes = plt.subplots(3, 1, figsize=(12, 10), sharex=True)
# 1. 赔率走势
axes[0].plot(df['timestamp'], df['home_odds'], 'b-o', markersize=3)
axes[0].set_ylabel('赔率'); axes[0].grid(True)
axes[0].set_title('必发赔率 / 指数 / 信号')
# 2. 必发指数
axes[1].plot(df['timestamp'], df['bf_index'], 'r-o', markersize=3)
axes[1].plot(df['timestamp'], df['bf_index'].rolling(5).mean(), 'g--', label='5点均线')
axes[1].set_ylabel('必发指数'); axes[1].legend(); axes[1].grid(True)
# 3. 指数变化率
colors = ['red' if x > 0 else 'green' for x in df['index_change']]
axes[2].bar(df['timestamp'], df['index_change'], color=colors, width=0.01)
axes[2].axhline(0, color='black', linewidth=0.5)
axes[2].set_ylabel('指数变化'); axes[2].grid(True)
plt.tight_layout(); plt.show()
实战分析框架(决策流程)
| 步骤 | 检查项 | |
|---|---|---|
| 1 | 指数整体斜率 | 判断资金主方向 |
| 2 | 赔率与指数是否背离 | 背离→警惕诱盘/反向 |
| 3 | 赛前 1h 是否有突变 | 突变→主力临场发力 |
| 4 | 资金效率是否异常高 | 高→主力强介入 |
| 5 | 综合信号 | 顺向买/逆向弃/观望 |
常见陷阱提醒
- 只看指数涨跌不够,必须配合赔率方向。
- 早期指数权重低(样本小时噪声大),重点关注赛前 2 小时。
- 成交量突然放大但指数不动 → 对冲盘,不代表方向。
- 不同公司必发数据源不同,需统一口径。
如果你有具体的数据源(如 Betfair API、必发官网抓取数据、某 CSV 样例),发给我,我可以直接帮你写成针对性的分析脚本,包括抓取、清洗、建模、回测一整套流程。