本文目录导读:

我来详细分析必发指数变化的Python案例,这是一个体育博彩数据分析的典型应用。
必发指数(Betfair Index)简介
必发指数是反映市场资金流向和投注热度的重要指标,通常包含:
- 成交量:累计交易金额
- 成交价:当前赔率
- 买盘/卖盘:买卖力量对比
- 资金流向:主胜、平局、客胜的资金分布
Python分析案例
数据准备和采集
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
# 模拟必发指数数据(实际应用中可以从API获取)
def generate_betfair_data():
"""生成模拟的必发指数数据"""
times = pd.date_range(start='2024-01-01 10:00',
end='2024-01-01 22:00',
freq='5min')
np.random.seed(42)
n = len(times)
# 生成三方的资金数据和赔率
data = {
'时间': times,
'主胜_成交量': np.random.normal(50000, 5000, n).cumsum(),
'平局_成交量': np.random.normal(30000, 3000, n).cumsum(),
'客胜_成交量': np.random.normal(20000, 2000, n).cumsum(),
'主胜_赔率': np.random.normal(1.8, 0.1, n),
'平局_赔率': np.random.normal(3.5, 0.2, n),
'客胜_赔率': np.random.normal(4.2, 0.3, n)
}
# 模拟赛季变化
data['主胜_成交量'] += np.linspace(0, 50000, n)
data['平局_成交量'] += np.linspace(0, 30000, n)
data['客胜_成交量'] += np.linspace(0, 20000, n)
return pd.DataFrame(data)
# 加载数据
df = generate_betfair_data()
df.head()
核心指标计算
class BetfairAnalyzer:
"""必发指数分析器"""
def __init__(self, data):
self.data = data
self.compute_indicators()
def compute_indicators(self):
"""计算核心分析指标"""
# 1. 资金占比
self.data['总资金'] = (self.data['主胜_成交量'] +
self.data['平局_成交量'] +
self.data['客胜_成交量'])
self.data['主胜_资金占比'] = self.data['主胜_成交量'] / self.data['总资金'] * 100
self.data['平局_资金占比'] = self.data['平局_成交量'] / self.data['总资金'] * 100
self.data['客胜_资金占比'] = self.data['客胜_成交量'] / self.data['总资金'] * 100
# 2. 资金变化率(5分钟变化)
self.data['主胜_资金变化'] = self.data['主胜_成交量'].diff()
self.data['平局_资金变化'] = self.data['平局_成交量'].diff()
self.data['客胜_资金变化'] = self.data['客胜_成交量'].diff()
# 3. 赔率变化
self.data['主胜_赔率变化'] = self.data['主胜_赔率'].diff()
self.data['平局_赔率变化'] = self.data['平局_赔率'].diff()
self.data['客胜_赔率变化'] = self.data['客胜_赔率'].diff()
# 4. 市场活跃度
self.data['市场活跃度'] = self.data['总资金'].diff().abs()
# 5. 资金集中度(标准差越小越集中)
self.data['资金集中度'] = self.data[['主胜_资金占比', '平局_资金占比', '客胜_资金占比']].std(axis=1)
# 6. 热度指数(资金相对赔率的比值)
self.data['主胜_热度'] = self.data['主胜_成交量'] / self.data['主胜_赔率']
self.data['平局_热度'] = self.data['平局_成交量'] / self.data['平局_赔率']
self.data['客胜_热度'] = self.data['客胜_成交量'] / self.data['客胜_赔率']
def get_market_signals(self):
"""识别市场信号"""
signals = {}
# 1. 资金流向异常检测
last = self.data.iloc[-1]
avg = self.data.iloc[-10:].mean()
# 主胜资金大量流入
if last['主胜_资金变化'] > 2 * self.data['主胜_资金变化'].std():
signals['主胜大额买入'] = True
# 2. 赔率骤变检测
for outcome in ['主胜', '平局', '客胜']:
change_rate = (last[f'{outcome}_赔率'] - avg[f'{outcome}_赔率']) / avg[f'{outcome}_赔率']
if abs(change_rate) > 0.05: # 5%的赔率变化
signals[f'{outcome}_赔率异常'] = change_rate
# 3. 市场走势判断
if last['主胜_资金占比'] > 50 and last['主胜_资金占比'] > avg['主胜_资金占比']:
signals['主胜趋势'] = '强势上升'
return signals
可视化分析
def plot_betfair_analysis(df):
"""绘制必发指数分析图"""
fig, axes = plt.subplots(3, 2, figsize=(15, 12))
fig.suptitle('必发指数变化分析', fontsize=16)
# 1. 资金累计趋势
ax1 = axes[0, 0]
ax1.plot(df['时间'], df['主胜_成交量'], label='主胜', color='red')
ax1.plot(df['时间'], df['平局_成交量'], label='平局', color='blue')
ax1.plot(df['时间'], df['客胜_成交量'], label='客胜', color='green')
ax1.set_title('成交量趋势')
ax1.legend()
ax1.grid(True)
# 2. 赔率变化
ax2 = axes[0, 1]
ax2.plot(df['时间'], df['主胜_赔率'], label='主胜', color='red')
ax2.plot(df['时间'], df['平局_赔率'], label='平局', color='blue')
ax2.plot(df['时间'], df['客胜_赔率'], label='客胜', color='green')
ax2.set_title('赔率变化')
ax2.legend()
ax2.grid(True)
# 3. 资金占比饼图(最新)
ax3 = axes[1, 0]
last = df.iloc[-1]
labels = ['主胜', '平局', '客胜']
sizes = [last['主胜_资金占比'], last['平局_资金占比'], last['客胜_资金占比']]
colors = ['red', 'blue', 'green']
ax3.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%')
ax3.set_title('最新资金占比')
# 4. 资金变化率
ax4 = axes[1, 1]
ax4.bar(df['时间'].dt.strftime('%H:%M')[::6],
df['主胜_资金变化'][::6], label='主胜', alpha=0.6)
ax4.bar(df['时间'].dt.strftime('%H:%M')[::6],
df['平局_资金变化'][::6], label='平局', alpha=0.6)
ax4.bar(df['时间'].dt.strftime('%H:%M')[::6],
df['客胜_资金变化'][::6], label='客胜', alpha=0.6)
ax4.set_title('资金变化量')
ax4.legend()
ax4.grid(True)
# 5. 热度对比
ax5 = axes[2, 0]
ax5.plot(df['时间'], df['主胜_热度'], label='主胜', color='red')
ax5.plot(df['时间'], df['平局_热度'], label='平局', color='blue')
ax5.plot(df['时间'], df['客胜_热度'], label='客胜', color='green')
ax5.set_title('热度指数')
ax5.legend()
ax5.grid(True)
# 6. 资金集中度
ax6 = axes[2, 1]
ax6.plot(df['时间'], df['资金集中度'], color='purple')
ax6.set_title('资金集中度变化')
ax6.grid(True)
plt.tight_layout()
plt.show()
实际应用分析
def analyze_betfair_changes(df):
"""综合分析必发指数变化"""
analyzer = BetfairAnalyzer(df)
signals = analyzer.get_market_signals()
# 关键时间点分析
peak_time = df.loc[df['市场活跃度'].idxmax()]['时间']
peak_value = df['市场活跃度'].max()
# 趋势分析
recent_trend = {}
for outcome in ['主胜', '平局', '客胜']:
recent_trend[outcome] = {
'最近5分钟变化': df[f'{outcome}_成交量'].iloc[-1] - df[f'{outcome}_成交量'].iloc[-2],
'平均每小时变化': (df[f'{outcome}_成交量'].iloc[-1] -
df[f'{outcome}_成交量'].iloc[0]) /
(len(df) * 5 / 60),
'资金占比走势': '上升' if df[f'{outcome}_资金占比'].iloc[-1] >
df[f'{outcome}_资金占比'].mean() else '下降'
}
print("=== 必发指数变化分析报告 ===")
print(f"分析时段: {df['时间'].iloc[0]} 至 {df['时间'].iloc[-1]}")
print(f"数据点数量: {len(df)}")
print(f"\n市场活跃度峰值: {peak_value:.0f} 在 {peak_time}")
print("\n资金趋势分析:")
for outcome, trend in recent_trend.items():
print(f"\n{outcome}:")
for metric, value in trend.items():
print(f" {metric}: {value}")
print("\n=== 市场信号 ===")
for signal, value in signals.items():
print(f"⚠️ {signal}: {value}")
return analyzer.data
# 执行分析
result_data = analyze_betfair_changes(df)
高级分析技巧
def advanced_analysis(df):
"""高级必发指数分析"""
# 1. 时间序列分解(趋势+季节)
from statsmodels.tsa.seasonal import seasonal_decompose
# 2. 资金异动检测
def detect_anomalies(data, threshold=2):
"""检测资金异动"""
mean = data.mean()
std = data.std()
anomalies = data[(data - mean).abs() > threshold * std]
return anomalies
# 3. 相关性分析
def correlation_analysis(data):
"""资金和赔率的相关性"""
corr = data[['主胜_成交量', '主胜_赔率',
'平局_成交量', '平局_赔率',
'客胜_成交量', '客胜_赔率']].corr()
return corr
# 4. 资金流向预测
def predict_fund_flow(data, window=12):
"""使用移动平均预测资金流向"""
predictions = {}
for outcome in ['主胜', '平局', '客胜']:
ma = data[f'{outcome}_成交量'].rolling(window=window).mean()
predictions[outcome] = {
'预测下周资金': ma.iloc[-1],
'资金增速': (ma.iloc[-1] - ma.iloc[-window]) / window
}
return predictions
# 执行高级分析
anomalies = detect_anomalies(df['市场活跃度'])
corr_matrix = correlation_analysis(df)
predictions = predict_fund_flow(df)
return {
'异动时间': anomalies.index.tolist(),
'相关性矩阵': corr_matrix,
'资金预测': predictions
}
关键观察指标:
- 资金集中度:单一选项资金占比过高(>60%)可能表示市场过热
- 资金变化速率:突然的资金涌入可能是重要信号
- 赔率与资金背离:资金增加但赔率不变可能表示庄家控盘
- 时间特征:比赛前1小时往往是资金变化最频繁的时段
实用决策建议:
- 当主胜资金占比持续上升且赔率下降,可能预示着主力资金看好主队
- 平局资金突然增加往往导致赔率下降,但平局不易判断
- 观察资金异动配合其他因素(球队状态、伤病等)综合判断
这个分析框架可以用于体育博彩、赛事预测、市场情绪分析等多个场景,实际应用中需要结合具体赛事数据进行验证和优化模型参数。