- 后端实现: - 实现 NBA 比赛数据服务,从 Polymarket API 获取数据 - 实现数据库存储和增量拉取逻辑(优先从 DB 获取,数据不足时增量拉取) - 使用 sports_market_types 参数直接筛选 moneyline 类型 - 实现分页拉取逻辑(基于 gameStartTime 和 createdAt) - 移除 nba_markets 相关的外键约束(V12 迁移) - 修复数据拉取逻辑:超过 3 天的数据不拉取 - 前端实现: - 实现策略创建/编辑/列表页面 - 实现交易信号展示页面和统计页面 - 修复重复请求问题(使用 useCallback 包装 fetchGames) - 支持选择单场比赛进行配置 - 使用西8区时间格式化显示 - 数据库: - 创建 NBA 量化交易相关表(V11 迁移) - 移除外键约束(V12 迁移) - 文档: - 添加产品需求文档、技术方案、算法文档等
151 lines
4.0 KiB
Markdown
151 lines
4.0 KiB
Markdown
# NBA 比赛数据获取实现
|
||
|
||
## 一、概述
|
||
|
||
本系统从 NBA Stats API 实时获取 NBA 比赛数据:
|
||
- **数据源**:NBA Stats API(官方数据源,实时、准确、完整)
|
||
- **不依赖数据库**:所有数据从 API 实时获取
|
||
|
||
## 二、实现架构
|
||
|
||
### 2.1 数据流程
|
||
|
||
```
|
||
1. 从 NBA Stats API 获取比赛列表(实时)
|
||
↓
|
||
2. 解析 API 响应,转换为 DTO
|
||
↓
|
||
3. 返回比赛数据给前端
|
||
```
|
||
|
||
### 2.2 关于 Polymarket 市场匹配
|
||
|
||
**当前实现**:
|
||
- 不进行市场匹配(因为 Polymarket API 限制)
|
||
- 比赛数据中的 `polymarketMarketId` 字段为 `null`
|
||
|
||
**未来扩展**:
|
||
- 如果将来有办法获取 condition_ids,可以从 Polymarket API 实时获取市场信息
|
||
- 已保留 `NbaMarketNameParser` 工具类,可用于市场名称解析
|
||
|
||
### 2.2 核心组件
|
||
|
||
#### 1. NbaGameService
|
||
- **功能**:从 NBA Stats API 实时获取比赛数据
|
||
- **数据源**:NBA Stats API(官方数据源)
|
||
- **特点**:
|
||
- 实时获取,不依赖数据库
|
||
- 支持日期范围查询
|
||
- 支持按状态过滤
|
||
|
||
#### 2. NbaMarketNameParser(保留,供将来使用)
|
||
- **功能**:解析 Polymarket 市场名称,提取球队和日期信息
|
||
- **支持格式**:
|
||
- "Team1 vs Team2"
|
||
- "Team1 @ Team2"
|
||
- "Will Team1 beat Team2"
|
||
- "Team1 win"
|
||
- **日期格式**:
|
||
- "Dec 15, 2024"
|
||
- "2024-12-15"
|
||
- "12/15/2024"
|
||
- **说明**:当前未使用,保留以备将来扩展
|
||
|
||
## 三、实现细节
|
||
|
||
### 3.1 比赛数据获取
|
||
|
||
**获取流程**:
|
||
1. 根据日期范围,每天调用一次 NBA Stats API
|
||
2. 解析 Scoreboard 响应,提取比赛信息
|
||
3. 组合 GameHeader 和 LineScore 数据
|
||
4. 转换为 NbaGameDto 返回
|
||
|
||
**数据字段**:
|
||
- 比赛基本信息(球队、日期、时间)
|
||
- 实时比分和状态
|
||
- 比赛节次和剩余时间
|
||
- 球队统计信息
|
||
|
||
### 3.2 关于市场匹配(未来扩展)
|
||
|
||
**当前状态**:
|
||
- 不进行市场匹配
|
||
- `polymarketMarketId` 字段为 `null`
|
||
|
||
**未来扩展方案**:
|
||
如果将来需要匹配市场,可以考虑:
|
||
1. 从其他来源获取 condition_ids(如爬取、手动维护等)
|
||
2. 使用 Polymarket API 实时查询这些市场
|
||
3. 使用 `NbaMarketNameParser` 解析市场名称并匹配
|
||
|
||
### 3.3 数据返回
|
||
|
||
**NbaGameDto** 包含:
|
||
- 比赛基本信息(从 NBA Stats API)
|
||
- `polymarketMarketId`:当前为 `null`(未来可扩展)
|
||
|
||
## 四、使用方式
|
||
|
||
### 4.1 API 调用
|
||
|
||
```kotlin
|
||
// 获取比赛列表(自动匹配市场)
|
||
val request = NbaGameListRequest(
|
||
startDate = "2024-12-15",
|
||
endDate = "2024-12-22"
|
||
)
|
||
val result = nbaGameService.getNbaGames(request)
|
||
```
|
||
|
||
### 4.2 返回数据
|
||
|
||
```kotlin
|
||
data class NbaGameDto(
|
||
val nbaGameId: String?,
|
||
val homeTeam: String,
|
||
val awayTeam: String,
|
||
val gameDate: LocalDate,
|
||
val gameStatus: String,
|
||
val homeScore: Int,
|
||
val awayScore: Int,
|
||
val polymarketMarketId: String? // 匹配的市场 ID
|
||
)
|
||
```
|
||
|
||
## 五、优势
|
||
|
||
1. **数据完整**:从 NBA Stats API 获取完整的比赛数据
|
||
2. **实时更新**:比赛数据实时获取,不依赖数据库
|
||
3. **简单高效**:直接调用 API,无需维护数据库
|
||
4. **官方数据源**:数据准确可靠
|
||
|
||
## 六、注意事项
|
||
|
||
1. **API 限制**:
|
||
- NBA Stats API 需要设置正确的请求头
|
||
- 建议控制请求频率(< 10 请求/秒)
|
||
|
||
2. **市场匹配**:
|
||
- 当前不进行市场匹配
|
||
- 如果需要匹配,需要解决 Polymarket API 的限制(需要知道 condition_ids)
|
||
|
||
3. **性能考虑**:
|
||
- 日期范围查询会多次调用 API(每天一次)
|
||
- 建议合理设置日期范围,避免查询过长的时间段
|
||
|
||
## 七、后续优化
|
||
|
||
1. **缓存机制**:
|
||
- 缓存 API 响应,减少重复请求
|
||
- 设置合理的缓存时间(如 30 秒)
|
||
|
||
2. **错误处理**:
|
||
- 实现重试机制(指数退避)
|
||
- 处理 API 临时不可用的情况
|
||
|
||
3. **市场匹配(可选)**:
|
||
- 如果将来有办法获取 condition_ids,可以实现市场匹配
|
||
- 使用 `NbaMarketNameParser` 进行市场名称解析
|
||
|