Files
PolyHermes/docs/zh/nba-hybrid-data-source-implementation.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

4.0 KiB
Raw Permalink Blame History

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 调用

// 获取比赛列表(自动匹配市场)
val request = NbaGameListRequest(
    startDate = "2024-12-15",
    endDate = "2024-12-22"
)
val result = nbaGameService.getNbaGames(request)

4.2 返回数据

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 进行市场名称解析