- 后端实现: - 实现 NBA 比赛数据服务,从 Polymarket API 获取数据 - 实现数据库存储和增量拉取逻辑(优先从 DB 获取,数据不足时增量拉取) - 使用 sports_market_types 参数直接筛选 moneyline 类型 - 实现分页拉取逻辑(基于 gameStartTime 和 createdAt) - 移除 nba_markets 相关的外键约束(V12 迁移) - 修复数据拉取逻辑:超过 3 天的数据不拉取 - 前端实现: - 实现策略创建/编辑/列表页面 - 实现交易信号展示页面和统计页面 - 修复重复请求问题(使用 useCallback 包装 fetchGames) - 支持选择单场比赛进行配置 - 使用西8区时间格式化显示 - 数据库: - 创建 NBA 量化交易相关表(V11 迁移) - 移除外键约束(V12 迁移) - 文档: - 添加产品需求文档、技术方案、算法文档等
22 KiB
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.4(PER 权重)
- W2 = 0.4(TS% 权重)
- 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 信号生成条件
买入信号生成条件:
-
获胜概率条件:
- 主队获胜概率 > 阈值(如 0.55)或 < 阈值(如 0.45)
- 如果主队获胜概率 > 0.55,买入主队获胜(YES)
- 如果主队获胜概率 < 0.45,买入主队失败(NO)
-
交易价值条件:
- 交易价值评分 > 用户配置的最小交易价值(如 0.05)
-
价格条件:
- 当前市场价格在合理范围内
- 价格偏差在用户配置的容忍度内
-
时间条件:
- 比赛未结束
- 剩余时间充足(如果用户配置了最小剩余时间)
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 卖出条件
卖出信号生成条件:
-
止盈条件:
- 当前持仓的预期收益达到用户配置的止盈阈值(如 20%)
- 或市场价格达到用户配置的目标价格
-
止损条件:
- 当前持仓的预期亏损达到用户配置的止损阈值(如 -10%)
- 或市场价格跌破用户配置的止损价格
-
概率反转条件:
- 获胜概率发生反转(如从 0.6 降到 0.4)
- 反转幅度超过用户配置的阈值(如 0.15)
-
时间条件:
- 比赛接近结束(剩余时间 < 用户配置的最小剩余时间)
- 或比赛已结束
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 回测验证
回测流程:
- 使用历史比赛数据
- 模拟算法执行过程
- 计算信号生成情况
- 计算交易结果和盈亏
- 评估算法效果
评估指标:
- 信号生成数量
- 信号准确率(实际获胜 vs 预测获胜)
- 总盈亏金额
- 盈亏比率
- 最大回撤
14.2 实时验证
实时监控:
- 监控算法执行情况
- 记录信号生成和交易结果
- 对比预测和实际结果
- 评估算法实时表现
持续优化:
- 根据实时表现调整参数
- 优化算法逻辑
- 提高预测准确性
文档结束