# OKX 历史 K 线数据调研与回测数据采集方案

## 📊 OKX 各周期数据可获取性分析

### OKX API 说明

OKX 提供 REST API 获取历史 K 线数据：
- **端点**: `GET /api/v5/market/candles`
- **支持周期**: 1m, 5m, 15m, 30m, 1H, 2H, 4H, 6H, 12H, 1D, 2D, 3D, 1W, 1M
- **单次限制**: 最多 100 条
- **分页方式**: 使用 `before` 和 `after` 参数（毫秒时间戳）
- **速率限制**: 20 次/秒（公共端点）

### 各周期最早可获取数据（基于 OKX 官方数据）

| 品种类型 | 品种示例 | 上市时间 | 1m 最早 | 1H 最早 | 1D 最早 |
|----------|----------|----------|---------|---------|---------|
| **BTC 永续** | BTC-USDT-SWAP | 2021-01 | 2021-01 | 2021-01 | 2021-01 |
| **ETH 永续** | ETH-USDT-SWAP | 2021-01 | 2021-01 | 2021-01 | 2021-01 |
| **BTC 现货** | BTC-USDT | 2019-12 | 2019-12 | 2019-12 | 2019-12 |
| **ETH 现货** | ETH-USDT | 2019-12 | 2019-12 | 2019-12 | 2019-12 |
| **主流币永续** | SOL-USDT-SWAP | 2021-03 | 2021-03 | 2021-03 | 2021-03 |

> 注：OKX 合约数据从 2021 年初开始，现货数据从 2019 年底开始。实际可获取条数取决于品种上市时间。

### 理论最大可获取条数估算

以 BTC-USDT-SWAP（2021-01 上市）为例，截至 2026-04-01：

| 周期 | 时间跨度 | 理论最大条数 | 实际可获取 |
|------|----------|--------------|------------|
| 1m   | ~1900 天 | ~2,736,000 条 | ~270 万条 |
| 5m   | ~1900 天 | ~547,200 条 | ~54 万条 |
| 15m  | ~1900 天 | ~182,400 条 | ~18 万条 |
| 1H   | ~1900 天 | ~45,600 条 | ~4.5 万条 |
| 4H   | ~1900 天 | ~11,400 条 | ~1.1 万条 |
| 1D   | ~1900 天 | ~1,900 条 | ~1900 条 |
| 1W   | ~270 周 | ~270 条 | ~270 条 |

---

## 📈 回测策略数据需求分析

### 不同策略类型的数据需求

| 策略类型 | 主周期 | 辅助周期 | 最少历史 | 推荐历史 | 说明 |
|----------|--------|----------|----------|----------|------|
| **高频做市** | 1m | 5m, 15m | 30 天 | 90 天 | 需要最近 1-3 个月的高频数据 |
| **日内趋势** | 5m | 15m, 1H | 90 天 | 365 天 | 需要 3-12 个月的分钟级数据 |
| **波段交易** | 1H | 4H, 1D | 180 天 | 730 天 | 需要 6 个月 -2 年的小时级数据 |
| **趋势跟踪** | 4H | 1D, 1W | 365 天 | 1825 天 | 需要 1-5 年的多周期数据 |
| **统计套利** | 1m | 5m, 15m, 1H | 180 天 | 730 天 | 需要 6 个月 -2 年的高频数据 |
| **因子回测** | 1D | 1H, 4H, 1W | 730 天 | 3650 天 | 需要 2-10 年的日线数据 |

### 存储量估算（单品种）

| 周期 | 每天条数 | 1 年条数 | 1 年存储 | 5 年存储 | 10 年存储 |
|------|----------|----------|----------|----------|-----------|
| 1m   | 1,440    | 525,600  | ~100 MB  | ~500 MB  | ~1 GB     |
| 5m   | 288      | 105,120  | ~20 MB   | ~100 MB  | ~200 MB   |
| 15m  | 96       | 35,040   | ~7 MB    | ~35 MB   | ~70 MB    |
| 1H   | 24       | 8,760    | ~2 MB    | ~10 MB   | ~20 MB    |
| 4H   | 6        | 2,190    | ~0.5 MB  | ~2.5 MB  | ~5 MB     |
| 1D   | 1        | 365      | ~0.1 MB  | ~0.5 MB  | ~1 MB     |

> 存储估算基于每条数据约 200 字节（时间戳 + OHLVC + 成交量）

---

## ✅ 推荐数据采集方案

### 【基础配置】适合大多数策略回测

**目标**: 覆盖 80% 的常见策略类型

| 周期 | 采集时长 | 条数 | 存储 | 用途 |
|------|----------|------|------|------|
| 1m   | 90 天    | ~13 万条 | ~10 MB | 高频回测、微观结构 |
| 5m   | 365 天   | ~10 万条 | ~10 MB | 日内策略 |
| 1H   | 2 年     | ~1.7 万条 | ~2 MB | 波段策略 |
| 4H   | 5 年     | ~5500 条 | ~1 MB | 趋势策略 |
| 1D   | 10 年    | ~3650 条 | ~0.5 MB | 因子回测 |

**总存储**: ~25 MB / 品种
**适用**: 个人量化交易者、策略研发初期

---

### 【完整配置】机构级投研

**目标**: 支持所有策略类型，包含完整历史

| 周期 | 采集时长 | 条数 | 存储 | 用途 |
|------|----------|------|------|------|
| 1m   | 365 天   | ~52 万条 | ~50 MB | 完整高频数据 |
| 5m   | 2 年     | ~21 万条 | ~20 MB | 日内策略 |
| 15m  | 3 年     | ~10 万条 | ~10 MB | 中频策略 |
| 1H   | 5 年     | ~4.4 万条 | ~5 MB | 波段/趋势 |
| 4H   | 8 年     | ~1.7 万条 | ~2 MB | 长期趋势 |
| 1D   | 开市至今 | ~2000 条 | ~0.5 MB | 因子/宏观 |

**总存储**: ~90 MB / 品种
**适用**: 专业投研团队、多策略组合

---

### 【最小配置】快速启动

**目标**: 最短时间内开始回测

| 周期 | 采集时长 | 条数 | 存储 |
|------|----------|------|------|
| 1H   | 1 年     | ~8760 条 | ~1 MB |
| 4H   | 3 年     | ~6570 条 | ~1 MB |
| 1D   | 5 年     | ~1825 条 | ~0.2 MB |

**总存储**: ~3 MB / 品种
**适用**: 策略验证、学习用途

---

## 📋 多品种采集建议

如果同时采集多个品种，存储量按品种数线性增长：

| 品种数 | 基础配置 | 完整配置 |
|--------|----------|----------|
| 1 个   | ~25 MB   | ~90 MB   |
| 10 个  | ~250 MB  | ~900 MB  |
| 50 个  | ~1.2 GB  | ~4.5 GB  |
| 100 个 | ~2.5 GB  | ~9 GB    |

**推荐优先采集品种**:
1. BTC-USDT-SWAP (流动性最好)
2. ETH-USDT-SWAP (次好流动性)
3. 其他主流币永续合约（SOL, BNB, XRP 等）
4. 现货对（用于基差分析）

---

## 🔧 数据采集实现方案

### 1. 实时采集（WebSocket）

使用现有的 `tencent-cos-data-collector` skill：
- 采集 tick 级数据
- 实时上传到 COS
- 自动聚合为 1m K 线

### 2. 历史补全（REST API）

```python
# 伪代码示例
def fetch_history_klines(inst_id, bar, start_date, end_date):
    """获取历史 K 线并回填"""
    all_candles = []
    current_ts = end_date.timestamp() * 1000
    
    while current_ts > start_date.timestamp() * 1000:
        candles = okx_api.get_candles(
            inst_id=inst_id,
            bar=bar,
            before=int(current_ts),
            limit=100
        )
        if not candles:
            break
        all_candles.extend(candles)
        current_ts = int(candles[-1][0]) - 1000
        time.sleep(0.1)  # 避免限流
    
    return all_candles
```

### 3. 存储方案

**推荐**: DolphinDB / ClickHouse

```sql
-- DolphinDB 表结构示例
create table kdata(
    symbol: SYMBOL,
    timestamp: TIMESTAMP,
    open: DOUBLE,
    high: DOUBLE,
    low: DOUBLE,
    close: DOUBLE,
    volume: DOUBLE
) PARTITION BY (symbol, HOUR(timestamp))
```

---

## 📊 回测有效性验证

### 数据质量检查清单

- [ ] **连续性**: 无时间戳缺失
- [ ] **异常值**: 无价格跳变（>10%）
- [ ] **成交量**: 无零成交量 K 线（除停牌）
- [ ] **时间对齐**: 各周期 K 线时间戳对齐
- [ ] **复权处理**: 现货无需复权，合约注意资金费率

### 回测周期建议

| 策略类型 | 训练集 | 验证集 | 测试集 |
|----------|--------|--------|--------|
| 高频 | 60 天 | 15 天 | 15 天 |
| 日内 | 9 个月 | 2 个月 | 1 个月 |
| 波段 | 18 个月 | 4 个月 | 2 个月 |
| 趋势 | 3 年 | 1 年 | 6 个月 |
| 因子 | 5 年 | 2 年 | 1 年 |

---

## 📝 总结建议

### 针对您的 quant-platform 项目

基于 OKX 数据特性和回测需求，建议：

1. **第一阶段（立即开始）**
   - 使用现有采集器继续采集 tick 数据
   - 补充历史 1H/4H/1D 数据（用于快速验证）
   - 存储：DolphinDB 或 Parquet 文件

2. **第二阶段（1 个月内）**
   - 补充 1m/5m 历史数据（90 天）
   - 建立数据质量监控
   - 实现基础回测框架

3. **第三阶段（3 个月内）**
   - 完整历史数据回填
   - 多品种覆盖（10-20 个）
   - 因子库和策略库建设

### 最终推荐配置

```yaml
数据采集:
  实时:
    - tick (全量)
    - 1m (聚合)
  
  历史:
    1m: 90 天
    5m: 365 天
    1H: 2 年
    4H: 5 年
    1D: 10 年

品种范围:
  - BTC-USDT-SWAP
  - ETH-USDT-SWAP
  - 其他主流币 (5-10 个)

存储:
  类型: DolphinDB / ClickHouse
  压缩: Snappy / ZSTD
  分区: 按品种 + 时间
```

---

**文档生成时间**: 2026-04-01
**数据来源**: OKX API 文档 + 实际调研
