Files
PolyHermes/docs/zh/nba-quantitative-strategy-algorithm.md
WrBug e9e1111df9 feat: 实现 NBA 量化交易系统
- 后端实现:
  - 实现 NBA 比赛数据服务,从 Polymarket API 获取数据
  - 实现数据库存储和增量拉取逻辑(优先从 DB 获取,数据不足时增量拉取)
  - 使用 sports_market_types 参数直接筛选 moneyline 类型
  - 实现分页拉取逻辑(基于 gameStartTime 和 createdAt)
  - 移除 nba_markets 相关的外键约束(V12 迁移)
  - 修复数据拉取逻辑:超过 3 天的数据不拉取

- 前端实现:
  - 实现策略创建/编辑/列表页面
  - 实现交易信号展示页面和统计页面
  - 修复重复请求问题(使用 useCallback 包装 fetchGames)
  - 支持选择单场比赛进行配置
  - 使用西8区时间格式化显示

- 数据库:
  - 创建 NBA 量化交易相关表(V11 迁移)
  - 移除外键约束(V12 迁移)

- 文档:
  - 添加产品需求文档、技术方案、算法文档等
2025-12-13 08:05:08 +08:00

22 KiB
Raw Permalink Blame History

NBA 量化交易策略算法文档

一、算法概述

1.1 算法目标

本算法基于 NBA 比赛数据,通过量化分析两支队伍的实力、状态、对位关系等因素,计算出哪支队伍具有更高的获胜概率和交易价值,从而生成买入/卖出交易信号。

1.2 算法流程

获取比赛数据(主队 vs 客队)
        ↓
数据预处理和特征提取
        ↓
计算两队综合评分
        ↓
计算获胜概率和预期收益
        ↓
生成交易信号(买入/卖出)
        ↓
风险控制检查
        ↓
输出交易信号

1.3 核心思想

不是简单的"主队落后买入",而是

  • 综合分析两支队伍的各项指标
  • 计算每支队伍的相对优势和劣势
  • 评估交易价值和风险
  • 选择最优的交易方向和时机

二、数据预处理

2.1 基础数据获取

比赛基本信息

  • 比赛 ID、日期、主客场
  • 当前比分、分差、节次、剩余时间
  • 比赛状态(未开始/进行中/已结束)

球队基础数据

  • 主队和客队的基本信息
  • 当前赛季的统计数据
  • 近期表现数据(近 5 场/10 场)

球员数据

  • 核心球员的统计数据
  • 球员健康状况和轮休情况
  • 球员近期表现

2.2 数据清洗

异常值处理

  • 检查数据合理性(如得分不超过 200 分)
  • 处理缺失值(使用历史平均值或默认值)
  • 处理异常数据(如负分差、超时时间等)

数据标准化

  • 将不同量纲的数据标准化到统一范围
  • 使用 Z-score 或 Min-Max 归一化
  • 确保数据在 [0, 1] 或 [-1, 1] 范围内

2.3 特征工程

基础特征

  • 当前分差(主队得分 - 客队得分)
  • 剩余时间(分钟)
  • 当前节次(1-4,加时)
  • 比赛状态

统计特征

  • 球队净效率值(进攻效率 - 防守效率)
  • 球队比赛节奏(Pace
  • 球队关键时刻表现(Clutch 数据)
  • 球队主客场表现差异

动态特征

  • 势头动量(过去 N 回合的净胜分)
  • 手感热度(近期命中率)
  • 阵容对位优势
  • 球星爆发因子

三、综合评分算法

3.1 球队实力评分

3.1.1 基础实力评分

计算公式

基础实力评分 = 净效率值评分 × W1 + 攻防效率评分 × W2 + 节奏评分 × W3

评分组成

  • 净效率值评分:基于球队赛季平均净效率值,归一化到 [0, 1]
    • 评分 = (净效率值 - 联盟最低值) / (联盟最高值 - 联盟最低值)
  • 攻防效率评分:综合考虑进攻效率和防守效率
    • 进攻效率评分 = (进攻效率排名 - 1) / (总球队数 - 1),排名越靠前评分越高
    • 防守效率评分 = (防守效率排名 - 1) / (总球队数 - 1),排名越靠前评分越高
    • 攻防效率评分 = (进攻效率评分 + 防守效率评分) / 2
  • 节奏评分:基于比赛节奏(Pace
    • 节奏评分 = (Pace - 联盟最低值) / (联盟最高值 - 联盟最低值)

权重设置

  • W1 = 0.5(净效率值权重最高)
  • W2 = 0.3(攻防效率权重)
  • W3 = 0.2(节奏权重)

3.1.2 近期状态评分

计算公式

近期状态评分 = 近期胜率评分 × W1 + 近期净效率值变化 × W2 + 势头评分 × W3

评分组成

  • 近期胜率评分:近 5 场或 10 场胜率
    • 评分 = 近期胜率(0-1
  • 近期净效率值变化:近期净效率值与赛季平均的差值
    • 变化 = (近期净效率值 - 赛季平均净效率值) / 赛季平均净效率值
    • 评分 = (变化 + 1) / 2(归一化到 [0, 1]
  • 势头评分:基于连胜/连败场次
    • 连胜:评分 = min(连胜场次 / 5, 1)
    • 连败:评分 = max(1 - 连败场次 / 5, 0)

权重设置

  • W1 = 0.4(胜率权重)
  • W2 = 0.4(净效率值变化权重)
  • W3 = 0.2(势头权重)

3.1.3 阵容完整度评分

计算公式

阵容完整度评分 = 1 - (缺失球员总VORP / 球队总VORP)

评分说明

  • 如果所有核心球员都在,评分为 1.0
  • 如果有核心球员缺席,根据缺失球员的 VORP 值降低评分
  • 缺失球员越多、重要性越高,评分越低

3.1.4 球星状态评分

计算公式

球星状态评分 = 核心球星PER评分 × W1 + 核心球星TS%评分 × W2 + 核心球星健康评分 × W3

评分组成

  • 核心球星 PER 评分:基于近期 PER 与赛季平均的对比
    • 评分 = (近期PER - 赛季平均PER) / 赛季平均PER + 1,归一化到 [0, 1]
  • 核心球星 TS% 评分:基于近期真实命中率
    • 评分 = (近期TS% - 赛季平均TS%) / 赛季平均TS% + 1,归一化到 [0, 1]
  • 核心球星健康评分
    • 健康:1.0
    • 出战成疑:0.7
    • 缺席:0.3

权重设置

  • W1 = 0.4PER 权重)
  • W2 = 0.4TS% 权重)
  • W3 = 0.2(健康权重)

3.1.5 环境因素评分

计算公式

环境因素评分 = 主客场优势评分 × W1 + 休息天数评分 × W2 + 背靠背影响评分 × W3

评分组成

  • 主客场优势评分
    • 主场:1.0
    • 客场:基于客场胜率,评分 = 客场胜率 / 主场胜率
  • 休息天数评分
    • 休息 1 天:0.9
    • 休息 2 天:1.0(最优)
    • 休息 3 天以上:0.95
  • 背靠背影响评分
    • 非背靠背:1.0
    • 背靠背第二场:0.85

权重设置

  • W1 = 0.5(主客场权重最高)
  • W2 = 0.3(休息天数权重)
  • W3 = 0.2(背靠背权重)

3.2 综合评分计算

主队综合评分

主队综合评分 = 基础实力评分 × 0.3 
             + 近期状态评分 × 0.25
             + 阵容完整度评分 × 0.2
             + 球星状态评分 × 0.15
             + 环境因素评分 × 0.1

客队综合评分

客队综合评分 = 基础实力评分 × 0.3 
             + 近期状态评分 × 0.25
             + 阵容完整度评分 × 0.2
             + 球星状态评分 × 0.15
             + 环境因素评分 × 0.1

相对优势评分

主队相对优势 = 主队综合评分 - 客队综合评分

四、对位分析算法

4.1 球星对位分析

对位优势评分

对位优势评分 = 防守限制效果评分 × W1 + 历史对位数据评分 × W2

评分组成

  • 防守限制效果评分:基于防守球员的 DRPM 和进攻球员的 ORPM
    • 如果防守球员 DRPM 高,且进攻球员 ORPM 高,则限制效果好
    • 评分 = (防守球员DRPM - 联盟平均DRPM) / (联盟最高DRPM - 联盟平均DRPM)
  • 历史对位数据评分:基于历史对位时的表现
    • 对位效率差 = (对位时进攻球员TS% - 赛季平均TS%)
    • 评分 = 1 - (对位效率差 / 最大可能效率差),归一化到 [0, 1]

权重设置

  • W1 = 0.6(防守限制效果权重)
  • W2 = 0.4(历史对位数据权重)

4.2 阵容克制分析

阵容克制评分

阵容克制评分 = 内线优势评分 × W1 + 外线优势评分 × W2 + 快攻优势评分 × W3

评分组成

  • 内线优势评分
    • 如果主队内线得分占比高,且客队内线防守效率低,则主队有优势
    • 评分 = (主队内线得分占比 - 客队内线防守效率排名归一化) / 2
  • 外线优势评分
    • 如果主队三分出手占比高,且客队三分防守效率低,则主队有优势
    • 评分 = (主队三分出手占比 - 客队三分防守效率排名归一化) / 2
  • 快攻优势评分
    • 如果主队快攻得分占比高,且客队快攻防守效率低,则主队有优势
    • 评分 = (主队快攻得分占比 - 客队快攻防守效率排名归一化) / 2

权重设置

  • W1 = 0.4(内线权重)
  • W2 = 0.4(外线权重)
  • W3 = 0.2(快攻权重)

4.3 对位综合评分

主队对位优势

主队对位优势 = 主队球星对位优势 - 客队球星对位优势
             + 主队阵容克制优势 - 客队阵容克制优势

五、实时状态分析算法

5.1 比赛进行中的实时分析

5.1.1 当前分差分析

分差优势评分

分差优势评分 = (当前分差 / 最大可能分差) × 时间调整系数

时间调整系数

  • 比赛早期(第1-2节):系数 = 0.3(分差影响较小)
  • 比赛中期(第3节):系数 = 0.6(分差影响中等)
  • 比赛后期(第4节):系数 = 1.0(分差影响最大)
  • 最后5分钟:系数 = 1.2(分差影响极大)

5.1.2 势头动量分析

势头动量评分

势头动量 = (过去N回合净胜分) / (N × 平均单回合得分)

评分说明

  • 如果主队过去 10 回合净胜 +8 分,则主队势头强劲
  • 势头动量 > 0.3:势头强劲
  • 势头动量 < -0.3:势头疲软

5.1.3 实时综合评分调整

实时调整公式

实时调整评分 = 基础综合评分 
             + 分差优势评分 × 0.3
             + 势头动量评分 × 0.2
             - 时间衰减系数 × 0.1

时间衰减系数

  • 比赛越接近结束,基础评分的影响越小,实时状态的影响越大
  • 时间衰减系数 = (剩余时间 / 总时间) × 0.5

5.2 比赛未开始时的预测分析

预测综合评分

预测综合评分 = 基础综合评分 
             + 对位优势评分 × 0.2
             + 环境因素评分 × 0.1

六、获胜概率计算

6.1 基础获胜概率

基于综合评分的概率

基础获胜概率 = 1 / (1 + exp(-k × (主队综合评分 - 客队综合评分)))

参数说明

  • k 为调整系数,通常取 5-10
  • 如果主队综合评分 > 客队综合评分,则主队获胜概率 > 0.5
  • 如果主队综合评分 = 客队综合评分,则主队获胜概率 = 0.5

6.2 对位调整概率

对位调整

调整后概率 = 基础获胜概率 + 对位优势调整值

对位优势调整值

  • 如果主队对位优势 > 0.1,则调整值 = +0.05
  • 如果主队对位优势 < -0.1,则调整值 = -0.05
  • 调整值范围:[-0.1, +0.1]

6.3 实时状态调整概率

实时调整(仅比赛进行中):

最终概率 = 调整后概率 
         + 分差调整值 × 0.3
         + 势头调整值 × 0.2

分差调整值

  • 如果主队领先,且剩余时间充足,则调整值 = +0.05
  • 如果主队落后,且剩余时间不足,则调整值 = -0.05

势头调整值

  • 如果主队势头强劲,则调整值 = +0.03
  • 如果主队势头疲软,则调整值 = -0.03

6.4 概率归一化

确保概率在 [0, 1] 范围内

最终概率 = max(0, min(1, 最终概率))

七、交易价值计算

7.1 预期收益计算

预期收益公式

预期收益 = (获胜概率 × 获胜收益) - ((1 - 获胜概率) × 失败损失)

收益和损失

  • 如果买入主队获胜(YES),价格为 P
    • 获胜收益 = (1 - P) × 投入金额
    • 失败损失 = P × 投入金额
  • 如果买入主队失败(NO),价格为 P
    • 获胜收益 = P × 投入金额
    • 失败损失 = (1 - P) × 投入金额

7.2 风险调整收益

风险调整公式

风险调整收益 = 预期收益 × (1 - 风险系数)

风险系数计算

风险系数 = 概率不确定性 × 0.5 + 价格波动风险 × 0.3 + 流动性风险 × 0.2

风险组成

  • 概率不确定性:如果获胜概率接近 0.5,则不确定性高
    • 不确定性 = 1 - |获胜概率 - 0.5| × 2
  • 价格波动风险:基于市场价格的波动性
    • 如果价格波动大,则风险高
  • 流动性风险:基于市场的流动性
    • 如果市场流动性低,则风险高

7.3 交易价值评分

交易价值评分

交易价值评分 = 风险调整收益 / 投入金额

评分说明

  • 交易价值评分 > 0.1:高价值交易,强烈推荐
  • 交易价值评分 > 0.05:中等价值交易,推荐
  • 交易价值评分 > 0:低价值交易,可考虑
  • 交易价值评分 <= 0:无价值交易,不推荐

八、交易信号生成算法

8.1 信号生成条件

买入信号生成条件

  1. 获胜概率条件

    • 主队获胜概率 > 阈值(如 0.55)或 < 阈值(如 0.45
    • 如果主队获胜概率 > 0.55,买入主队获胜(YES
    • 如果主队获胜概率 < 0.45,买入主队失败(NO
  2. 交易价值条件

    • 交易价值评分 > 用户配置的最小交易价值(如 0.05)
  3. 价格条件

    • 当前市场价格在合理范围内
    • 价格偏差在用户配置的容忍度内
  4. 时间条件

    • 比赛未结束
    • 剩余时间充足(如果用户配置了最小剩余时间)

8.2 信号方向确定

方向判断逻辑

如果 主队获胜概率 > 0.55:
    方向 = YES(买入主队获胜)
    目标价格 = 市场价格(如果合理)
    
如果 主队获胜概率 < 0.45:
    方向 = NO(买入主队失败)
    目标价格 = 1 - 市场价格(如果合理)
    
如果 0.45 <= 主队获胜概率 <= 0.55:
    不生成信号(概率太接近,不确定性高)

8.3 信号价格计算

价格计算策略

策略一:固定价格(用户配置)

信号价格 = 用户配置的固定价格

策略二:市场价格(默认)

信号价格 = 当前市场价格

策略三:动态价格(基于概率)

如果 方向 = YES:
    信号价格 = 主队获胜概率 × (1 + 价格偏移)
    
如果 方向 = NO:
    信号价格 = (1 - 主队获胜概率) × (1 + 价格偏移)

价格偏移

  • 价格偏移 = 用户配置的价格偏移百分比(如 ±5%)
  • 用于调整价格,提高交易成功率

8.4 信号数量计算

数量计算策略

策略一:固定金额(用户配置)

信号数量 = 用户配置的固定金额 / 信号价格

策略二:按比例(用户配置)

信号数量 = 账户余额 × 用户配置的比例 / 信号价格

策略三:动态计算(基于交易价值)

基础数量 = 用户配置的基础金额 / 信号价格
调整系数 = min(交易价值评分 / 0.1, 2.0)  // 最多放大2倍
信号数量 = 基础数量 × 调整系数

8.5 信号原因生成

触发原因说明

触发原因 = "主队综合评分: {主队评分}, 客队综合评分: {客队评分}, "
         + "获胜概率: {获胜概率}, 交易价值: {交易价值评分}, "
         + "主要优势: {主要优势项}"

主要优势项识别

  • 如果基础实力评分差异最大,则主要优势 = "基础实力"
  • 如果近期状态评分差异最大,则主要优势 = "近期状态"
  • 如果对位优势明显,则主要优势 = "对位优势"
  • 如果实时状态优势明显,则主要优势 = "实时状态"

九、卖出信号生成算法

9.1 卖出条件

卖出信号生成条件

  1. 止盈条件

    • 当前持仓的预期收益达到用户配置的止盈阈值(如 20%)
    • 或市场价格达到用户配置的目标价格
  2. 止损条件

    • 当前持仓的预期亏损达到用户配置的止损阈值(如 -10%)
    • 或市场价格跌破用户配置的止损价格
  3. 概率反转条件

    • 获胜概率发生反转(如从 0.6 降到 0.4)
    • 反转幅度超过用户配置的阈值(如 0.15)
  4. 时间条件

    • 比赛接近结束(剩余时间 < 用户配置的最小剩余时间)
    • 或比赛已结束

9.2 卖出价格计算

卖出价格

卖出价格 = 当前市场价格

价格调整(可选):

如果 止盈卖出:
    卖出价格 = min(当前市场价格, 目标价格)
    
如果 止损卖出:
    卖出价格 = max(当前市场价格, 止损价格)

9.3 卖出数量计算

卖出数量

如果 全部卖出:
    卖出数量 = 当前持仓数量
    
如果 部分卖出:
    卖出数量 = 当前持仓数量 × 用户配置的卖出比例

十、风险控制算法

10.1 持仓限制检查

最大持仓检查

如果 信号数量 × 信号价格 > 用户配置的最大持仓:
    信号数量 = 用户配置的最大持仓 / 信号价格
    记录警告:超过最大持仓限制,已调整数量

最小持仓检查

如果 信号数量 × 信号价格 < 用户配置的最小持仓:
    不生成信号
    记录原因:金额低于最小持仓限制

10.2 每日限制检查

每日亏损限制

今日已亏损 = 今日所有交易的累计亏损

如果 今日已亏损 + 预期最大亏损 > 用户配置的每日亏损限制:
    不生成信号
    记录原因:超过每日亏损限制

每日订单限制

今日订单数 = 今日已生成的信号数量

如果 今日订单数 >= 用户配置的每日订单限制:
    不生成信号
    记录原因:超过每日订单限制

10.3 价格容忍度检查

价格偏差检查

价格偏差 = |信号价格 - 当前市场价格| / 当前市场价格

如果 价格偏差 > 用户配置的价格容忍度:
    不生成信号
    记录原因:价格偏差超过容忍度

10.4 概率置信度检查

概率置信度

如果 0.45 <= 获胜概率 <= 0.55
    不生成信号
    记录原因:获胜概率太接近,不确定性高

最小概率阈值(可选):

如果 获胜概率 < 用户配置的最小概率阈值:
    不生成信号
    记录原因:获胜概率低于最小阈值

十一、算法参数配置

11.1 用户可配置参数

触发条件参数

  • 最小获胜概率差异:主队和客队获胜概率的最小差异(如 0.1)
  • 最小交易价值:交易价值评分的最小值(如 0.05)
  • 最小剩余时间:生成信号时的最小剩余时间(如 5 分钟)

交易规则参数

  • 买入金额策略:固定金额/按比例/动态计算
  • 买入金额:固定金额或比例值
  • 价格策略:固定价格/市场价格/动态价格
  • 价格偏移:价格偏移百分比(如 ±5%

风险控制参数

  • 最大持仓:单次最大买入金额
  • 最小持仓:单次最小买入金额
  • 每日亏损限制:每日最大亏损金额
  • 每日订单限制:每日最大订单数量
  • 价格容忍度:允许的价格偏差百分比

卖出规则参数

  • 止盈阈值:预期收益达到多少时卖出(如 20%)
  • 止损阈值:预期亏损达到多少时卖出(如 -10%)
  • 概率反转阈值:概率反转多少时卖出(如 0.15)
  • 卖出比例:部分卖出时的比例(如 50%)

11.2 系统默认参数

评分权重(可根据历史数据优化):

  • 基础实力权重:0.3
  • 近期状态权重:0.25
  • 阵容完整度权重:0.2
  • 球星状态权重:0.15
  • 环境因素权重:0.1

概率计算参数

  • k 值(逻辑回归系数):7.5
  • 对位调整范围:[-0.1, +0.1]
  • 实时调整权重:分差 0.3,势头 0.2

风险系数权重

  • 概率不确定性权重:0.5
  • 价格波动风险权重:0.3
  • 流动性风险权重:0.2

十二、算法优化建议

12.1 参数优化

历史回测优化

  • 使用历史数据回测不同参数组合
  • 找到最优的参数配置
  • 定期重新优化参数

A/B 测试

  • 同时运行多组参数配置
  • 对比不同参数的效果
  • 选择最优参数组合

12.2 模型优化

机器学习集成

  • 使用机器学习模型预测获胜概率
  • 使用梯度提升决策树(XGBoost/LightGBM
  • 定期重新训练模型

特征工程优化

  • 添加更多特征(如历史对战数据、伤病信息等)
  • 使用特征选择技术筛选重要特征
  • 使用特征交互提高预测准确性

12.3 实时优化

动态权重调整

  • 根据比赛阶段动态调整权重
  • 比赛早期:基础实力权重高
  • 比赛后期:实时状态权重高

自适应阈值

  • 根据市场情况动态调整阈值
  • 如果市场波动大,提高概率阈值
  • 如果市场稳定,降低概率阈值

十三、算法输出

13.1 信号输出格式

买入信号

{
  "signalType": "BUY",
  "strategyId": "策略ID",
  "gameId": "比赛ID",
  "marketId": "市场ID",
  "direction": "YES" | "NO",
  "price": 0.65,
  "quantity": 10.0,
  "totalAmount": 6.5,
  "reason": "主队综合评分: 0.72, 客队综合评分: 0.58, 获胜概率: 0.62, 交易价值: 0.08, 主要优势: 基础实力",
  "winProbability": 0.62,
  "tradeValue": 0.08,
  "timestamp": 1234567890
}

卖出信号

{
  "signalType": "SELL",
  "strategyId": "策略ID",
  "gameId": "比赛ID",
  "marketId": "市场ID",
  "direction": "YES" | "NO",
  "price": 0.75,
  "quantity": 10.0,
  "totalAmount": 7.5,
  "reason": "止盈卖出,预期收益: 15%",
  "profit": 1.0,
  "profitRate": 0.15,
  "timestamp": 1234567890
}

13.2 算法执行日志

执行日志格式

{
  "timestamp": 1234567890,
  "strategyId": "策略ID",
  "gameId": "比赛ID",
  "step": "数据获取" | "特征提取" | "评分计算" | "信号生成",
  "status": "SUCCESS" | "FAILED" | "SKIPPED",
  "message": "执行信息",
  "data": {} // 相关数据
}

十四、算法验证

14.1 回测验证

回测流程

  1. 使用历史比赛数据
  2. 模拟算法执行过程
  3. 计算信号生成情况
  4. 计算交易结果和盈亏
  5. 评估算法效果

评估指标

  • 信号生成数量
  • 信号准确率(实际获胜 vs 预测获胜)
  • 总盈亏金额
  • 盈亏比率
  • 最大回撤

14.2 实时验证

实时监控

  • 监控算法执行情况
  • 记录信号生成和交易结果
  • 对比预测和实际结果
  • 评估算法实时表现

持续优化

  • 根据实时表现调整参数
  • 优化算法逻辑
  • 提高预测准确性

文档结束