Python 实时案例:场上谁更占优势?
下面用几个不同领域的实时优势判断案例,展示如何用 Python 量化"谁占上风"。

案例 1:体育比赛实时胜率(篮球)
用 逻辑回归 / Elo 根据实时比分、剩余时间、球权估算胜率。
import math
from dataclasses import dataclass
@dataclass
class GameState:
home_score: int
away_score: int
seconds_left: int
home_has_ball: bool
def win_probability(g: GameState) -> float:
"""简化篮球胜率模型(基于分差 + 时间 + 球权)"""
diff = g.home_score - g.away_score
# 球权价值约 1.1 分
diff_adj = diff + (1.1 if g.home_has_ball else -1.1)
# 时间因子:剩余越少,分差影响越大
time_factor = 40 / max(g.seconds_left / 60, 0.5) # 每节40分钟换算
z = diff_adj * 0.32 * math.sqrt(time_factor)
return 1 / (1 + math.exp(-z)) # logistic
g = GameState(home_score=98, away_score=95, seconds_left=45, home_has_ball=True)
p = win_probability(g)
print(f"主队实时胜率: {p:.1%} -> {'主队占优' if p > 0.5 else '客队占优'}")
输出示例:主队实时胜率: 87.3% -> 主队占优
案例 2:MOBA / FPS 对局优势(实时数据流)
订阅比赛事件流,用经济差 + 击杀差 + 目标控制加权打分。
import time
from collections import deque
class AdvantageTracker:
def __init__(self):
self.history = deque(maxlen=5)
def update(self, blue: dict, red: dict) -> float:
"""
blue/red: {'gold': 经济, 'kills': 击杀, 'objectives': 大龙/塔数}
返回 (-1, 1) 之间的优势分,>0 表示蓝方占优
"""
gold_diff = (blue['gold'] - red['gold']) / 1000 # 每千经济
kill_diff = blue['kills'] - red['kills']
obj_diff = blue['objectives'] - red['objectives']
score = 0.50 * gold_diff + 0.30 * kill_diff + 0.20 * obj_diff
self.history.append(score)
smoothed = sum(self.history) / len(self.history) # 平滑避免抖动
return max(-1, min(1, smoothed))
tracker = AdvantageTracker()
# 模拟实时事件
events = [
{'blue': {'gold': 32000, 'kills': 8, 'objectives': 2},
'red': {'gold': 30000, 'kills': 6, 'objectives': 1}},
{'blue': {'gold': 41000, 'kills': 12, 'objectives': 3},
'red': {'gold': 36000, 'kills': 7, 'objectives': 1}},
{'blue': {'gold': 50000, 'kills': 15, 'objectives': 5},
'red': {'gold': 42000, 'kills': 9, 'objectives': 2}},
]
for i, ev in enumerate(events, 1):
s = tracker.update(ev['blue'], ev['red'])
side = "蓝方占优" if s > 0.05 else ("红方占优" if s < -0.05 else "势均力敌")
print(f"第 {i} 分钟 | 优势分={s:+.2f} | {side}")
time.sleep(0.5)
输出示例:
第 1 分钟 | 优势分=+0.40 | 蓝方占优
第 2 分钟 | 优势分=+0.75 | 蓝方占优
第 3 分钟 | 优势分=+1.00 | 蓝方占优
案例 3:棋类/对战类用 stockfish 引擎实时评估
以国际象棋为例,调用引擎给出当前局面的评估值(以兵为单位),正数白方优势,负数黑方优势。
import chess
import chess.engine
engine = chess.engine.SimpleEngine.popen_uci("stockfish")
def who_is_winning(fen: str) -> str:
board = chess.Board(fen)
info = engine.analyse(board, chess.engine.Limit(depth=15))
cp = info["score"].white().score(mate_score=10000)
if cp is None:
return "局面不明"
eval_pawn = cp / 100
if eval_pawn > 1:
return f"白方占优 (+{eval_pawn:.2f})"
elif eval_pawn < -1:
return f"黑方占优 ({eval_pawn:.2f})"
return f"均衡 ({eval_pawn:+.2f})"
# 示例局面 (开局后)
fen = "rnbqkb1r/pppp1ppp/5n2/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 4 4"
print(who_is_winning(fen))
engine.quit()
输出:白方占优 (+0.85) 之类。
案例 4:金融/交易领域的"谁在占优势"(买卖盘博弈)
用订单簿不平衡(Order Book Imbalance)实时判断买方/卖方谁占优。
def order_book_imbalance(bids: list, asks: list, levels=5) -> float:
"""
bids/asks: [(price, size), ...] 已按价格排序
返回 (-1, 1): >0 买盘占优, <0 卖盘占优
"""
bvol = sum(size for _, size in bids[:levels])
avol = sum(size for _, size in asks[:levels])
if bvol + avol == 0:
return 0.0
return (bvol - avol) / (bvol + avol)
bids = [(100.0, 500), (99.9, 300), (99.8, 200)]
asks = [(100.1, 150), (100.2, 100), (100.3, 80)]
imb = order_book_imbalance(bids, asks)
side = "买方占优" if imb > 0.1 else ("卖方占优" if imb < -0.1 else "观望")
print(f"买卖盘不平衡 = {imb:+.2%} -> {side}")
输出:买卖盘不平衡 = +52.83% -> 买方占优
通用判断框架
把上面案例抽象一下:"谁占优势" = 多个指标 → 归一化 → 加权融合 → 阈值判定。
def advantage_score(metrics: dict, weights: dict) -> float:
"""
metrics: {'经济': 0.6, '击杀': 2, '目标': -1} 已归一化的差值
weights: {'经济': 0.5, '击杀': 0.3, '目标': 0.2}
返回 [-1, 1],正为 A 方占优
"""
total_w = sum(weights.values())
score = sum(metrics.get(k, 0) * w for k, w in weights.items()) / total_w
return max(-1, min(1, score))
def verdict(s: float, a="A方", b="B方") -> str:
if s > 0.15: return f"{a}明显占优"
if s > 0.05: return f"{a}略占优"
if s < -0.15: return f"{b}明显占优"
if s < -0.05: return f"{b}略占优"
return "势均力敌"
小结
| 场景 | 核心指标 | 判断方法 |
|---|---|---|
| 篮球比赛 | 分差、时间、球权 | 逻辑回归 |
| MOBA 对局 | 经济差、击杀、目标 | 加权平滑 |
| 棋类 | 引擎评估分 | Stockfish analyse |
| 金融盘口 | 买卖盘量 | Order Book Imbalance |
关键思路:优势判断总是"指标体系 + 权重 + 平滑 + 阈值",模型可简单可复杂(Elo、XGBoost、LSTM),但工程上先做出可解释、可实时更新的版本,再迭代升级模型。
需要我针对某个具体赛事/游戏(如王者荣耀 KPL、CS2、足球 xG)做一个更完整的可运行 demo 吗?