半全场玩法入门的Python案例分析
半全场(HT/FT)是竞彩足球中较难但赔率较高的玩法,预测"半场结果+全场结果"的9种组合,下面用Python带你系统入门。

先理解9种结果组合
# 半全场9种组合
results = ['胜胜', '胜平', '胜负',
'平胜', '平平', '平负',
'负胜', '负平', '负负']
# 概率特点(经验值):
# - 胜胜/负负/平平:占比约 70-75%(顺风局)
# - 平胜/平负:占比约 18-22%(下半场发力)
# - 胜负/负胜:占比约 5-8%(大逆转,赔率高)
# - 胜平/负平:占比约 3-5%(被追平)
数据准备(核心)
半全场分析需要半场比分数据,这是很多人的盲区。
import pandas as pd
import numpy as np
# 假设你从API/爬虫获取了历史数据
# 关键字段:主队、客队、半场比分、全场比分
df = pd.DataFrame({
'home': ['A','B','C','D','E','F'],
'away': ['B','C','D','E','F','A'],
'ht_home': [1,0,0,2,1,0], # 半场主队进球
'ht_away': [0,0,1,1,0,0], # 半场客队进球
'ft_home': [2,1,1,2,1,1], # 全场主队进球
'ft_away': [1,1,1,1,2,0], # 全场客队进球
})
def get_htft(row):
ht = '胜' if row.ht_home > row.ht_away else ('平' if row.ht_home == row.ht_away else '负')
ft = '胜' if row.ft_home > row.ft_away else ('平' if row.ft_home == row.ft_away else '负')
return ht + ft
df['htft'] = df.apply(get_htft, axis=1)
print(df['htft'].value_counts())
数据来源建议:
- 懂球帝、雷速体育历史数据
- football-data.co.uk(免费,含HT比分)
- API-Football(付费但字段全)
统计分析入手(关键步骤)
整体分布规律
# 统计各队半全场倾向
def team_htft_profile(df, team):
home_games = df[df.home == team]
away_games = df[df.away == team]
all_games = pd.concat([home_games, away_games])
return all_games['htft'].value_counts(normalize=True).round(3)
print(team_htft_profile(df, 'A'))
半场领先 → 全场胜率
# 核心规律:半场领先的球队,全场胜率约 75-80%
df['ht_leader'] = np.where(df.ht_home > df.ht_away, 'home',
np.where(df.ht_home < df.ht_away, 'away', 'draw'))
# 半场主队领先时的最终结果
lead_home = df[df.ht_leader == 'home']
print("半场主队领先 → 全场结果分布:")
print(lead_home['htft'].value_counts(normalize=True))
# 胜胜 ~78%, 胜平 ~15%, 胜负 ~7%
主客场差异
# 主队半场平局 → 全场胜率往往高于客队 draw_ht = df[df.ht_leader == 'draw'] print(draw_ht['htft'].value_counts(normalize=True)) # 平胜通常 > 平负,这是主场优势的体现
构建预测模型(简化版)
方法1:泊松分布模拟(进阶但准确)
from scipy.stats import poisson
def simulate_htft(home_xg_ht, away_xg_ht, home_xg_ft, away_xg_ft, n=10000):
"""分别模拟半场和全场的进球分布"""
results = []
for _ in range(n):
# 半场进球(用半场期望进球)
ht_h = poisson.rvs(home_xg_ht)
ht_a = poisson.rvs(away_xg_ht)
# 全场进球(用全场期望进球)
ft_h = poisson.rvs(home_xg_ft)
ft_a = poisson.rvs(away_xg_ft)
ht = '胜' if ht_h > ht_a else ('平' if ht_h == ht_a else '负')
ft = '胜' if ft_h > ft_a else ('平' if ft_h == ft_a else '负')
results.append(ht + ft)
from collections import Counter
c = Counter(results)
return {k: v/n for k, v in sorted(c.items(), key=lambda x: -x[1])}
# 示例:主队半场xg=0.7,全场xg=1.6
probs = simulate_htft(0.7, 0.5, 1.6, 1.1)
for k, v in probs.items():
print(f"{k}: {v:.2%}")
如何得到xg:用历史进球数据回归,或用FBref等免费xG数据源。
方法2:逻辑回归分类
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 特征工程
def build_features(df):
df['ht_diff'] = df.ht_home - df.ht_away
df['ft_diff'] = df.ft_home - df.ft_away
# 可加入:近期状态、控球率、射门数等
return df
# 用半场数据预测全场(实战中更常用"预测半场+全场")
# 建议先用半场比分做特征预测"全场结果",再与"半场结果预测"组合
实战入手建议(重点)
策略1:逆向筛选法(推荐新手)
# 不从9种里选,而是排除不可能的组合 # 例:两队都强攻(场均进球>1.5)→ 排除"平平" # 例:一队防守极强 → 提高"平胜/平负"概率
策略2:聚焦高概率3种
# 80%精力研究:胜胜、平平、负负 # 20%精力博冷:平胜、平负(赔率5-8倍,命中率约10-15%) # 避免:胜负、负胜(赔率15倍+,命中率<5%,长期必亏)
策略3:半场即战力分析
# 关键指标:球队"上半场进球占比"
def first_half_ratio(df, team):
games = df[(df.home==team) | (df.away==team)]
ht_goals = games.apply(lambda r: r.ht_home if r.home==team else r.ht_away, axis=1).sum()
ft_goals = games.apply(lambda r: r.ft_home if r.home==team else r.ft_away, axis=1).sum()
return ht_goals / ft_goals if ft_goals else 0
# 上半场进球占比 > 50% 的球队 → 半场领先概率高 → 看"X胜"组合
完整分析框架代码
class HTFTAnalyzer:
def __init__(self, df):
self.df = df.copy()
self.df['htft'] = self.df.apply(get_htft, axis=1)
def team_stats(self, team):
g = self.df[(self.df.home==team)|(self.df.away==team)]
return {
'htft_dist': g['htft'].value_counts(normalize=True).to_dict(),
'ht_lead_rate': (g.apply(
lambda r: (r.ht_home>r.ht_away) if r.home==team else (r.ht_away>r.ht_home), axis=1
)).mean(),
'ht_draw_rate': (g.ht_home == g.ht_away).mean(),
}
def matchup_predict(self, home, away):
h = self.team_stats(home)
a = self.team_stats(away)
# 简化:取两队半场领先率的平均值作为参考
print(f"{home} 半场领先率: {h['ht_lead_rate']:.2%}")
print(f"{away} 半场领先率: {a['ht_lead_rate']:.2%}")
print(f"半场平局率(主): {h['ht_draw_rate']:.2%}")
# 结合主客场因素进一步修正
analyzer = HTFTAnalyzer(df)
analyzer.matchup_predict('A', 'B')
避坑提醒
| 坑 | 说明 |
|---|---|
| 只看全场数据 | 半全场必须用半场数据,全场数据无法推断半场分布 |
| 样本太小 | 单队至少30-50场才有统计意义,赛季初别用 |
| 赔率陷阱 | 胜负/负胜赔率高但长期EV为负,慎碰 |
| 忽略主客场 | 同一队主客场的半场表现差异可达20%+ |
| 必发/凯利 | 半全场市场流动性低,赔率参考价值弱于胜平负 |
学习路径建议
- 第1周:抓取1000场含半场比分的历史数据,跑分布统计
- 第2周:实现泊松模拟,验证与真实分布差异
- 第3周:加入球队特征(半场进球占比、主客场),做回测
- 第4周:小资金实盘验证,记录每场预测vs实际
核心结论:半全场的入手关键不是"猜对9种",而是理解"半场领先者大概率保持"这一统计规律(约75-80%),然后用数据找出"半场容易领先"的球队和"半场难分胜负"的比赛,聚焦2-3种高概率组合。
需要我针对某个环节(如数据抓取、泊松模型调参、回测框架)展开写完整代码吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播