当前版本:球员评分 v1-calibrated · 阵容模型 v2

NBA 时刻卡模拟器评分模型说明

这个模型不是用真实历史球队样本训练出来的机器学习模型,而是一个基于篮球知识构造的 可解释评分系统。它的目标不是精确预测真实 NBA 胜场,而是把五张球员卡转化为一组阵容层 特征,再根据时代环境、伤病、磨合和随机赛季波动,估计这套首发五人在 82 场常规赛里的强度。

1. 球员卡输入读取 OVR、进攻、防守、组织、投射、终结、篮板、空间、球权和高阶数据。
2. 特征工程把个人属性聚合成持球创造、空间、护框、领防、换防、篮板等球队特征。
3. 阵容结构识别主攻手、二创点、连接器、传统内线、球权冲突和兼容度。
4. 时代交互现代空间、肉搏半场、中性跨时代三套权重体系会改变收益函数。
5. 胜场映射以 41 胜作为中性基准,用饱和曲线把净强度映射为 18 到 76 胜。

一、模型类型

当前模型可以视为一个 hand-crafted scoring model:先做特征工程,再用线性组合和规则项形成球队净强度。 它接近统计建模里的专家先验模型,而不是从数据中估计参数的监督学习模型。

Team Strength = f(player attributes) + f(lineup construction) + f(era interaction) - f(usage and turnover risk) + chemistry + deterministic season noise

这里的系数不是回归训练出来的,而是人工指定的权重。优点是解释性强、调参快、符合直觉; 缺点是没有经过真实样本校准,容易在边界阵容上出现偏差。

位置资格与能力评分分开处理。会组织不等于能占 PG:基础位置来自该版本的真实角色,额外摇摆位只走版本级白名单。 当前东契奇可打 PG/SG,现有两张字母哥卡不开放 PG,小萨与老萨只打 PF/C,约基奇保留特殊 PG 资格。 同一球员的不同赛季卡可以同时出现在候选池,但一套首发最多选择其中一张。

二、输入变量

每张卡先被表示为一组球员层变量,这些变量混合了真实赛季数据、人工能力评分和打法标签。

这里必须说清楚:当前版本里,OVR、off、def、pass、shoot、finish、reb、space、usage、impact 不是从 2KDB 或 Basketball-Reference 自动抓取后直接生成的官方字段。它们是卡库里的人工标准化评分字段: 参考真实赛季 box score、高阶数据、荣誉、打法标签和篮球直觉后手工录入。 2KDB/MyTeam 只用于卡面、版本名和视觉参考,不用于抓取或标定真实能力属性。 PER、TS%、WS/48、BPM、VORP、PPG 这类更接近真实赛季统计;off/def/pass 等属于模型内部评分刻度。
OVR off def pass shoot finish reb space usage impact PER BPM VORP WS/48

这些变量不是直接相加,而是先被组合成更接近篮球机制的中间变量。比如 shoot 和 space 不完全相同:shoot 偏个人投射能力,space 偏阵容拉开空间的价值。

二点五、底层字段到底从哪里来

当前卡库每一行的字段顺序是固定的。以代码结构看,一张卡大致长这样:

[ name, version, team, pos, archetype, ovr, off, def, pass, shoot, finish, reb, space, usage, impact, ppg, ts, per, ws48, bpm, vorp, tags ]
字段来源/性质现在怎么理解
name / version / team / pos 人工录入,参考该球员代表赛季和球队版本 决定球员身份、年代、球队、基础位置。
archetype 人工分类 例如 heliocentric、shotCreator、connector、defAnchor、pointCenter,用来影响球权负载、位置摇摆和阵容兼容。
OVR 人工历史版本总评 不是 2KDB/MyTeam OVR。它是根据该版本真实表现、历史地位、峰值强度和阵容模拟需要定的内部总评。
off / def / pass / shoot / finish / reb / space / usage / impact 模型内部评分字段 这几个是 0-100 左右的人工刻度。它们吸收真实数据、高阶数据、荣誉和打法判断,但不是单一真实统计量,也不是 MyTeam 属性。
ppg / ts / per / ws48 / bpm / vorp 真实赛季统计或近似真实赛季统计 更接近 Basketball-Reference 一类历史数据口径,用于给个人产量、高阶影响和效率提供锚点。
tags 人工标签 比如 MVP、DPOY、篮板王、护框、冠军核心,用于补充纯数值看不出的角色信息。

所以当前模型不是“真实数据自动建模”,而是“真实数据 + 人工评分卡 + 规则模型”。 如果要变得更严谨,下一步应该把这些人工字段拆成可复现的生成规则,例如用真实数据 percentile、 奖项 dummy、位置 dummy、角色标签和人工校准层来生成 off/def/pass 等标准分。 2KDB/MyTeam 的属性不适合作为真实能力输入,因为它服务的是卡牌游戏平衡,不是历史真实能力估计。

三、阵容层特征工程

五个人放在一起之后,模型会先计算一批 team-level derived features。统计上看,这一步相当于把 individual-level covariates 聚合成 lineup-level covariates。

持球创造 shotCreation 由 usage、finish、shoot、pass 加权得到,近似衡量半场进攻里“自己创造一次有效出手”的能力。
组织处理 playmaking 以 pass 为主,同时奖励高组织球员和组织中锋,用来衡量面对夹击和轮转时的处理能力。
投射空间 spacing 由 space、shoot、受尊重空间点和低位重力构成。普通低空间球员会压缩突破路线,但历史级低位巨兽会把收缩防守转化成弱侧空位。
禁区压力 rimPressure 由 finish、usage、强终结点、高篮板终结内线和 interiorGravity 组成,表示能否持续攻击篮筐、制造犯规和迫使防守收缩。
护框质量 rimProtection 由 def、reb、传统中锋和 DPOY/盖帽/篮板标签构成,近似防守端禁区下限。
领防资源 pointOfAttack 重点看后场防守、pointStopper 类型和整体 def,用来表示第一道防线质量。
换防弹性 switchability 奖励多位置摇摆、twoWayWing、connector、defAnchor 等类型,表示防守对位调整能力。
防守篮板 defensiveRebound 由 reb、高篮板球员和中锋篮板组成,用来约束二次进攻风险。

四、进攻与防守子模型

模型不是只有一个总分,而是先分别构造现代进攻、肉搏进攻、现代防守、肉搏防守。当前版本仍是规则模型,还没有用历史球队样本做回归或回测校准。

modernOffense = 0.29 * shotCreation + 0.22 * playmaking + 0.23 * spacing + 0.19 * rimPressure + 0.05 * avg(off) + eliteInteriorGravity_bonus physicalOffense = 0.31 * shotCreation + 0.25 * rimPressure + 0.17 * playmaking + 0.14 * avg(finish) + 0.08 * spacing + 0.05 * avg(off)

这样做的直觉是:现代环境更放大空间和组织,肉搏环境更放大禁区压力、对抗终结和半场硬解。

防守子模型

防守端也分环境。现代防守更重视换防,肉搏防守更重视护框和篮板。

modernDefense = 0.30 * rimProtection + 0.23 * pointOfAttack + 0.25 * switchability + 0.14 * defensiveRebound + 0.08 * avg(def) physicalDefense = 0.36 * rimProtection + 0.25 * defensiveRebound + 0.17 * pointOfAttack + 0.12 * avg(def) + 0.10 * switchability

五、兼容度与球权风险

阵容兼容度 fit 是模型里很关键的一层,因为篮球不是五个高分球员的线性叠加。模型会奖励空间点、 连接器、二次创造点、基本位置结构和护框资源,同时惩罚过多高使用率核心。

fit starts at 50 + shooting_points * 3.4 + connectors * 2.5 + secondary_creators * 1.6 + generic_engine_support_bonus (max 6) + five_out_or_multi_creator_bonus + guards_bonus_or_penalty + wings_bonus + bigs_bonus_or_penalty + rim_bonus_or_penalty + traditional_rim_bonus - excess_creators_penalty - excess_heliocentric_penalty - usage_load_penalty - turnover_risk_penalty 具体代码等价于: fit = 50 fit += shooting * 3.4 fit += connectors * 2.5 fit += secondaryCreators * 1.6 if primaryEngine: fit += min(6, engineFriendlyRoles * 1.25) if fiveOutHelioTemplate: fit += 6 if multiCreatorFiveOut: fit += 7 fit += guards >= 1 ? 5 : -5 fit += wings >= 2 ? 4 : 0 fit += bigs >= 1 ? 4 : -6 fit += rim >= 1 ? 5 : -4 fit += traditionalRim >= 1 ? 2.5 : 0 fit -= max(0, creators - 2) * 5.8 fit -= max(0, engines - 1) * 7.4 fit -= max(0, usageLoad - 4.25) * 6.8 fit -= max(0, turnoverRisk) * 0.45 fit = clip(fit, 42, 99)

从统计视角看,这里是在显式加入 interaction terms 和 congestion penalties。比如两个大核单独看都很好, 但同时上场时 usage 的边际收益下降,并且失误、停球和无球适配问题会上升。

变量含义模型作用
creatorsusage >= 88 的高球权创造者数量超过 2 个开始扣分,避免五个大核堆一起无脑变强。
enginesheliocentric 持球大核数量多个体系核心共存会被额外惩罚。
connectors无球、连接、防守、空间型角色提升阵容流动性和防守稳定性。
turnoverRisk球权负载超标后的风险 proxy进入最终净强度时会被扣分。
engineFriendlyRoles能为任意主控核心提供空间、防守或终结的角色数量不再检查球员姓名;勒布朗、东契奇、哈登等使用同一条结构规则。

五点五、页面里的几个函数/变量怎么定义

之前那张黑底公式图里用了 shooting_points、connectors、secondary_creators 这类简写, 但没有把定义展开,这是不够透明的。当前代码里的定义如下:

变量/函数精确定义解释
avg(list, key) 五张卡某个字段的平均值 例如 avg(list, "pass") 就是五个人 pass 的均值。
roleCount(list, predicate) 统计五张卡里满足某个条件的人数 比如 roleCount(list, c => c.space >= 86) 就是空间点数量。
shooting roleCount(list, c => c.space >= 86) 页面里写的 shooting_points,其实就是 space 大于等于 86 的球员个数。
creators roleCount(list, c => c.usage >= 88) 高使用率主攻手数量。超过 2 个会产生球权拥挤惩罚。
engines roleCount(list, c => c.archetype === "heliocentric") 持球大核数量,比如詹姆斯、东契奇、哈登这类体系核心。
connectors archetype 属于 connector、pointStopper、movementShooter、stretchBig、defAnchor 的人数 代表不用大量持球也能提供价值的拼图型资源。
secondaryCreators pass >= 84 且 usage >= 74 且 usage < 90 的人数 二次处理点,不是绝对大核,但能接球后继续处理。
guards 基础位置包含 PG 的人数 至少一个控卫会加分;没有控卫会扣分。
wings 基础位置包含 SG 或 SF 的人数 两个以上侧翼会加分,因为现代/跨时代阵容都需要侧翼资源。
bigs 基础位置包含 PF 或 C 的人数 至少一个前场/内线会加分;完全没有会扣分。
rim 中锋,且 def >= 84 或 reb >= 94 或标签含护框/盖帽/篮板王/禁区统治/DPOY 判断是否有可靠护框支点。
traditionalRim 中锋,且 finish >= 88 且 reb >= 90 判断是否有传统内线篮板和禁区终结支点。
eliteInteriorGravity 实际站中锋位,finish >= 95,usage >= 88,reb >= 90,且 impact/荣誉达到历史级 识别奥尼尔、贾巴尔这类低位异常值;他们低空间,但能通过收缩防守制造外线机会。
usageLoad 把每个 archetype 映射成球权占用权重后求和 heliocentric=1.18,shotCreator=1.02,connector=0.62,defAnchor=0.58 等。
turnoverRisk 球权超载项 + 纯持球重叠项 - hierarchyRelief 组织点、连接器、受尊重空间点和历史级低位重力会缓解风险;多个纯单打核才会重扣。

六、时代交互项

模型当前有三种环境:现代空间、90s/00s 肉搏、中性跨时代。不同环境不是简单加减一个固定分, 而是切换不同的进攻/防守子模型,并额外加入 eraBonus 和 eraPenalty。胜场最终以中性强度为主体,时代适配只作为有上限的 styleAdjustment。

现代空间模型 使用 modernOffense 和 modernDefense。奖励 spacing、shooting、switchability、playmaking;普通低空间点会被惩罚,但历史级低位重力会被单独保护。
肉搏半场模型 使用 physicalOffense 和 physicalDefense。奖励 rimPressure、defensiveRebound、rimProtection、traditionalRim、powerInterior。
时代保护 eraProofStars 对 KD、乔丹、詹姆斯这类身高、投射、终结、单挑兼具的球员做跨时代保护,避免机械惩罚。
历史组织中锋 historicBigs 对约基奇这类高影响力、高组织、高篮板中锋做保护,不按普通现代空间内线处理。
physicalEraPenalty = small_lead_guards * 4.2 + fragile_perimeter * 3.8 + modern_spacing_dependence * 2.4 + future_cards_penalty + modern_lead_creator_penalty - physical_interior_protection penalty is clipped to [0, 22]
finalNet = neutralStrength + clamp(styleAdjustment, -3.8, 3.8) + fixedSeasonNoise fixedSeasonNoise uses lineup + injury + chemistry, not era. Changing era does not reroll luck.

这里的关键不是“现代球员一律扣分”,而是判断现代打法迁移到肉搏环境时的脆弱点: 小后卫、低对抗、防守篮板弱、过度依赖空间、手检环境下的持球消耗等。

七、最终胜场映射

最终模型构造一个 net strength proxy,然后以 41 胜作为联盟平均基准,把强度差映射到胜场。

net = 0.30 * (offense - 84) + 0.28 * (defense - 82) + 0.17 * (effectiveFit - 70) + 0.18 * (advImpact - 86) + talent + eraBonus - eraPenalty + coachChem + randomSwing + possessionEdge + durabilityFloor * 0.035 wins = round(41 + 36 * tanh(net / 32)) wins is clipped to [18, 76] talent = (averageOVR - 82) * 1.45 + max(0, bestOVR - 92) * 0.70 + max(0, secondOVR - 88) * 0.40

其中 41 胜是中性球队基准,offense、defense、fit、advImpact 是主要解释变量。 tanh 是饱和映射:中段强度提升会明显增加胜场,但越接近历史极值,新增强度对应的胜场越少,避免大量阵容直接撞到 78 胜。 randomSwing 不是完全随机,它由五张卡 ID、伤病值、磨合值生成 deterministic noise: 同一套阵容和同一组设置会得到同一个波动项。

肉搏环境里如果 eraPenalty 很高,还会设置上限:penalty 超过 12 时最多 66 胜, 超过 18 时最多 60 胜。这是为了避免一套结构明显不适配的阵容仅靠天赋冲到历史级胜场。

八、季后赛模型

季后赛不是简单沿用常规赛胜场,而是重新构造 playoff power。

playoffPower = 0.22 * offense + 0.18 * defense + 0.15 * shotCreation + 0.10 * playmaking + 0.10 * rimPressure + 0.08 * rimProtection + 0.06 * pointOfAttack + 0.04 * defensiveRebound + 0.07 * adv + 0.28 * (wins - 50) + 0.90 * closers + 0.45 * eraEdge + playoffTalent - riskTax

每一轮先把球队 power 与该轮对手强度转换成独立晋级概率:

p(round win) = clip(logistic((power - opponentStrength + 2.00) / 8), 0.08, 0.92) titleOdds = p(round 1) * p(round 2) * p(round 3) * p(Finals) titleOdds is capped at 55%

页面展示的是一次固定抽样路径,但“夺冠概率”是四轮概率的乘积。即使历史级阵容也可能爆冷出局, 防守强但进攻不足的球队也不会再因为高阶影响力重复计权而轻易横扫夺冠。

其中 2.00 是统一的系列赛校准截距:它只把所有球队的单轮晋级概率曲线整体上移,不改变球队排序, 也不取消四轮连乘。这个修正用于纠正旧版对手强度刻度偏高、争冠队夺冠概率普遍过低的问题。

九、球员赛季数据

模拟后的个人数据也是派生模型,不是逐场 box score 累加。

usageShare = player_usage / team_total_usage minutes = f(impact, usageShare, rotation_slot) ppg = f(real_ppg, usageShare, era_pace, team_wins) rpg = f(reb, position, minutes) apg = f(pass, position, archetype) TS% = f(real_ts, team_spacing, team_fit)

这一步的目标是让每个球员在新阵容里的角色发生变化:高 usage 球员不一定完全复制原赛季产量, 空间和团队强度也会影响效率。

十、统计意义上的局限性

问题当前处理更严谨的升级方向
参数未训练 权重来自篮球直觉和人工调参。 构造历史球队样本,用 SRS、Net Rating 或胜场作为 label 做回归校准。
样本迁移 用 eraBonus、eraPenalty 和保护规则处理跨时代。 建立分时代模型,或加入 era-by-feature interaction terms 进行估计。
非线性关系 用阈值、clip、count bonus 和 penalty 做近似。 可以用 GAM、ridge with splines、XGBoost 或 Bayesian hierarchical model。
不确定性表达 只有 deterministic season noise。 输出胜场分布、置信区间、季后赛路径概率,而不是单点估计。
逐场机制缺失 现在是一次性估算 82 场强度。 加入 schedule、opponent strength、home/away、rest、injury process,做 Monte Carlo season simulation。

十一、球员评分层:derived-v1-calibrated

现在模拟器已经不再直接使用原来的人工字段作为主评分。原来的 ovr/off/def/pass/shoot/finish/reb/space/usage/impact 已经保存在 card.manual 里作为备份;页面展示与阵容模型输入使用 derived-v1-calibrated 生成分。 derived-v1 的输入是现有卡库已经有的真实赛季锚点:PPG、TS%、PER、WS/48、BPM、VORP, 再叠加位置、archetype、荣誉标签和角色标签校准。

这里仍然不使用 2KDB/MyTeam 属性。2KDB 只保留为卡面和版本视觉来源。 能力评分的底层数据来自真实赛季统计、高阶数据、荣誉标签和明确的角色校准规则。 由于当前卡库还没有 USG%、AST%、TRB%、DBPM、3PAr 等更细字段,derived-v1 仍然是 proxy 模型, 但它已经比直接手填能力分更可解释、可复算。
目标字段建议真实数据组件公式思路现在缺什么
shoot 3P%、3PA、3PAr、FT%、TS%、中距离效率 投射不是只看命中率,要同时看产量、难度和罚球手感。三分产量高且效率高的球员应高分。 derived-v1 暂用 TS%、PPG、BPM、archetype 和射手标签 proxy;仍缺 3P%、3PA、3PAr、FT% 和中距离。
space 3PAr、三分产量、无球三分标签、位置 space 衡量阵容拉开价值。高产三分、Logo 威胁、无球跑动会提高空间分。 derived-v1 暂用 shoot、射手标签、位置和 archetype proxy;仍缺真实三分出手结构和无球/持球三分拆分。
pass AST%、AST/TOV、TOV%、Usage 下的助攻负载、位置 pass 不等于场均助攻,要看球权环境下的组织产出和失误控制。 derived-v1 暂用 BPM、VORP、PER、archetype 和组织标签 proxy;仍缺 AST%、TOV%、AST/TOV。
usage USG%、FGA、FTA、TOV、on-ball role usage 应主要由 USG% 和出手/罚球/失误占有决定,再用角色标签校准。 derived-v1 暂用 PPG、PER、BPM、archetype 使用权重和主攻标签 proxy;仍缺 USG%。
finish 2P%、rim FG%、FTr、FTA、扣篮/篮下频率 终结要同时看篮下效率、造罚球、对抗产量和持球突破压力。 derived-v1 暂用 PPG、TS%、PER、位置、archetype 和终结标签 proxy;仍缺篮下出手、造罚球率和 2P 分区。
reb TRB%、ORB%、DRB%、位置、上场时间 篮板必须按位置校准。后卫高 TRB% 和中锋高 TRB% 的含义不同。 derived-v1 暂用 PER、WS/48、BPM、位置和篮板标签 proxy;仍缺 TRB%、ORB%、DRB%。
def DBPM、DWS、STL%、BLK%、DPOY/All-Defense、位置 防守最难量化,要用高阶防守数据、抢断盖帽、奖项和位置校准共同生成。 derived-v1 暂用 BPM、WS/48、archetype、防守标签和位置 proxy;仍缺 DBPM、DWS、STL%、BLK%。
off PPG、TS%、USG%、OBPM、OWS、PER 进攻总分由产量、效率、球权难度和高阶进攻影响共同决定。 derived-v1 暂用 PPG、TS%、PER、BPM、usage 和 shoot proxy;仍缺 OBPM、OWS、USG%。
impact BPM、VORP、WS/48、MVP shares、季后赛 lift impact 是综合历史影响力,不只是常规赛效率,需要加入荣誉和季后赛校准。 derived-v1 使用 BPM、VORP、WS/48、PER、奖项和季后赛标签;仍缺 MVP shares 和更严谨的季后赛 lift。
OVR off、def、impact、位置角色、峰值荣誉 OVR 应作为派生结果,而不是输入变量。它应该从各子能力和历史影响力聚合得到。 当前已经改为派生值:由 impact、off、def、max(pass/shoot/finish)、reb、usage 聚合。

十二、可复算公式草案

下面是更完整的数据版公式形态。当前 derived-v1 已经先用可用字段实现了 proxy 版本; 等 USG%、AST%、TRB%、DBPM、3PAr 等字段补齐后,可以把 proxy 替换为更严格的 percentile 或 z-score。

scale(x) = clip(40 + 60 * percentile(x), 40, 100) shoot = 0.35 * scale(3P%) + 0.25 * scale(3PA_per_75) + 0.15 * scale(3PAr) + 0.15 * scale(FT%) + 0.10 * shooting_tag_bonus space = 0.45 * shoot + 0.20 * scale(3PA_per_75) + 0.15 * on_ball_punish_bonus + 0.10 * off_ball_gravity_bonus + 0.10 * playoff_defensive_respect + position_spacing_adjustment space_floor = primary wing/guard scorers with efficient volume and playoff respect cannot fall below the "defense cannot ignore him" tier pass = 0.40 * scale(AST%) + 0.25 * scale(AST_TOV) + 0.15 * scale(on_ball_usage) - 0.10 * scale(TOV%) + 0.10 * role_bonus
def = 0.25 * scale(DBPM) + 0.20 * scale(DWS_per_75) + 0.15 * scale(STL%) + 0.15 * scale(BLK%) + 0.15 * all_defense_or_dpoy_bonus + 0.10 * position_defense_adjustment reb = 0.45 * scale(TRB%) + 0.25 * scale(DRB%) + 0.15 * scale(ORB%) + 0.15 * position_rebound_adjustment impact = 0.30 * scale(BPM) + 0.22 * scale(VORP) + 0.18 * scale(WS48) + 0.15 * scale(PER) + 0.10 * award_bonus + 0.05 * playoff_lift

注意这里的 award_bonus 和 role_bonus 不是随便拍脑袋,而是明确的 dummy/校准层。 例如 MVP、DPOY、Finals MVP、一阵、一防可以有固定加成,但加成需要封顶,避免奖项重复导致爆表。

十三、落地顺序

当前阵容层模型已切到 derived-v2:保留 derived-v1-calibrated 球员分,并用固定阵容回归集约束胜场和季后赛改动。后面继续补真实组件。

Done保留现有人工字段为 manual,同时启用 derived-v1 作为主评分。
Done加入固定阵容回归基准、饱和胜场曲线和四轮概率化季后赛。
Next新增真实组件字段:USG%、AST%、TRB%、DBPM、3PAr 等。
Next球员库里同时展示 manual 分和 derived 分的差异,方便审查异常。
Next用历史球队胜场/SRS 校准阵容模型 derived-v2 的权重和胜场映射。
Step 4对边界球员做人审:比如罗德曼、追梦、穆托姆博这类 box score 低估型球员。
Step 5输出每张卡的评分解释:为什么 shoot 是 96,为什么 def 是 99。

一句话总结

当前评分系统是一个可解释的专家规则模型:它先把五张球员卡转换成阵容特征,再通过时代交互、 兼容度、球权风险和高阶影响力形成净强度,最后以 41 胜为基准映射到常规赛胜场。 它适合做可玩、可解释、可快速迭代的模拟器原型;如果要变成更严谨的统计模型,下一步应该用真实历史球队数据做参数校准和评分审计。