实用脚本如何结合伤停信息调仓?
结合伤停信息调仓,核心是把非结构化/半结构化的伤停情报转成可执行的调仓信号,下面给你一套完整的脚本框架和落地思路。

整体架构
伤停数据源 → 抓取/解析 → 结构化存储 → 影响度评分 → 生成调仓信号 → 执行/回测
关键不是"抓到伤停",而是量化伤停对球队/球员价值的影响。
数据源选择
| 类型 | 示例 | 获取方式 |
|---|---|---|
| 官方伤病报告 | NBA Injury Report、英超官网 | API/爬虫 |
| 体育媒体 | ESPN、Rotowire、Transfermarkt | 爬虫 + LLM 抽取 |
| 博彩赔率变化 | Pinnacle、Betfair | 赔率API(隐含伤停信息) |
| 社交媒体 | 球队官推、记者推特 | Twitter API |
推荐组合:官方报告(准确)+ 赔率变化(及时)+ LLM 解析新闻稿(覆盖广)。
脚本核心模块
伤停抓取与结构化
import requests
from bs4 import BeautifulSoup
import pandas as pd
def fetch_injuries(team, date):
# 示例:从 ESPN 抓取
url = f"https://www.espn.com/{sport}/injuries"
r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
injuries = []
for row in soup.select("table.injuries tr"):
cols = [c.get_text(strip=True) for c in row.find_all("td")]
if len(cols) >= 4:
injuries.append({
"team": cols[0],
"player": cols[1],
"position": cols[2],
"status": cols[3], # Out / Day-To-Day / Questionable
"date": date
})
return pd.DataFrame(injuries)
用 LLM 解析非结构化新闻
from openai import OpenAI
PROMPT = """从下面新闻中抽取伤停信息,输出 JSON:
{news}
字段: player, team, status(Out/Doubtful/Questionable/Probable),
expected_return, importance(1-10)"""
def parse_news(news_text):
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": PROMPT.format(news=news_text)}],
response_format={"type": "json_object"}
)
return json.loads(resp.choices[0].message.content)
影响度评分(关键)
把"谁伤了"转成"球队实力变化多少"。
def injury_impact(player, team, status, base_value):
"""
base_value: 球员对球队的边际贡献(可用 PER、BPM、xG 贡献等)
"""
status_weight = {
"Out": 1.0,
"Doubtful": 0.7,
"Questionable": 0.4,
"Probable": 0.1,
"Day-To-Day": 0.3,
}
# 位置深度调整:替补深度好的球队影响打折
depth_factor = get_bench_depth(team, player.position)
return base_value * status_weight.get(status, 0.5) * depth_factor
球员价值来源:
- NBA:PER、BPM、RAPTOR、On/Off 净效率
- 足球:xG/xA、Transfermarkt 身价、分钟权重
- 棒球:WAR
生成调仓信号
def generate_signal(team, injuries_df, market_line):
total_impact = injuries_df.apply(
lambda r: injury_impact(r.player, team, r.status, get_value(r.player)), axis=1
).sum()
# 换算成对让分/胜负的影响(经验系数)
line_shift = -total_impact * 0.15 # 每单位 impact 影响 0.15 分
fair_line = market_line + line_shift
edge = fair_line - market_line
if abs(edge) < 0.5:
return {"action": "HOLD"}
return {
"action": "BUY" if edge > 0 else "SELL",
"edge": edge,
"size": min(abs(edge) / 2, 1.0), # 凯利简化版
}
调仓触发规则(实战建议)
| 触发条件 | 动作 |
|---|---|
| 核心球员 Out 且替代者弱 | 下调球队评级 / 卖出相关持仓 |
| 关键球员 Probable 复出 | 上调评级 / 买入 |
| 赔率已反应(>80% 定价) | 不追,等回调 |
| 赛前 1 小时突发的 inactive | 快速执行(半自动) |
| 长期伤停 → 短期回归 | 提前布局 |
回测与验证
# 记录每次信号 → 赛后结算
def backtest(signals_df, results_df):
merged = signals_df.merge(results_df, on=["game_id"])
merged["pnl"] = merged.apply(
lambda r: r.edge if r.result_match else -r.edge, axis=1
)
return merged.pnl.cumsum(), merged.pnl.mean()
必看指标:
- 按伤停严重度分组的胜率
- 信号到开赛的时间衰减曲线(越早越准?还是越晚?)
- 与赔率变化的领先/滞后关系
常见坑
- 重复计数:同一球员多源报道,需去重(用 player_id + date)
- 假消息:主教练赛前烟雾弹,需交叉验证(官方 + 赔率)
- 过拟合:impact 系数别调太细,用滚动窗口验证
- 时区/赛程:跨时区比赛,抓取时间要对齐
- 流动性:小市场调仓滑点吃掉 edge
最小可用脚本(MVP)
# main.py 每日流程
def daily_pipeline(date):
injuries = fetch_injuries_all(date) # 抓取
injuries = dedupe(injuries) # 去重
injuries["impact"] = injuries.apply(score, axis=1) # 评分
teams = injuries.groupby("team").impact.sum() # 汇总
lines = get_market_lines(date) # 市场线
signals = [generate_signal(t, teams[t], lines[t]) for t in teams.index]
execute(signals) # 执行
log(signals, date) # 记录回测
进阶方向
- 图神经网络:球员-球队-位置关系建模影响传导
- 赔率异动检测:把伤停作为赔率变化的解释变量,反推市场定价效率
- LLM Agent:自动监控记者推特 → 实时预警 → 半自动下单
- 多运动通用化:抽象出
Player Value接口,NBA/足球/棒球共用
如果你告诉我具体运动(NBA/足球/电竞)+ 交易品种(让分/胜负/球员数据)+ 数据预算,我可以给一份更贴合的脚本模板。