这个python案例如何分析必发指数变化?

wen python案例 1

本文目录导读:

这个python案例如何分析必发指数变化?

  1. 必发指数(Betfair Index)简介
  2. Python分析案例

我来详细分析必发指数变化的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
    }

关键观察指标:

  1. 资金集中度:单一选项资金占比过高(>60%)可能表示市场过热
  2. 资金变化速率:突然的资金涌入可能是重要信号
  3. 赔率与资金背离:资金增加但赔率不变可能表示庄家控盘
  4. 时间特征:比赛前1小时往往是资金变化最频繁的时段

实用决策建议:

  • 当主胜资金占比持续上升且赔率下降,可能预示着主力资金看好主队
  • 平局资金突然增加往往导致赔率下降,但平局不易判断
  • 观察资金异动配合其他因素(球队状态、伤病等)综合判断

这个分析框架可以用于体育博彩、赛事预测、市场情绪分析等多个场景,实际应用中需要结合具体赛事数据进行验证和优化模型参数。

抱歉,评论功能暂时关闭!