e9e1111df9
- 后端实现: - 实现 NBA 比赛数据服务,从 Polymarket API 获取数据 - 实现数据库存储和增量拉取逻辑(优先从 DB 获取,数据不足时增量拉取) - 使用 sports_market_types 参数直接筛选 moneyline 类型 - 实现分页拉取逻辑(基于 gameStartTime 和 createdAt) - 移除 nba_markets 相关的外键约束(V12 迁移) - 修复数据拉取逻辑:超过 3 天的数据不拉取 - 前端实现: - 实现策略创建/编辑/列表页面 - 实现交易信号展示页面和统计页面 - 修复重复请求问题(使用 useCallback 包装 fetchGames) - 支持选择单场比赛进行配置 - 使用西8区时间格式化显示 - 数据库: - 创建 NBA 量化交易相关表(V11 迁移) - 移除外键约束(V12 迁移) - 文档: - 添加产品需求文档、技术方案、算法文档等
1000 lines
31 KiB
Markdown
1000 lines
31 KiB
Markdown
# NBA 量化交易系统技术方案
|
||
|
||
## 一、概述
|
||
|
||
### 1.1 产品定位
|
||
|
||
本系统是一个基于 NBA 比赛数据的量化交易系统,用户在前端配置量化策略参数,系统后台实时获取 NBA 比赛数据,根据配置的策略参数进行量化分析,自动生成买入/卖出信号,并通过 WebSocket 实时推送给前端展示。
|
||
|
||
### 1.2 产品流程
|
||
|
||
```
|
||
用户在前端配置策略参数
|
||
↓
|
||
后台保存配置并启动量化任务
|
||
↓
|
||
后台实时获取 NBA 比赛数据
|
||
↓
|
||
后台执行量化分析逻辑
|
||
↓
|
||
生成买入/卖出信号
|
||
↓
|
||
通过 WebSocket 推送给前端
|
||
↓
|
||
前端展示交易信号和结果
|
||
```
|
||
|
||
### 1.3 核心功能
|
||
|
||
1. **策略配置管理**:用户在前端配置量化策略参数(如触发条件、买入卖出规则、风险控制参数等)
|
||
2. **数据获取**:后台实时获取 NBA 比赛数据、球队统计、球员统计等
|
||
3. **量化分析**:根据配置的策略参数和实时数据,执行量化分析逻辑
|
||
4. **信号生成**:生成买入/卖出信号,包含市场、方向、价格、数量等信息
|
||
5. **实时推送**:通过 WebSocket 将交易信号实时推送给前端
|
||
6. **结果展示**:前端展示交易信号、执行结果、统计数据等
|
||
|
||
### 1.4 技术栈
|
||
|
||
- **后端框架**: Spring Boot 3.2.0 + Kotlin
|
||
- **HTTP 客户端**: Retrofit 2.9.0 + OkHttp 4.12.0
|
||
- **数据存储**: MySQL 8.2.0(结构化数据)+ Redis(缓存)
|
||
- **爬虫框架**: Jsoup(用于 Basketball Reference)
|
||
- **任务调度**: Spring Scheduler(定时任务)
|
||
- **WebSocket**: Spring WebSocket(实时推送)
|
||
|
||
---
|
||
|
||
## 二、系统架构设计
|
||
|
||
### 2.1 整体架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 前端层 (Frontend Layer) │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 策略配置页面 │ │ 交易信号展示 │ │ 结果统计页面 │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│ HTTP API / WebSocket
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 应用层 (Application Layer) │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 策略配置API │ │ 量化任务API │ │ WebSocket │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 服务层 (Service Layer) │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 策略配置服务 │ │ 量化分析服务 │ │ 数据推送服务 │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ NBA数据服务 │ │ 信号生成服务 │ │ 任务调度服务 │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 数据层 (Data Layer) │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ NBA API │ │ 数据存储 │ │ 缓存服务 │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.2 模块划分
|
||
|
||
#### 2.2.1 前端模块
|
||
|
||
- **策略配置模块**:用户配置量化策略参数
|
||
- **交易信号展示模块**:实时展示买入/卖出信号
|
||
- **结果统计模块**:展示交易结果和统计数据
|
||
|
||
#### 2.2.2 后端模块
|
||
|
||
- **策略配置管理模块**:管理用户配置的策略参数
|
||
- **NBA 数据获取模块**:从 NBA Stats API 和 Basketball Reference 获取数据
|
||
- **量化分析模块**:执行量化分析逻辑,生成交易信号
|
||
- **信号推送模块**:通过 WebSocket 推送交易信号
|
||
- **任务调度模块**:管理量化任务的启动、停止、调度
|
||
|
||
---
|
||
|
||
## 三、产品功能设计
|
||
|
||
### 3.1 策略配置功能
|
||
|
||
#### 3.1.1 配置参数
|
||
|
||
用户在前端可以配置以下参数:
|
||
|
||
**基础配置**:
|
||
- 策略名称:用户自定义策略名称
|
||
- 启用状态:是否启用该策略
|
||
- 关联账户:选择用于交易的账户
|
||
|
||
**触发条件配置**:
|
||
- 比赛筛选:选择关注的比赛(可按球队、日期、重要性等筛选)
|
||
- 数据指标:选择用于分析的指标(如分差、剩余时间、球队实力等)
|
||
- 触发阈值:设置触发买入/卖出的阈值条件
|
||
|
||
**交易规则配置**:
|
||
- 买入规则:配置买入条件、买入金额、买入时机等
|
||
- 卖出规则:配置卖出条件、卖出金额、卖出时机等
|
||
- 价格策略:配置价格计算方式(如固定价格、动态价格等)
|
||
|
||
**风险控制配置**:
|
||
- 最大持仓:单次最大买入金额
|
||
- 最小持仓:单次最小买入金额
|
||
- 每日亏损限制:每日最大亏损金额
|
||
- 每日订单限制:每日最大订单数量
|
||
- 价格容忍度:允许的价格偏差范围
|
||
|
||
**高级配置**:
|
||
- 数据更新频率:NBA 数据更新频率(如 30 秒、1 分钟等)
|
||
- 分析频率:量化分析执行频率
|
||
- 推送设置:是否推送失败订单、推送频率等
|
||
|
||
#### 3.1.2 配置管理
|
||
|
||
- **创建策略**:用户在前端创建新的量化策略配置
|
||
- **编辑策略**:用户可以修改已有策略的配置参数
|
||
- **删除策略**:用户可以删除不需要的策略
|
||
- **启用/禁用策略**:用户可以启用或禁用策略,禁用后停止执行量化分析
|
||
- **策略列表**:展示所有策略配置,支持搜索、筛选、排序
|
||
|
||
### 3.2 量化分析功能
|
||
|
||
#### 3.2.1 数据获取
|
||
|
||
系统后台实时获取以下数据:
|
||
|
||
**比赛数据**:
|
||
- 实时比分和分差
|
||
- 比赛状态(未开始/进行中/已结束)
|
||
- 当前节次和剩余时间
|
||
- Play-by-Play 数据(每个回合的详细记录)
|
||
|
||
**统计数据**:
|
||
- 球队统计数据(进攻效率、防守效率、净效率值等)
|
||
- 球员统计数据(得分、篮板、助攻、真实命中率等)
|
||
- 高级统计数据(PER、BPM、VORP、DRPM 等)
|
||
|
||
**历史数据**:
|
||
- 历史比赛数据
|
||
- 历史对战记录
|
||
- 历史统计数据
|
||
|
||
#### 3.2.2 量化分析逻辑
|
||
|
||
系统根据用户配置的策略参数和实时获取的 NBA 数据,执行量化分析:
|
||
|
||
**核心思想**:
|
||
- 不是简单的条件判断(如"主队落后买入")
|
||
- 而是综合分析两支队伍的实力、状态、对位关系等因素
|
||
- 计算每支队伍的综合评分和获胜概率
|
||
- 评估交易价值和风险
|
||
- 选择最优的交易方向和时机
|
||
|
||
**数据预处理**:
|
||
- 数据清洗和验证
|
||
- 数据标准化和归一化
|
||
- 特征工程(提取关键特征)
|
||
|
||
**综合评分计算**:
|
||
- 计算主队和客队的基础实力评分(净效率值、攻防效率、节奏等)
|
||
- 计算近期状态评分(近期胜率、净效率值变化、势头等)
|
||
- 计算阵容完整度评分(基于缺失球员的VORP)
|
||
- 计算球星状态评分(PER、TS%、健康状况等)
|
||
- 计算环境因素评分(主客场、休息天数、背靠背等)
|
||
- 综合计算主队和客队的综合评分
|
||
|
||
**对位分析**:
|
||
- 分析球星对位优势(防守限制效果、历史对位数据)
|
||
- 分析阵容克制关系(内线、外线、快攻优势)
|
||
- 计算对位综合评分
|
||
|
||
**实时状态分析**(比赛进行中):
|
||
- 分析当前分差和剩余时间
|
||
- 分析势头动量(过去N回合的净胜分)
|
||
- 实时调整综合评分
|
||
|
||
**获胜概率计算**:
|
||
- 基于综合评分计算基础获胜概率
|
||
- 根据对位优势调整概率
|
||
- 根据实时状态调整概率(比赛进行中)
|
||
- 最终得到主队和客队的获胜概率
|
||
|
||
**交易价值计算**:
|
||
- 计算预期收益(基于获胜概率和价格)
|
||
- 计算风险调整收益(考虑不确定性、价格波动、流动性)
|
||
- 计算交易价值评分
|
||
|
||
**策略执行**:
|
||
- 根据配置的触发条件(最小获胜概率差异、最小交易价值等),判断是否满足买入/卖出条件
|
||
- 根据配置的交易规则,计算买入/卖出价格和数量
|
||
- 根据配置的风险控制参数,验证交易是否合规
|
||
|
||
**信号生成**:
|
||
- 生成买入信号:包含市场 ID、方向(YES/NO,由系统自动判断)、价格、数量、原因等
|
||
- 生成卖出信号:包含市场 ID、方向、价格、数量、原因等
|
||
- 信号验证:验证信号的有效性和合规性
|
||
|
||
### 3.3 信号推送功能
|
||
|
||
#### 3.3.1 推送方式
|
||
|
||
系统通过 WebSocket 实时推送交易信号给前端:
|
||
|
||
**推送内容**:
|
||
- 买入信号:市场信息、方向、价格、数量、触发原因、时间戳等
|
||
- 卖出信号:市场信息、方向、价格、数量、触发原因、时间戳等
|
||
- 信号状态:信号生成、信号执行中、信号执行成功、信号执行失败等
|
||
|
||
**推送频率**:
|
||
- 实时推送:信号生成后立即推送
|
||
- 批量推送:多个信号可以批量推送(减少网络开销)
|
||
|
||
#### 3.3.2 订阅管理
|
||
|
||
前端通过 WebSocket 订阅交易信号:
|
||
|
||
**订阅方式**:
|
||
- 订阅所有策略的信号
|
||
- 订阅特定策略的信号
|
||
- 订阅特定市场的信号
|
||
|
||
**订阅管理**:
|
||
- 前端可以动态订阅/取消订阅
|
||
- 支持多个前端客户端同时订阅
|
||
- 连接断开后自动重连和恢复订阅
|
||
|
||
### 3.4 结果展示功能
|
||
|
||
#### 3.4.1 实时信号展示
|
||
|
||
前端实时展示交易信号:
|
||
|
||
**信号列表**:
|
||
- 展示所有生成的交易信号
|
||
- 支持按策略、市场、时间等筛选
|
||
- 支持按时间、价格等排序
|
||
|
||
**信号详情**:
|
||
- 展示信号的详细信息(市场、方向、价格、数量、原因等)
|
||
- 展示信号的执行状态和结果
|
||
- 展示信号的历史记录
|
||
|
||
#### 3.4.2 统计展示
|
||
|
||
前端展示交易统计:
|
||
|
||
**策略统计**:
|
||
- 每个策略的信号数量
|
||
- 每个策略的成功率
|
||
- 每个策略的盈亏情况
|
||
|
||
**总体统计**:
|
||
- 总信号数量
|
||
- 总成功率
|
||
- 总盈亏情况
|
||
- 每日/每周/每月统计
|
||
|
||
---
|
||
|
||
## 四、数据源集成方案
|
||
|
||
### 4.1 NBA Stats API 集成
|
||
|
||
#### 4.1.1 API 基础信息
|
||
|
||
- **Base URL**: `https://stats.nba.com/stats/`
|
||
- **认证**: 无需认证,但需要设置正确的请求头
|
||
- **请求限制**: 建议 < 10 请求/秒
|
||
- **数据格式**: JSON
|
||
|
||
#### 4.1.2 请求头配置
|
||
|
||
需要设置以下请求头:
|
||
- User-Agent: 浏览器标识
|
||
- Referer: 来源页面
|
||
- Accept: 接受 JSON 格式
|
||
- Accept-Language: 语言设置
|
||
|
||
#### 4.1.3 主要接口
|
||
|
||
**比赛数据接口**:
|
||
- 赛程和比分接口:获取指定日期的所有比赛
|
||
- 比赛统计接口:获取比赛的详细统计数据
|
||
- Play-by-Play 接口:获取比赛的回合数据
|
||
|
||
**统计数据接口**:
|
||
- 球队统计面板接口:获取球队的统计数据
|
||
- 球队关键时刻数据接口:获取球队关键时刻的表现
|
||
- 球员统计面板接口:获取球员的统计数据
|
||
- 球员单场数据接口:获取球员的单场数据
|
||
|
||
#### 4.1.4 数据获取策略
|
||
|
||
**实时数据获取**:
|
||
- 比赛进行时:每 30 秒轮询一次比赛数据
|
||
- 比赛未开始:每 5 分钟轮询一次(检查比赛状态)
|
||
- 比赛结束:每 10 分钟轮询一次(确保数据完整)
|
||
|
||
**统计数据获取**:
|
||
- 每天更新一次球队和球员统计数据
|
||
- 比赛结束后立即更新相关统计数据
|
||
|
||
### 4.2 Basketball Reference 爬虫集成
|
||
|
||
#### 4.2.1 数据来源
|
||
|
||
- **Base URL**: `https://www.basketball-reference.com`
|
||
- **数据格式**: HTML 页面
|
||
- **优势**: 提供高级统计数据(PER、BPM、VORP、DRPM 等)
|
||
|
||
#### 4.2.2 爬取策略
|
||
|
||
**请求频率控制**:
|
||
- 请求间隔:至少 1 秒(避免反爬虫)
|
||
- 请求队列:使用队列管理请求,控制并发数
|
||
|
||
**数据爬取**:
|
||
- 球员高级统计数据:从球员页面爬取 PER、BPM、VORP、DRPM 等
|
||
- 球队高级统计数据:从球队页面爬取相关数据
|
||
- 阵容统计数据:从阵容页面爬取阵容组合数据
|
||
|
||
**数据缓存**:
|
||
- 爬取的数据存储到数据库,避免重复请求
|
||
- 高级统计数据更新频率较低,可以缓存较长时间
|
||
|
||
### 4.3 数据存储方案
|
||
|
||
#### 4.3.1 数据库设计
|
||
|
||
**策略配置表**:
|
||
- 存储用户配置的策略参数
|
||
- 包含策略名称、配置参数、启用状态等字段
|
||
|
||
**比赛数据表**:
|
||
- 存储比赛基本信息(比赛 ID、日期、主客场、比分等)
|
||
- 存储比赛状态(未开始/进行中/已结束)
|
||
- 存储当前节次和剩余时间
|
||
|
||
**统计数据表**:
|
||
- 球队统计表:存储球队的统计数据
|
||
- 球员统计表:存储球员的统计数据
|
||
- Play-by-Play 表:存储比赛的回合数据
|
||
|
||
**交易信号表**:
|
||
- 存储生成的交易信号
|
||
- 包含市场信息、方向、价格、数量、状态等字段
|
||
- 包含信号的执行结果和统计信息
|
||
|
||
#### 4.3.2 缓存策略
|
||
|
||
**Redis 缓存**:
|
||
- 比赛数据缓存:缓存 5 分钟(实时数据)
|
||
- 统计数据缓存:缓存 1 小时(统计数据更新较慢)
|
||
- 高级统计缓存:缓存 24 小时(Basketball Reference 更新较慢)
|
||
|
||
**缓存更新**:
|
||
- 数据更新时同步更新缓存
|
||
- 缓存过期后自动从数据库或 API 重新获取
|
||
|
||
---
|
||
|
||
## 五、实时性保证策略
|
||
|
||
### 5.1 数据实时性要求
|
||
|
||
不同数据类型的实时性要求:
|
||
|
||
| 数据类型 | 实时性要求 | 更新频率 | 延迟容忍度 |
|
||
|---------|-----------|---------|-----------|
|
||
| **比赛比分** | 极高 | 30秒 | < 1分钟 |
|
||
| **Play-by-Play** | 极高 | 30秒 | < 1分钟 |
|
||
| **比赛状态** | 高 | 30秒 | < 2分钟 |
|
||
| **统计数据** | 中 | 5分钟 | < 10分钟 |
|
||
| **历史数据** | 低 | 每天 | 无要求 |
|
||
|
||
### 5.2 实时性保证方案
|
||
|
||
#### 5.2.1 多层级数据更新策略
|
||
|
||
**第一层:数据源层**
|
||
- HTTP 轮询:从 NBA Stats API 轮询获取数据
|
||
- 第三方 WebSocket API:如果可用,使用 WebSocket 实时接收数据
|
||
- 数据缓存:使用 Redis 缓存数据,减少 API 调用
|
||
|
||
**第二层:数据处理层**
|
||
- 数据变化检测:只处理变化的数据,减少不必要的处理
|
||
- 数据验证:验证数据的有效性和完整性
|
||
- 增量更新:只更新变化的数据,提高效率
|
||
|
||
**第三层:数据推送层**
|
||
- WebSocket 推送:通过 WebSocket 实时推送数据给前端
|
||
- 订阅管理:管理前端的订阅,只推送订阅的数据
|
||
- 批量推送:多个数据可以批量推送,减少网络开销
|
||
|
||
**第四层:前端展示层**
|
||
- 实时更新:前端实时接收和展示数据
|
||
- 降级轮询:WebSocket 失败时降级到 HTTP 轮询
|
||
- 数据缓存:前端缓存数据,减少重复请求
|
||
|
||
#### 5.2.2 数据变化检测机制
|
||
|
||
**数据快照比较**:
|
||
- 保存上次的数据快照
|
||
- 比较新数据和快照,只处理变化的数据
|
||
- 更新快照,用于下次比较
|
||
|
||
**增量更新**:
|
||
- 只保存和推送新增或变化的数据
|
||
- 减少数据库写入和网络传输
|
||
- 提高系统性能
|
||
|
||
#### 5.2.3 动态轮询频率调整
|
||
|
||
根据比赛状态动态调整轮询频率:
|
||
|
||
- **比赛未开始**:5 分钟轮询一次
|
||
- **比赛进行中**:30 秒轮询一次
|
||
- **最后 5 分钟**:15 秒轮询一次(关键时刻)
|
||
- **加时赛**:20 秒轮询一次
|
||
- **比赛结束**:10 分钟轮询一次(确保数据完整)
|
||
|
||
#### 5.2.4 WebSocket 连接管理
|
||
|
||
**连接保活**:
|
||
- 定期发送心跳消息,保持连接活跃
|
||
- 检测连接状态,及时处理断开情况
|
||
|
||
**自动重连**:
|
||
- 连接断开后自动重连
|
||
- 使用指数退避策略,避免频繁重连
|
||
- 重连后恢复订阅,确保数据不丢失
|
||
|
||
**连接监控**:
|
||
- 监控连接健康状态
|
||
- 记录连接统计信息
|
||
- 异常情况告警
|
||
|
||
#### 5.2.5 前端降级策略
|
||
|
||
**WebSocket 失败降级**:
|
||
- WebSocket 连接失败时,自动降级到 HTTP 轮询
|
||
- 前端定期轮询获取数据,确保数据不中断
|
||
- WebSocket 恢复后,自动切换回 WebSocket
|
||
|
||
**数据缓存**:
|
||
- 前端缓存最近的数据
|
||
- 网络中断时,使用缓存数据展示
|
||
- 网络恢复后,同步最新数据
|
||
|
||
### 5.3 实时性监控
|
||
|
||
#### 5.3.1 数据延迟监控
|
||
|
||
**延迟统计**:
|
||
- 记录数据从获取到推送的延迟时间
|
||
- 统计平均延迟、最大延迟等指标
|
||
- 延迟超过阈值时触发告警
|
||
|
||
**性能指标**:
|
||
- API 调用响应时间
|
||
- 数据处理时间
|
||
- WebSocket 推送延迟
|
||
|
||
#### 5.3.2 告警机制
|
||
|
||
**告警条件**:
|
||
- 数据延迟超过阈值(如 1 分钟)
|
||
- API 调用失败率超过阈值
|
||
- WebSocket 连接断开
|
||
- 数据更新异常
|
||
|
||
**告警方式**:
|
||
- 日志记录
|
||
- 系统通知
|
||
- 邮件/短信通知(可选)
|
||
|
||
---
|
||
|
||
## 六、量化分析逻辑设计
|
||
|
||
### 6.1 分析流程
|
||
|
||
#### 6.1.1 数据准备
|
||
|
||
**数据获取**:
|
||
- 获取实时比赛数据(比分、分差、剩余时间等)
|
||
- 获取统计数据(球队统计、球员统计等)
|
||
- 获取历史数据(历史比赛、历史统计等)
|
||
|
||
**数据预处理**:
|
||
- 数据清洗:去除异常值和缺失值
|
||
- 数据验证:验证数据的有效性和完整性
|
||
- 数据标准化:将数据标准化为统一的格式
|
||
|
||
#### 6.1.2 特征提取
|
||
|
||
**基础特征**:
|
||
- 当前分差
|
||
- 剩余时间
|
||
- 当前节次
|
||
- 比赛状态
|
||
|
||
**统计特征**:
|
||
- 球队实力指标(净效率值、攻防效率等)
|
||
- 球员表现指标(PER、TS%、USG% 等)
|
||
- 历史对战数据
|
||
|
||
**衍生特征**:
|
||
- 分差/剩余时间比
|
||
- 球队实力差
|
||
- 势头动量(过去 N 回合的净胜分)
|
||
- 球星爆发因子(本场表现 vs 赛季平均)
|
||
|
||
#### 6.1.3 策略执行
|
||
|
||
**综合评分和对位分析**:
|
||
- 计算主队和客队的综合评分(基础实力、近期状态、阵容完整度、球星状态、环境因素)
|
||
- 分析对位优势(球星对位、阵容克制)
|
||
- 计算实时状态调整(分差、势头动量,仅比赛进行中)
|
||
|
||
**获胜概率和交易价值计算**:
|
||
- 基于综合评分计算基础获胜概率
|
||
- 根据对位优势和实时状态调整概率
|
||
- 计算预期收益和风险调整收益
|
||
- 计算交易价值评分
|
||
|
||
**触发条件判断**:
|
||
- 判断获胜概率差异是否达到阈值(如主队获胜概率 > 0.55 或 < 0.45)
|
||
- 判断交易价值评分是否达到阈值(如 > 0.05)
|
||
- 判断其他触发条件(剩余时间、价格等)
|
||
|
||
**交易规则计算**:
|
||
- 根据获胜概率确定买入方向(YES 或 NO)
|
||
- 根据配置的交易规则,计算买入/卖出价格(固定价格/市场价格/动态价格)
|
||
- 根据配置的交易规则,计算买入/卖出数量(固定金额/按比例/动态计算)
|
||
- 根据配置的风险控制参数,验证交易是否合规
|
||
|
||
**信号生成**:
|
||
- 生成买入信号:包含市场 ID、方向(由系统自动判断)、价格、数量、原因(包含综合评分、获胜概率、交易价值等)等
|
||
- 生成卖出信号:包含市场 ID、方向、价格、数量、原因等
|
||
- 信号验证:验证信号的有效性和合规性
|
||
|
||
### 6.2 策略配置映射
|
||
|
||
#### 6.2.1 配置参数到分析逻辑的映射
|
||
|
||
**触发条件配置**:
|
||
- 比赛筛选 → 数据过滤逻辑
|
||
- 数据指标 → 特征提取逻辑
|
||
- 触发阈值 → 条件判断逻辑
|
||
|
||
**交易规则配置**:
|
||
- 买入规则 → 买入信号生成逻辑
|
||
- 卖出规则 → 卖出信号生成逻辑
|
||
- 价格策略 → 价格计算逻辑
|
||
|
||
**风险控制配置**:
|
||
- 最大/最小持仓 → 数量限制逻辑
|
||
- 每日亏损限制 → 风险检查逻辑
|
||
- 每日订单限制 → 订单计数逻辑
|
||
- 价格容忍度 → 价格验证逻辑
|
||
|
||
### 6.3 信号生成规则
|
||
|
||
#### 6.3.1 买入信号生成
|
||
|
||
**触发条件**:
|
||
- 满足配置的买入触发条件
|
||
- 通过风险控制检查
|
||
- 市场状态正常(可交易)
|
||
|
||
**信号内容**:
|
||
- 市场 ID:目标市场的唯一标识
|
||
- 方向:YES 或 NO
|
||
- 价格:买入价格(根据价格策略计算)
|
||
- 数量:买入数量(根据交易规则计算)
|
||
- 原因:触发买入的原因(如"分差达到阈值")
|
||
- 时间戳:信号生成时间
|
||
|
||
#### 6.3.2 卖出信号生成
|
||
|
||
**触发条件**:
|
||
- 满足配置的卖出触发条件
|
||
- 通过风险控制检查
|
||
- 市场状态正常(可交易)
|
||
|
||
**信号内容**:
|
||
- 市场 ID:目标市场的唯一标识
|
||
- 方向:YES 或 NO
|
||
- 价格:卖出价格(根据价格策略计算)
|
||
- 数量:卖出数量(根据交易规则计算)
|
||
- 原因:触发卖出的原因(如"达到止盈条件")
|
||
- 时间戳:信号生成时间
|
||
|
||
---
|
||
|
||
## 七、WebSocket 推送方案
|
||
|
||
### 7.1 推送架构
|
||
|
||
#### 7.1.1 推送流程
|
||
|
||
```
|
||
量化分析服务生成交易信号
|
||
↓
|
||
信号推送服务接收信号
|
||
↓
|
||
检查订阅关系(哪些前端订阅了该策略)
|
||
↓
|
||
通过 WebSocket 推送给订阅的前端
|
||
↓
|
||
前端接收并展示信号
|
||
```
|
||
|
||
#### 7.1.2 订阅管理
|
||
|
||
**订阅方式**:
|
||
- 前端通过 WebSocket 发送订阅消息
|
||
- 支持订阅所有策略的信号
|
||
- 支持订阅特定策略的信号
|
||
- 支持订阅特定市场的信号
|
||
|
||
**订阅存储**:
|
||
- 后端维护订阅关系(策略 ID → 前端会话列表)
|
||
- 支持多个前端同时订阅同一策略
|
||
- 支持前端动态订阅/取消订阅
|
||
|
||
**订阅恢复**:
|
||
- 前端连接断开后,自动清理订阅关系
|
||
- 前端重连后,可以重新订阅
|
||
|
||
### 7.2 推送消息格式
|
||
|
||
#### 7.2.1 买入信号消息
|
||
|
||
包含以下字段:
|
||
- 消息类型:买入信号
|
||
- 策略 ID:生成信号的策略标识
|
||
- 市场 ID:目标市场标识
|
||
- 方向:YES 或 NO
|
||
- 价格:买入价格
|
||
- 数量:买入数量
|
||
- 原因:触发原因
|
||
- 时间戳:信号生成时间
|
||
|
||
#### 7.2.2 卖出信号消息
|
||
|
||
包含以下字段:
|
||
- 消息类型:卖出信号
|
||
- 策略 ID:生成信号的策略标识
|
||
- 市场 ID:目标市场标识
|
||
- 方向:YES 或 NO
|
||
- 价格:卖出价格
|
||
- 数量:卖出数量
|
||
- 原因:触发原因
|
||
- 时间戳:信号生成时间
|
||
|
||
#### 7.2.3 信号状态更新消息
|
||
|
||
包含以下字段:
|
||
- 消息类型:状态更新
|
||
- 信号 ID:信号的唯一标识
|
||
- 状态:执行中/执行成功/执行失败
|
||
- 结果:执行结果详情
|
||
- 时间戳:状态更新时间
|
||
|
||
### 7.3 推送优化
|
||
|
||
#### 7.3.1 批量推送
|
||
|
||
**批量策略**:
|
||
- 多个信号可以批量推送,减少网络开销
|
||
- 批量大小可配置(如每批 10 个信号)
|
||
- 批量推送间隔可配置(如每 1 秒推送一次)
|
||
|
||
**批量格式**:
|
||
- 单个消息包含多个信号
|
||
- 前端解析后分别处理每个信号
|
||
|
||
#### 7.3.2 推送频率控制
|
||
|
||
**频率限制**:
|
||
- 每个策略的信号推送频率可配置
|
||
- 避免过于频繁的推送,影响前端性能
|
||
- 支持优先级:重要信号立即推送,普通信号批量推送
|
||
|
||
#### 7.3.3 推送失败处理
|
||
|
||
**失败重试**:
|
||
- 推送失败时,记录失败信息
|
||
- 支持重试机制(如重试 3 次)
|
||
- 重试失败后,记录到数据库,后续可以查询
|
||
|
||
**降级策略**:
|
||
- WebSocket 推送失败时,可以降级到 HTTP 轮询
|
||
- 前端定期轮询获取信号,确保不丢失
|
||
|
||
---
|
||
|
||
## 八、错误处理和容错机制
|
||
|
||
### 8.1 数据获取错误处理
|
||
|
||
#### 8.1.1 API 调用失败
|
||
|
||
**重试策略**:
|
||
- API 调用失败时,自动重试(如重试 3 次)
|
||
- 使用指数退避策略,避免频繁重试
|
||
- 重试失败后,记录错误日志
|
||
|
||
**降级策略**:
|
||
- API 调用失败时,使用缓存数据
|
||
- 缓存数据过期时,使用数据库数据
|
||
- 所有数据源都失败时,记录错误并告警
|
||
|
||
#### 8.1.2 数据解析错误
|
||
|
||
**错误处理**:
|
||
- 数据格式异常时,记录错误日志
|
||
- 跳过异常数据,继续处理其他数据
|
||
- 数据缺失时,使用默认值或历史数据
|
||
|
||
### 8.2 量化分析错误处理
|
||
|
||
#### 8.2.1 分析逻辑错误
|
||
|
||
**错误捕获**:
|
||
- 分析逻辑执行时,捕获所有异常
|
||
- 记录错误日志,包含错误详情和上下文
|
||
- 错误不影响其他策略的执行
|
||
|
||
**错误恢复**:
|
||
- 错误发生后,跳过本次分析
|
||
- 等待下次分析周期,重新执行
|
||
- 连续错误时,触发告警
|
||
|
||
#### 8.2.2 信号生成错误
|
||
|
||
**错误处理**:
|
||
- 信号生成失败时,记录错误日志
|
||
- 不生成无效信号,避免误导用户
|
||
- 错误原因推送给前端(可选)
|
||
|
||
### 8.3 推送错误处理
|
||
|
||
#### 8.3.1 WebSocket 推送失败
|
||
|
||
**失败处理**:
|
||
- 推送失败时,记录失败信息
|
||
- 支持重试机制(如重试 3 次)
|
||
- 重试失败后,记录到数据库
|
||
|
||
**降级策略**:
|
||
- WebSocket 推送失败时,可以降级到 HTTP 轮询
|
||
- 前端定期轮询获取信号,确保不丢失
|
||
|
||
#### 8.3.2 前端连接断开
|
||
|
||
**连接管理**:
|
||
- 检测前端连接断开,清理订阅关系
|
||
- 前端重连后,可以重新订阅
|
||
- 连接断开期间,信号暂存到数据库
|
||
|
||
---
|
||
|
||
## 九、性能优化方案
|
||
|
||
### 9.1 数据获取优化
|
||
|
||
#### 9.1.1 请求频率控制
|
||
|
||
**频率限制**:
|
||
- 控制 API 请求频率,避免触发速率限制
|
||
- 使用请求队列,管理并发请求
|
||
- 请求失败时,使用指数退避策略
|
||
|
||
#### 9.1.2 数据缓存
|
||
|
||
**缓存策略**:
|
||
- 实时数据缓存 5 分钟
|
||
- 统计数据缓存 1 小时
|
||
- 高级统计缓存 24 小时
|
||
|
||
**缓存更新**:
|
||
- 数据更新时同步更新缓存
|
||
- 缓存过期后自动刷新
|
||
|
||
### 9.2 量化分析优化
|
||
|
||
#### 9.2.1 增量分析
|
||
|
||
**变化检测**:
|
||
- 只分析变化的数据,减少不必要的计算
|
||
- 使用数据快照比较,检测数据变化
|
||
- 只处理变化的数据,提高分析效率
|
||
|
||
#### 9.2.2 并行分析
|
||
|
||
**并行策略**:
|
||
- 多个策略可以并行分析
|
||
- 使用线程池管理分析任务
|
||
- 避免资源竞争,确保分析准确性
|
||
|
||
### 9.3 推送优化
|
||
|
||
#### 9.3.1 批量推送
|
||
|
||
**批量策略**:
|
||
- 多个信号批量推送,减少网络开销
|
||
- 批量大小和间隔可配置
|
||
- 重要信号可以立即推送
|
||
|
||
#### 9.3.2 推送频率控制
|
||
|
||
**频率限制**:
|
||
- 控制推送频率,避免前端性能问题
|
||
- 支持优先级:重要信号立即推送
|
||
- 普通信号批量推送
|
||
|
||
---
|
||
|
||
## 十、监控和日志
|
||
|
||
### 10.1 系统监控
|
||
|
||
#### 10.1.1 性能监控
|
||
|
||
**监控指标**:
|
||
- API 调用响应时间
|
||
- 数据处理时间
|
||
- WebSocket 推送延迟
|
||
- 系统资源使用率(CPU、内存等)
|
||
|
||
**监控方式**:
|
||
- 定期记录性能指标
|
||
- 性能指标超过阈值时触发告警
|
||
- 提供性能统计报表
|
||
|
||
#### 10.1.2 业务监控
|
||
|
||
**监控指标**:
|
||
- 策略执行次数
|
||
- 信号生成数量
|
||
- 信号推送成功率
|
||
- 数据更新延迟
|
||
|
||
**监控方式**:
|
||
- 记录业务指标到数据库
|
||
- 提供业务统计报表
|
||
- 异常情况触发告警
|
||
|
||
### 10.2 日志管理
|
||
|
||
#### 10.2.1 日志级别
|
||
|
||
**日志分类**:
|
||
- 错误日志:记录系统错误和异常
|
||
- 警告日志:记录警告信息
|
||
- 信息日志:记录关键操作信息
|
||
- 调试日志:记录详细调试信息
|
||
|
||
#### 10.2.2 日志内容
|
||
|
||
**关键操作日志**:
|
||
- 策略配置变更
|
||
- 量化分析执行
|
||
- 信号生成和推送
|
||
- API 调用和错误
|
||
|
||
**日志格式**:
|
||
- 统一日志格式,便于解析和分析
|
||
- 包含时间戳、日志级别、模块、消息等字段
|
||
- 支持结构化日志(JSON 格式)
|
||
|
||
---
|
||
|
||
## 十一、实施步骤
|
||
|
||
### 11.1 第一阶段:基础功能开发(2-3 周)
|
||
|
||
**任务清单**:
|
||
- 完成策略配置管理功能(前端配置页面 + 后端 API)
|
||
- 完成 NBA 数据获取功能(API 集成 + 数据存储)
|
||
- 完成基础量化分析功能(简单策略逻辑)
|
||
- 完成信号推送功能(WebSocket 推送)
|
||
|
||
### 11.2 第二阶段:量化分析完善(2-3 周)
|
||
|
||
**任务清单**:
|
||
- 完善量化分析逻辑(支持复杂策略)
|
||
- 完善特征提取和数据处理
|
||
- 完善信号生成和验证
|
||
- 完善错误处理和容错机制
|
||
|
||
### 11.3 第三阶段:实时性优化(1-2 周)
|
||
|
||
**任务清单**:
|
||
- 优化数据获取频率和策略
|
||
- 优化 WebSocket 推送机制
|
||
- 实现数据变化检测和增量更新
|
||
- 实现前端降级策略
|
||
|
||
### 11.4 第四阶段:性能优化和监控(1-2 周)
|
||
|
||
**任务清单**:
|
||
- 性能优化(缓存、并行处理等)
|
||
- 系统监控和日志完善
|
||
- 压力测试和性能调优
|
||
- 文档完善
|
||
|
||
---
|
||
|
||
## 十二、注意事项
|
||
|
||
### 12.1 API 限制
|
||
|
||
- **NBA Stats API**: 建议请求频率 < 10 请求/秒
|
||
- **Basketball Reference**: 建议请求频率 < 1 请求/秒
|
||
- 需要设置正确的请求头,避免被拒绝
|
||
|
||
### 12.2 数据质量
|
||
|
||
- API 返回的数据格式可能不一致,需要做好异常处理
|
||
- Basketball Reference 的 HTML 结构可能变化,需要定期检查
|
||
- 需要验证数据的合理性(如得分不超过 200 分)
|
||
|
||
### 12.3 法律合规
|
||
|
||
- 遵守 NBA Stats API 的使用条款
|
||
- 遵守 Basketball Reference 的爬虫协议(robots.txt)
|
||
- 不要过度请求,避免对服务器造成负担
|
||
|
||
### 12.4 风险提示
|
||
|
||
- 量化交易存在风险,需要做好风险控制
|
||
- 信号仅供参考,不构成投资建议
|
||
- 需要明确告知用户风险和使用条款
|
||
|
||
---
|
||
|
||
## 十三、扩展建议
|
||
|
||
### 13.1 功能扩展
|
||
|
||
**策略模板**:
|
||
- 提供预定义的策略模板
|
||
- 用户可以基于模板快速创建策略
|
||
- 支持策略模板的导入和导出
|
||
|
||
**回测功能**:
|
||
- 支持历史数据回测
|
||
- 评估策略的历史表现
|
||
- 优化策略参数
|
||
|
||
**多账户支持**:
|
||
- 支持多个交易账户
|
||
- 每个账户可以配置不同的策略
|
||
- 统一管理和监控
|
||
|
||
### 13.2 技术扩展
|
||
|
||
**机器学习集成**:
|
||
- 使用机器学习模型优化策略
|
||
- 自动学习和优化参数
|
||
- 提高信号准确性
|
||
|
||
**多数据源整合**:
|
||
- 整合多个数据源(如 ESPN、Sportradar 等)
|
||
- 提高数据完整性和准确性
|
||
- 降低对单一数据源的依赖
|
||
|
||
**分布式部署**:
|
||
- 支持分布式部署,提高系统性能
|
||
- 支持负载均衡和容错
|
||
- 支持水平扩展
|