384 lines
15 KiB
Markdown
384 lines
15 KiB
Markdown
# 比特骆驼行情采集分析 — 开发方案
|
||
|
||
> **独立仓库**,与 `eth_hedge_sim`(策略 / 中控)**无代码共用、无进程共用、无交易密钥共用**。
|
||
> 本系统只做:**行情采集 → 落库 → 分析统计 → 只读展示 / API**。
|
||
> **不下单、不持仓、不替代策略选约。**
|
||
> Git 仓库由负责人在 `git.bz121.com` 创建;本目录为方案与后续工程落点。
|
||
|
||
---
|
||
|
||
## 1. 命名与定位
|
||
|
||
| 项 | 约定 |
|
||
|----|------|
|
||
| **产品名** | **比特骆驼行情采集分析** |
|
||
| **项目名称(对外)** | 比特骆驼行情采集分析系统 |
|
||
| **仓库名称 / 工程名** | `market_intel` |
|
||
| **Git 地址(拟)** | `https://git.bz121.com/dekun/market_intel.git` |
|
||
| **安装目录(生产)** | `/opt/market_intel` |
|
||
| **部署操作系统** | **Ubuntu 22.04 LTS**(与策略仓一键脚本一致) |
|
||
| **运行方式** | **Docker Compose**(采集 + API + Web 同栈编排) |
|
||
| **一键入口** | `deploy/manage.sh` 交互菜单(对齐 `eth_hedge_sim`) |
|
||
|
||
### 1.1 硬边界
|
||
|
||
- **只读行情**:REST / WebSocket;禁止任何交易类 API。
|
||
- **与策略解耦**:策略机挂了,本系统仍可继续采;本系统挂了,策略仍可独立交易。
|
||
- **第一期标的**:ETH(OKX 指数 + ETH-USD_UM 期权盘口);架构预留多币种 / 多所,但实现标准先钉死 OKX ETH。
|
||
- **时区**:统计与「日 / 周 / 月」切分一律 **Asia/Shanghai**。
|
||
|
||
### 1.2 核心分析目标(作战地图数据底座)
|
||
|
||
1. **期权杠杆 × 日内时段**
|
||
口径:`杠杆 = 标的指数 ÷ 期权卖一`(与策略选约门限一致)。
|
||
2. **该时段 → 期权到期 的波动点数**
|
||
口径:到期时刻指数 − 该时段代表指数(可同时存带符号与绝对值)。
|
||
3. **范围**:按 **日 / 周 / 月** 过滤样本,横轴均为 **日内时段桶**(默认 1 小时)。
|
||
|
||
---
|
||
|
||
## 2. 实现标准
|
||
|
||
### 2.1 技术栈
|
||
|
||
| 层 | 标准 |
|
||
|----|------|
|
||
| 语言 | Python 3.11+(采集 / API / 聚合) |
|
||
| Web API | FastAPI |
|
||
| 前端 | React + Vite(只读看板:采集状态、时段图、日周月切换) |
|
||
| 数据库 | 第一期 **SQLite**(volume 持久化);上量后可换 Postgres,表结构先按可迁移设计 |
|
||
| 容器 | Docker + Docker Compose v2 |
|
||
| 反向代理(可选) | 同 Compose 内 Caddy/Nginx,或宿主机已有反代 |
|
||
| 配置 | 仓库根 `.env`(密钥、交易所、采样间隔、端口);**已有非空值不覆盖** |
|
||
|
||
### 2.2 代码与工程规范
|
||
|
||
- 仓库根英文名固定 `market_intel`;文档可用中文。
|
||
- 配置项集中、可环境变量覆盖;禁止把 API Key 写进镜像层。
|
||
- 采集与 API **可同容器或分服务**;Compose 内用服务名互访。
|
||
- 所有时间戳存 **UTC ms**;展示与「自然日」按上海转换。
|
||
- 杠杆 / 波动口径写进代码常量 + 本文档,变更需改版本号与迁移说明。
|
||
- 日志:结构化或按日滚动;脱敏(不打完整密钥)。
|
||
- 测试:采集解析、杠杆计算、时段聚合、到期回填 有单元测试。
|
||
|
||
### 2.3 采集标准(第一期)
|
||
|
||
| 项 | 标准 |
|
||
|----|------|
|
||
| 交易所 | OKX(只读) |
|
||
| 指数 | ETH-USD 指数(或与策略一致的 index) |
|
||
| 期权 | 最近合资格到期的 ATM Call + ATM Put(规则文档化:最接近指数的行权价) |
|
||
| 杠杆采样间隔 | 默认 **30s**(可配 15–120s) |
|
||
| 指数采样 | 可与杠杆同频,或单独 **60s** |
|
||
| 字段最小集 | `ts_ms, exchange, underlying, expiry_ymd, strike, side(C/P), index_px, ask, bid, ask_sz, bid_sz, leverage, inst_id` |
|
||
| 失败策略 | 单次失败记日志并跳过;连续失败告警(可选企微,后期) |
|
||
|
||
### 2.4 统计标准
|
||
|
||
| 项 | 标准 |
|
||
|----|------|
|
||
| 时段桶 | 默认 **1 小时**(0–23,上海);可扩展 30 分钟 |
|
||
| 日 | 上海自然日 `YYYY-MM-DD` |
|
||
| 周 | **滚动近 7 个上海自然日**(第一期);后期可加自然周 |
|
||
| 月 | **滚动近 30 日** 或自然月(设置可选,默认滚动 30 日) |
|
||
| 杠杆聚合 | 桶内:样本数、均值、中位数、P25/P75、≥`min_leverage` 占比 |
|
||
| 波动点数 | 到期后回填;桶内:均值/中位/分位;同时提供 **signed** 与 **abs** |
|
||
| 未到期 | API 标记 `pending_expiry=true`,不假装有完整「到到期」分布 |
|
||
|
||
### 2.5 安全与权限
|
||
|
||
- 仅行情只读 Key(若需要);无交易权限。
|
||
- Web / API 默认需登录或 Token(对齐策略仓简单鉴权即可)。
|
||
- 局域网部署时可绑 `127.0.0.1` / 内网 IP;公网必须 HTTPS + 强密码。
|
||
|
||
---
|
||
|
||
## 3. 系统架构
|
||
|
||
```text
|
||
┌─────────────────────────────────────┐
|
||
│ market_intel(本仓库 · Docker) │
|
||
OKX 行情 ────────►│ collector → SQLite/DB │
|
||
(REST/WS) │ analytics(日/周/月 · 时段聚合) │
|
||
│ api + web(只读看板) │
|
||
└─────────────────────────────────────┘
|
||
│
|
||
│ 可选:只读 API
|
||
▼
|
||
人工浏览器 / 其它系统(后期)
|
||
```
|
||
|
||
- **不**嵌入 `eth_hedge_sim` 进程。
|
||
- 后期若中控要展示,由中控 **HTTP 调用本系统 API**,本仓仍独立演进。
|
||
|
||
---
|
||
|
||
## 4. 代码结构(目标仓库)
|
||
|
||
```text
|
||
market_intel/
|
||
├── README.md
|
||
├── 开发方案.md # 可从本文件迁入 docs/
|
||
├── .env.example
|
||
├── .gitignore
|
||
├── docker-compose.yml # 一键编排入口
|
||
├── Dockerfile # API + 采集(或多阶段)
|
||
├── requirements.txt
|
||
├── deploy/
|
||
│ ├── manage.sh # 交互式菜单(curl | bash)
|
||
│ ├── bootstrap.sh # 缺 git/docker 时引导
|
||
│ └── lib/
|
||
│ ├── common.sh # 日志、读入、路径、.env 合并
|
||
│ ├── install.sh # 一键部署(clone + compose up)
|
||
│ ├── update.sh # git pull + compose build/up
|
||
│ └── uninstall.sh # 停容器;可选保留 data volume
|
||
├── apps/
|
||
│ ├── collector/ # 行情采集进程
|
||
│ │ ├── __init__.py
|
||
│ │ ├── main.py # 入口:循环 / WS
|
||
│ │ ├── okx_rest.py
|
||
│ │ ├── okx_ws.py
|
||
│ │ └── selectors.py # ATM / 到期选择
|
||
│ ├── api/ # FastAPI
|
||
│ │ ├── main.py
|
||
│ │ ├── routes/
|
||
│ │ │ ├── health.py
|
||
│ │ │ ├── samples.py # 原始/明细(调试)
|
||
│ │ │ └── stats.py # 日周月 · 杠杆 · 波动
|
||
│ │ └── auth.py
|
||
│ └── worker/ # 可选:到期回填、日终聚合
|
||
├── packages/
|
||
│ ├── db/ # schema、迁移、repository
|
||
│ ├── domain/ # option_leverage、bucket、move_points
|
||
│ └── config/ # settings from env
|
||
├── web/ # React 看板
|
||
│ ├── package.json
|
||
│ └── src/
|
||
│ ├── pages/
|
||
│ │ ├── Dashboard.tsx # 采集心跳、最新杠杆
|
||
│ │ └── OpsMap.tsx # 作战地图:杠杆 + 波动 · 日/周/月
|
||
│ └── api/
|
||
├── data/ # 本地/挂载:SQLite(.gitignore 内容)
|
||
├── scripts/
|
||
│ ├── smoke_collect.py
|
||
│ └── backfill_index.py # 可选:历史指数回填波动
|
||
└── tests/
|
||
├── test_leverage.py
|
||
├── test_buckets.py
|
||
└── test_move_points.py
|
||
```
|
||
|
||
> 实现时可把 `apps/` 收成单包 `src/market_intel/`,但 **deploy / docker / web / 采集与 API 分离** 的边界保持不变。
|
||
|
||
---
|
||
|
||
## 5. 数据模型(摘要)
|
||
|
||
### 5.1 `option_quotes`(杠杆明细)
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| id | 自增 |
|
||
| ts_ms | UTC |
|
||
| exchange | `okx` |
|
||
| inst_id | 合约 ID |
|
||
| expiry_ymd | `YYMMDD` |
|
||
| strike | 行权价 |
|
||
| side | `C` / `P` |
|
||
| index_px | 指数 |
|
||
| ask / bid | 卖一 / 买一 |
|
||
| ask_sz / bid_sz | 可选 |
|
||
| leverage | `index_px / ask`(ask>0) |
|
||
|
||
### 5.2 `index_ticks`(指数明细)
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| ts_ms | UTC |
|
||
| underlying | `ETH` |
|
||
| index_px | 指数 |
|
||
|
||
### 5.3 `expiry_settlements`(到期锚点)
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| expiry_ymd | 到期日 |
|
||
| settle_ts_ms | 到期时刻(OKX:UTC 08:00) |
|
||
| settle_index_px | 结算/到期指数 |
|
||
|
||
波动点数:对历史某桶代表时刻 \(t\),
|
||
`move = settle_index_px - index_at(t)`(同 `expiry_ymd`)。
|
||
|
||
---
|
||
|
||
## 6. API 约定(第一期)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | `/health` | 存活;可选返回采集延迟 |
|
||
| GET | `/api/stats/leverage` | `range=day\|week\|month` + 日期;返回各时段桶聚合 |
|
||
| GET | `/api/stats/move_points` | 同上;返回时段→到期波动 |
|
||
| GET | `/api/stats/ops-map` | 一次返回杠杆 + 波动(看板主接口) |
|
||
| GET | `/api/meta/latest` | 最新一条 Call/Put 杠杆、采集时间 |
|
||
|
||
查询参数统一:`range`、`date`(锚点日)、`side=C|P|both`、`bucket_minutes=60`。
|
||
|
||
---
|
||
|
||
## 7. Docker 运行标准
|
||
|
||
### 7.1 服务划分(Compose)
|
||
|
||
| 服务名 | 职责 | 说明 |
|
||
|--------|------|------|
|
||
| `collector` | 写库 | 重启策略 `unless-stopped` |
|
||
| `api` | FastAPI + 静态前端(或挂 `web` 构建产物) | 默认端口 **5170**(可配,避开策略 5155 / 中控 5160) |
|
||
| `db` | 第一期可省略(SQLite 挂 volume) | 后期 Postgres 再加 |
|
||
|
||
```yaml
|
||
# docker-compose.yml 示意(实现时落地)
|
||
services:
|
||
collector:
|
||
build: .
|
||
command: ["python", "-m", "apps.collector.main"]
|
||
env_file: .env
|
||
volumes:
|
||
- mi_data:/app/data
|
||
restart: unless-stopped
|
||
api:
|
||
build: .
|
||
command: ["uvicorn", "apps.api.main:app", "--host", "0.0.0.0", "--port", "5170"]
|
||
env_file: .env
|
||
ports:
|
||
- "${MI_PORT:-5170}:5170"
|
||
volumes:
|
||
- mi_data:/app/data
|
||
depends_on:
|
||
- collector
|
||
restart: unless-stopped
|
||
volumes:
|
||
mi_data:
|
||
```
|
||
|
||
### 7.2 本地开发(非必须 Docker)
|
||
|
||
```bash
|
||
python -m venv .venv && source .venv/bin/activate
|
||
pip install -r requirements.txt
|
||
cp .env.example .env
|
||
python -m apps.collector.main # 终端 1
|
||
uvicorn apps.api.main:app --reload # 终端 2
|
||
cd web && npm i && npm run dev # 终端 3
|
||
```
|
||
|
||
**生产标准路径以 Docker Compose 为准。**
|
||
|
||
---
|
||
|
||
## 8. 一键部署(对齐 eth_hedge_sim)
|
||
|
||
### 8.1 新机器(免克隆)
|
||
|
||
```bash
|
||
curl -fsSL https://git.bz121.com/dekun/market_intel/raw/branch/main/deploy/manage.sh | bash
|
||
```
|
||
|
||
要求:Ubuntu 22.04;脚本内检测并安装 **Git、Docker、Docker Compose 插件**(已有则跳过)。
|
||
|
||
### 8.2 已安装
|
||
|
||
```bash
|
||
bash /opt/market_intel/deploy/manage.sh
|
||
```
|
||
|
||
### 8.3 交互菜单(实现标准)
|
||
|
||
与策略仓 `deploy/manage.sh` 同级体验:**数字选项 + 读 `/dev/tty`**,支持 `curl | bash`。
|
||
|
||
| 选项 | 作用 |
|
||
|------|------|
|
||
| **1) 一键部署** | 检测 Docker → clone 到 `/opt/market_intel` → 生成/补全 `.env`(已有非空不覆盖)→ `docker compose up -d --build` → 健康检查 |
|
||
| **2) 更新** | `git pull` + `compose build/up`;保留 `.env` 与 data volume |
|
||
| **3) 停止** | `docker compose stop` |
|
||
| **4) 启动** | `docker compose start` / `up -d` |
|
||
| **5) 查看状态** | `compose ps` + `/health` |
|
||
| **6) 一键卸载** | 停容器;询问是否删除 data volume;备份 `.env` 到 `/root/backups/market_intel/`;按确认删除 `/opt/market_intel` |
|
||
| **0) 退出** | — |
|
||
|
||
已存在安装目录时,选项 1 进入子菜单:**取消 / 修复(保留 .env 与数据)**,行为对齐策略仓 `install.sh`。
|
||
|
||
### 8.4 `.env` 交互补全(首次部署)
|
||
|
||
脚本可交互询问(有默认值,回车采用默认):
|
||
|
||
- `OKX` API Key / Secret / Passphrase(只读;可留空若仅用公开行情)
|
||
- `MI_PORT`(默认 `5170`)
|
||
- `SAMPLE_INTERVAL_SEC`(默认 `30`)
|
||
- `MIN_OPTION_LEVERAGE`(统计达标线,默认 `100`)
|
||
- 管理员密码 / `AUTH_SECRET`
|
||
|
||
原则:**文件中已有非空值不覆盖**(对齐中控 `.env.control` 行为)。
|
||
|
||
### 8.5 部署后验收
|
||
|
||
1. `curl -fsS http://127.0.0.1:5170/health` 返回 ok
|
||
2. 等待 ≥1 个采样周期后,库中有 `option_quotes` 行
|
||
3. 打开 Web 看板能看到最新杠杆
|
||
4. `manage.sh` → 更新 → 容器重建后数据 volume 仍在
|
||
|
||
---
|
||
|
||
## 9. Web 看板(第一期页面)
|
||
|
||
| 页面 | 内容 |
|
||
|------|------|
|
||
| 总览 | 采集是否正常、延迟、当前 ATM Call/Put 杠杆 |
|
||
| 作战地图 | 切换 **日 / 周 / 月**;上图时段杠杆;下图时段→到期波动点数 |
|
||
| 设置(简) | 只读展示当前采样参数(改参走 `.env` + 更新重启) |
|
||
|
||
UI 要求:暗色可与策略仓风格接近,但 **独立品牌标题「行情采集分析」**,避免与对冲策略页混淆。
|
||
|
||
---
|
||
|
||
## 10. 分期计划
|
||
|
||
| 阶段 | 交付 |
|
||
|------|------|
|
||
| **P0** | 仓库骨架、Docker Compose、manage.sh 菜单、健康检查 |
|
||
| **P1** | OKX 指数 + ATM Call/Put 采样落库 |
|
||
| **P2** | `/api/stats/leverage` 日周月;Web 作战地图杠杆图 |
|
||
| **P3** | 到期回填 + 波动点数统计与下图 |
|
||
| **P4** | 鉴权加固、企微采集异常推送、可选历史指数回填 |
|
||
| **P5** | (可选)中控只读嵌入;多 underlying |
|
||
|
||
---
|
||
|
||
## 11. 与 `eth_hedge_sim` 的关系(再强调)
|
||
|
||
| | `eth_hedge_sim` | `market_intel`(本仓) |
|
||
|--|-----------------|------------------------|
|
||
| 职责 | 对冲交易 / 中控运维 | 行情采集与统计分析 |
|
||
| 运行 | PM2(现状) | **Docker Compose** |
|
||
| 端口 | 5155 / 5160 | **5170**(默认) |
|
||
| 密钥 | 可含交易权限 | **仅只读行情** |
|
||
| 依赖 | 互不依赖 | 互不依赖 |
|
||
|
||
---
|
||
|
||
## 12. 验收清单(方案级)
|
||
|
||
- [ ] 仓库名 `market_intel`,产品名「比特骆驼行情采集分析」
|
||
- [ ] `curl | bash` 出交互菜单,可一键部署 / 更新 / 卸载
|
||
- [ ] 全程 Docker 运行,数据落 volume
|
||
- [ ] 杠杆口径 = 指数 ÷ 卖一;时段统计支持日 / 周 / 月
|
||
- [ ] 波动点数 = 时段指数 → 到期指数;未到期显式标记
|
||
- [ ] 零交易 API;与策略仓进程隔离
|
||
|
||
---
|
||
|
||
## 13. 文档修订
|
||
|
||
| 日期 | 说明 |
|
||
|------|------|
|
||
| 2026-07-31 | 初稿:独立仓、Docker、交互式一键部署、作战地图数据标准 |
|