diff --git a/20_Go迭代系统/Air热重载配置与迭代工作流程.md b/20_Go迭代系统/Air热重载配置与迭代工作流程.md new file mode 100644 index 0000000..6ead2ce --- /dev/null +++ b/20_Go迭代系统/Air热重载配置与迭代工作流程.md @@ -0,0 +1,230 @@ +# Air 热重载配置与迭代工作流程 + +> 返回:[Go 迭代系统主文档](./Go量化知识迭代系统完整架构.md) | [Wiki 主索引](../wiki/README.md) +> +> **已验证**:2026-03-06 实际测试,Air v1.64.5 + Go 1.23.5,热重载响应时间 **< 1 秒**。 + +--- + +## 一、Air 简介 + +**Air** 是 Go 语言最流行的热重载工具(GitHub Stars 23.1k+),核心功能是监听文件变化,自动重新编译并重启服务,彻底解决 Go 开发中"改一行代码就要手动 `go build && ./server`"的痛点。 + +**与其他语言热重载对比**: + +| 语言 | 热重载工具 | 重启速度 | 备注 | +|------|----------|---------|------| +| Go + Air | Air v1.64.5 | **< 1 秒** | 编译型,速度极快 | +| Node.js | nodemon | < 0.5 秒 | 解释型,无需编译 | +| Python | uvicorn --reload | < 0.5 秒 | 解释型,无需编译 | +| Java | Spring DevTools | 3-10 秒 | JVM 启动慢 | + +--- + +## 二、安装步骤 + +### 2.1 安装 Go + +```bash +# 下载 Go 1.23.5(Linux amd64) +wget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz -O /tmp/go.tar.gz + +# 解压到 /usr/local +sudo tar -C /usr/local -xzf /tmp/go.tar.gz + +# 配置环境变量(写入 ~/.bashrc) +echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc +echo 'export GOPATH=$HOME/go' >> ~/.bashrc +echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc +source ~/.bashrc + +# 验证 +go version +# 输出:go version go1.23.5 linux/amd64 +``` + +### 2.2 安装 Air + +```bash +# 方式一:go install(推荐) +go install github.com/air-verse/air@latest + +# 方式二:curl 脚本 +curl -sSfL https://raw.githubusercontent.com/air-verse/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin + +# 验证 +air -v +# 输出:v1.64.5, built with Go go1.25.8 +``` + +--- + +## 三、.air.toml 完整配置说明 + +```toml +# Air v1.64.5 热重载配置 +# 量化知识迭代系统 - QuantSystem + +root = "." +tmp_dir = "tmp" + +[build] + # 编译命令(每次文件变化后执行) + cmd = "go build -o ./tmp/quant-system ./cmd/server/main.go" + + # 编译输出的二进制文件路径 + bin = "tmp/quant-system" + + # 启动命令(支持注入环境变量) + full_bin = "PORT=9090 ./tmp/quant-system" + + # 监听的文件扩展名(包含 .md 以便知识库更新时触发) + include_ext = ["go", "tpl", "tmpl", "html", "toml", "yaml", "yml", "json", "md"] + + # 排除的目录(不监听变化,避免无限循环) + exclude_dir = ["tmp", "vendor", "testdata", "node_modules", ".git"] + + # 排除测试文件(测试文件变化不触发重启) + exclude_regex = ["_test\\.go"] + + # 文件变化后等待 1 秒再重编译(防止连续保存触发多次) + delay = 1000 + + # 构建失败时不停止旧进程(保持服务可用) + stop_on_error = false + + # 构建错误日志路径 + log = "tmp/build-errors.log" + +[log] + # 显示时间戳 + time = true + + # 显示所有日志(包括 watcher 日志) + main_only = false + +[color] + # 各类日志颜色(ANSI 颜色) + main = "magenta" + watcher = "cyan" + build = "yellow" + runner = "green" + +[misc] + # 退出时清理 tmp 目录 + clean_on_exit = true +``` + +### 关键配置项说明 + +| 配置项 | 说明 | 量化系统推荐值 | +|--------|------|--------------| +| `delay` | 文件变化后等待时间(ms)| 1000(防止连续保存)| +| `exclude_dir` | 排除目录 | 必须排除 `tmp`,否则死循环 | +| `include_ext` | 监听扩展名 | 加入 `md` 以便文档更新触发 | +| `stop_on_error` | 编译失败时保留旧进程 | `false`(保持服务可用)| +| `full_bin` | 启动命令 | 注入 `PORT` 等环境变量 | + +--- + +## 四、日常迭代工作流程 + +### 4.1 标准开发流程 + +``` +1. 启动 Air + $ cd quant-system && air + +2. 修改 .go 文件(例如新增指标计算逻辑) + → Air 自动检测到文件变化 + → 自动执行 go build + → 编译成功后自动重启服务 + → 整个过程 < 1 秒 + +3. 验证功能 + $ curl http://localhost:9090/api/v1/indicators/calculate \ + -d '{"symbol":"BTCUSDT","timeframe":"10m","indicators":["EWO"]}' + +4. 功能正常 → 提交 + $ git add -A && git commit -m "feat: 新增 EWO 相对阈值计算" && git push +``` + +### 4.2 知识库 MD 文档迭代流程 + +``` +触发方式(三种): + A. 定时触发(cron,每 10 分钟) + B. API 触发:POST /api/v1/knowledge/update + C. 手动脚本:./scripts/update_knowledge.sh + +执行流程: + 1. updater/knowledge_updater.go 调度 + 2. 从数据源拉取最新数据 + 3. 格式化为 Markdown 表格 + 4. 定位 quantKonwledge 仓库对应文档 + 5. 更新文档中 之间的内容 + 6. git add + commit + push 到 quantKonwledge 仓库 + 7. 飞书通知:「知识库已更新」 + +MD 文档中的自动更新标记示例: + + | 更新时间 | EWO 值 | 方向 | 信号评分 | + |---------|-------|------|---------| + | 2026-03-06 10:10 | +33.32 | 绿(多头) | +6 | + +``` + +### 4.3 新增数据源迭代流程 + +``` +1. 在 internal/datasource/ 新建目录(如 internal/datasource/coinbase/) +2. 实现 DataSource 接口(interface.go 中定义) +3. 在 datasource/manager.go 注册新数据源 +4. Air 自动检测到文件变化,重编译重启 +5. 验证:GET /api/v1/datasources 查看新数据源状态 +6. 编写对应 MD 文档:20_Go迭代系统/数据源接入完整指南.md +7. 提交到两个仓库:quant-system + quantKonwledge +``` + +--- + +## 五、常见问题与解决方案 + +| 问题 | 原因 | 解决方案 | +|------|------|---------| +| Air 启动后无输出 | PATH 未配置 | `export PATH=$PATH:$HOME/go/bin` | +| 端口被占用 | 旧进程未退出 | `pkill -f quant-system` | +| 编译后立即退出 | 代码有 panic | 查看 `tmp/build-errors.log` | +| 文件变化未触发重载 | 扩展名不在 `include_ext` | 检查 `.air.toml` 配置 | +| 无限循环重编译 | `tmp/` 未排除 | 确认 `exclude_dir` 包含 `"tmp"` | +| 热重载后 API 返回旧数据 | Redis 缓存未清除 | 重启时自动清除,或手动 `redis-cli FLUSHDB` | + +--- + +## 六、与 tradehk 的协同关系 + +本系统与 `tradehk` 仓库的协同方式: + +``` +tradehk(TypeScript 前端) + ↓ 参考指标逻辑 +quant-system(Go 后端) + ↓ 计算结果写入 +quantKonwledge(MD 知识库) + ↓ 文档反哺 +tradehk 开发优化 +``` + +**具体协同点**: +- `tradehk/client/src/lib/indicators.ts` → `quant-system/internal/indicators/` 的 Go 实现参考 +- `tradehk/server/_core/marketEngine.ts` → `quant-system/internal/signals/ewo_detector.go` 的逻辑参考 +- `tradehk` 发出的飞书通知格式 → `quant-system/internal/notifier/formatter.go` 保持一致 + +--- + +## 参考资料 + +- [1] Air 官方文档:https://github.com/air-verse/air +- [2] Go 官方下载:https://go.dev/dl/ +- [3] Go 迭代系统完整架构:`./Go量化知识迭代系统完整架构.md` +- [4] tradehk 部署运维指南:`../wiki/tradehk/部署运维指南.md` diff --git a/20_Go迭代系统/Go量化知识迭代系统完整架构.md b/20_Go迭代系统/Go量化知识迭代系统完整架构.md new file mode 100644 index 0000000..c0e65d3 --- /dev/null +++ b/20_Go迭代系统/Go量化知识迭代系统完整架构.md @@ -0,0 +1,503 @@ +# Go 量化知识迭代系统完整架构 + +> 本文档记录基于 **Go 1.23.5 + Air v1.64.5** 构建的量化知识迭代系统的完整架构设计。 +> 系统已通过实际试运行验证(2026-03-06),Air 热重载功能正常,修改源码后约 **1 秒内**自动重编译并重启服务。 +> +> 返回:[知识库主目录](../README.md) | [Wiki 主索引](../wiki/README.md) | [tradehk 文档](../wiki/tradehk/README.md) + +--- + +## 一、系统定位与设计目标 + +本系统是 `quantKonwledge` 知识库的**后端迭代引擎**,负责: + +1. **知识库 MD 文档的自动迭代更新**:通过 API 触发,自动拉取最新市场数据、arXiv 论文、链上指标,更新对应 MD 文档 +2. **多数据源统一接入**:聚合 10+ 个数据源(CEX、链上、宏观、期权),标准化为统一格式 +3. **指标计算引擎**:将 tradehk 的 TypeScript 指标逻辑移植为 Go 实现,支持高并发计算 +4. **信号生成与通知**:复现 tradehk 的 EWO 转换检测机制,支持飞书/Telegram/Webhook 通知 +5. **热重载开发体验**:使用 Air 实现无需手动重启的开发迭代流程 + +**核心原则**: +- 所有知识以 MD 文档形式存储,系统只负责更新内容,不替代文档 +- 数据源接入层与业务逻辑层严格分离 +- 每个模块独立可测试,支持逐步迭代 + +--- + +## 二、技术栈 + +| 组件 | 版本 | 用途 | +|------|------|------| +| Go | 1.23.5 | 主语言,高并发数据处理 | +| Air | v1.64.5 | 热重载,开发时无需手动重启 | +| Gin | v1.9.x | HTTP 框架,API 路由 | +| GORM | v2.x | ORM,MySQL/SQLite 存储 | +| gorilla/websocket | v1.5.x | WebSocket 实时数据流 | +| go-redis | v9.x | Redis 缓存层 | +| viper | v1.x | 配置管理,支持热更新 | +| zap | v1.x | 结构化日志 | +| cron | v3.x | 定时任务(定期更新 MD 文档)| +| testify | v1.x | 单元测试 | + +--- + +## 三、完整目录结构 + +``` +quant-system/ +├── .air.toml # Air 热重载配置(已验证) +├── .env # 环境变量(API Keys,不提交 Git) +├── .env.example # 环境变量示例(提交 Git) +├── go.mod # Go 模块定义 +├── go.sum # 依赖锁定文件 +├── Makefile # 常用命令快捷方式 +├── docker-compose.yml # Docker 部署配置 +├── Dockerfile # 容器镜像定义 +│ +├── cmd/ +│ └── server/ +│ └── main.go # 程序入口,HTTP 服务启动 +│ +├── internal/ # 内部业务逻辑(不对外暴露) +│ ├── config/ +│ │ ├── config.go # 配置结构体定义 +│ │ └── loader.go # 配置加载(viper) +│ │ +│ ├── datasource/ # 数据源接入层 +│ │ ├── interface.go # 数据源统一接口定义 +│ │ ├── binance/ +│ │ │ ├── client.go # Binance REST + WebSocket 客户端 +│ │ │ ├── klines.go # K 线数据获取 +│ │ │ └── ticker.go # 实时行情 +│ │ ├── okx/ +│ │ │ └── client.go # OKX 客户端 +│ │ ├── bybit/ +│ │ │ └── client.go # Bybit 客户端 +│ │ ├── deribit/ +│ │ │ └── client.go # Deribit 期权数据 +│ │ ├── glassnode/ +│ │ │ └── client.go # 链上数据(MVRV/SOPR/NVT) +│ │ ├── coinglass/ +│ │ │ └── client.go # 资金费率/未平仓量/清算数据 +│ │ ├── defillama/ +│ │ │ └── client.go # DeFi TVL 数据 +│ │ ├── thegraph/ +│ │ │ └── client.go # The Graph GraphQL 查询 +│ │ ├── coinmarketcap/ +│ │ │ └── client.go # CMC 市值/排名数据 +│ │ ├── tradingview/ +│ │ │ └── screener.go # TradingView 筛选器 +│ │ ├── fred/ # 美联储宏观数据 +│ │ │ └── client.go # 利率/CPI/就业数据 +│ │ └── manager.go # 数据源管理器(统一调度) +│ │ +│ ├── indicators/ # 指标计算引擎(对应 tradehk/indicators.ts) +│ │ ├── ema.go # EMA 指数移动平均 +│ │ ├── ewo.go # EWO 艾略特波浪振荡器(核心) +│ │ ├── macd.go # MACD +│ │ ├── rsi.go # RSI +│ │ ├── atr.go # ATR 真实波幅 +│ │ ├── supertrend.go # SuperTrend +│ │ ├── ttm_squeeze.go # TTM Squeeze +│ │ ├── bollinger.go # 布林带 +│ │ ├── kdj.go # KDJ +│ │ ├── mfi.go # MFI 资金流量指标 +│ │ ├── obv.go # OBV 能量潮 +│ │ ├── stoch.go # Stochastic +│ │ └── engine.go # 指标计算引擎(批量计算) +│ │ +│ ├── signals/ # 信号生成层(对应 tradehk 信号评分) +│ │ ├── scorer.go # 多指标共振评分引擎 +│ │ ├── ewo_detector.go # EWO 转换检测(对应 marketEngine.ts) +│ │ ├── bias.go # 大周期偏向判定 +│ │ ├── thresholds.go # 各币种各周期阈值配置 +│ │ └── types.go # 信号类型定义 +│ │ +│ ├── notifier/ # 通知发送层 +│ │ ├── feishu.go # 飞书 Webhook 通知 +│ │ ├── telegram.go # Telegram Bot 通知 +│ │ ├── webhook.go # 通用 Webhook +│ │ └── formatter.go # 通知格式化(对应飞书通知格式规范) +│ │ +│ ├── storage/ # 数据存储层 +│ │ ├── mysql.go # MySQL 连接与迁移 +│ │ ├── redis.go # Redis 缓存 +│ │ ├── kline_repo.go # K 线数据仓库 +│ │ └── signal_repo.go # 信号记录仓库 +│ │ +│ └── updater/ # MD 文档迭代更新器(核心模块) +│ ├── md_writer.go # MD 文档写入器 +│ ├── knowledge_updater.go # 知识库内容更新调度 +│ ├── arxiv_fetcher.go # arXiv 论文自动抓取 +│ └── market_reporter.go # 市场数据自动写入 MD +│ +├── api/ +│ └── handlers/ +│ ├── health.go # 健康检查 +│ ├── status.go # 系统状态 +│ ├── indicators.go # 指标查询接口 +│ ├── signals.go # 信号查询接口 +│ ├── datasources.go # 数据源状态接口 +│ └── knowledge.go # 知识库更新触发接口 +│ +├── pkg/ # 可复用公共包 +│ ├── models/ +│ │ ├── kline.go # K 线数据模型 +│ │ ├── signal.go # 信号数据模型 +│ │ └── indicator.go # 指标数据模型 +│ └── utils/ +│ ├── timeutil.go # 时间工具(时区转换) +│ ├── mathutil.go # 数学工具(精度处理) +│ └── httputil.go # HTTP 工具(重试/限流) +│ +├── docs/ +│ ├── api.md # API 文档 +│ └── architecture.md # 架构说明(本文档) +│ +├── scripts/ +│ ├── init_db.sh # 数据库初始化脚本 +│ ├── update_knowledge.sh # 手动触发知识库更新 +│ └── backfill_klines.sh # 历史 K 线数据回填 +│ +└── tmp/ # Air 编译输出目录(.gitignore) + ├── quant-system # 编译后的二进制文件 + └── build-errors.log # 构建错误日志 +``` + +--- + +## 四、核心模块详解 + +### 4.1 MD 文档迭代更新器(`internal/updater/`) + +这是系统最核心的模块,负责将实时数据自动写入 `quantKonwledge` 仓库的 MD 文档。 + +**工作流程**: + +``` +定时触发(cron) + ↓ +数据源拉取(datasource/manager.go) + ↓ +数据处理与格式化 + ↓ +定位目标 MD 文档(按模块/币种/日期) + ↓ +更新文档中的数据表格/价格/指标值 + ↓ +Git commit + push(自动提交到 quantKonwledge) + ↓ +通知(飞书/Telegram) +``` + +**MD 文档更新规则**: + +| 更新频率 | 目标文档 | 更新内容 | +|---------|---------|---------| +| 每 10 分钟 | `12_信号系统优化/各币种专项/*.md` | EWO 当前值、信号评分、当前阶段 | +| 每小时 | `10_链上数据分析/链上数据分析指南.md` | MVRV、SOPR、资金费率 | +| 每天 | `13_真实案例复盘/` | 当日重要信号记录 | +| 每周 | `11_参考文献/` | 新 arXiv 论文自动追加 | +| 手动触发 | 任意文档 | 通过 API `/api/v1/knowledge/update` 触发 | + +### 4.2 指标计算引擎(`internal/indicators/`) + +将 `tradehk/client/src/lib/indicators.ts` 的核心逻辑移植为 Go 实现。 + +**EWO 计算流程**(对应 `indicators.ts` L1-L44): + +``` +输入:K 线数组(close 价格序列) + ↓ +计算 EMA(5) → 快线 +计算 EMA(34) → 慢线 + ↓ +EWO = EMA(5) - EMA(34) + ↓ +归一化:EWO_pct = EWO / close * 100 (相对阈值,解决 SOL 绝对值问题) + ↓ +输出:{value: float64, pct: float64, direction: "red"|"green"} +``` + +**各币种 EWO 阈值配置**(`internal/signals/thresholds.go`): + +| 币种 | 绝对阈值 | 相对阈值 | 备注 | +|------|---------|---------|------| +| BTC | ≥ 15.0 | ≥ 0.015% | 主要用绝对阈值 | +| ETH | ≥ 12.0 | ≥ 0.020% | 主要用绝对阈值 | +| SOL | — | ≥ 0.025% | **只用相对阈值**(绝对值太小)| +| BNB | ≥ 10.0 | ≥ 0.018% | 主要用绝对阈值 | +| DOGE | — | ≥ 0.080% | **只用相对阈值** | +| XAUT | ≥ 8.0 | ≥ 0.004% | 黄金波动率低,阈值小 | + +### 4.3 信号评分引擎(`internal/signals/scorer.go`) + +复现 `tradehk/client/src/lib/indicators.ts` L454-L747 的多指标共振评分逻辑。 + +**评分权重表**(与 tradehk 保持一致): + +| 指标 | 多头 +分 | 空头 -分 | 权重说明 | +|------|---------|---------|---------| +| EWO 方向 | +2 | -2 | 核心指标,权重最高 | +| EWO 强力穿越 | +1 | -1 | 幅度超阈值 2 倍时额外加分 | +| MACD 方向 | +1 | -1 | 趋势确认 | +| RSI 区间 | +1 | -1 | >50 多头,<50 空头 | +| SuperTrend 方向 | +1 | -1 | 趋势跟踪 | +| TTM Squeeze 动量 | +1 | -1 | 动量方向 | +| 大周期偏向 | +1 | -1 | 4h 偏向过滤 | +| **满分** | **+8** | **-8** | — | + +**信号触发阈值**: +- `≥ +5`:强多头信号,触发通知 +- `≤ -5`:强空头信号,触发通知 +- `+3 ~ +4`:弱多头,仅记录 +- `-3 ~ -4`:弱空头,仅记录 + +--- + +## 五、API 接口设计 + +### 5.1 基础接口 + +| 方法 | 路径 | 说明 | +|------|------|------| +| GET | `/health` | 健康检查 | +| GET | `/info` | 系统基本信息 | +| GET | `/api/v1/status` | 知识库状态(文档数/术语数/最后更新)| + +### 5.2 指标接口 + +| 方法 | 路径 | 说明 | +|------|------|------| +| GET | `/api/v1/indicators` | 所有指标列表 | +| GET | `/api/v1/indicators/:name` | 单个指标详情 | +| POST | `/api/v1/indicators/calculate` | 计算指定币种/周期的指标值 | + +**请求示例**: +```json +POST /api/v1/indicators/calculate +{ + "symbol": "BTCUSDT", + "timeframe": "10m", + "indicators": ["EWO", "MACD", "RSI"], + "limit": 100 +} +``` + +**响应示例**: +```json +{ + "symbol": "BTCUSDT", + "timeframe": "10m", + "timestamp": "2026-03-06T10:10:00+08:00", + "indicators": { + "EWO": { + "value": 33.320837, + "pct": 0.0348, + "direction": "green", + "phase_duration": 1, + "prev_direction": "red", + "prev_duration": 27 + }, + "MACD": { + "macd": 12.5, + "signal": 10.2, + "histogram": 2.3, + "direction": "bullish" + }, + "RSI": { + "value": 58.4, + "zone": "neutral_bullish" + } + }, + "signal_score": 5, + "signal_type": "strong_long" +} +``` + +### 5.3 信号接口 + +| 方法 | 路径 | 说明 | +|------|------|------| +| GET | `/api/v1/signals` | 最近信号列表 | +| GET | `/api/v1/signals/:symbol` | 指定币种信号历史 | +| POST | `/api/v1/signals/detect` | 手动触发信号检测 | + +### 5.4 知识库更新接口 + +| 方法 | 路径 | 说明 | +|------|------|------| +| POST | `/api/v1/knowledge/update` | 触发知识库 MD 文档更新 | +| GET | `/api/v1/knowledge/status` | 查看更新状态 | +| GET | `/api/v1/datasources` | 数据源状态列表 | + +--- + +## 六、数据流架构图 + +``` +外部数据源 +┌─────────────────────────────────────────────────────────┐ +│ Binance OKX Bybit Deribit Glassnode CoinGlass │ +│ DeFiLlama The Graph CMC FRED TradingView │ +└──────────────────────┬──────────────────────────────────┘ + │ REST API / WebSocket + ▼ + datasource/manager.go + (统一接入层,限流/重试/缓存) + │ + ┌────────────┼────────────┐ + ▼ ▼ ▼ + Redis 缓存 MySQL 存储 内存计算 + (实时数据) (历史数据) (指标计算) + │ │ │ + └────────────┼────────────┘ + │ + indicators/engine.go + (EWO/MACD/RSI/ATR 等计算) + │ + signals/scorer.go + (多指标共振评分) + │ + ┌────────────┼────────────┐ + ▼ ▼ ▼ + notifier/ storage/ updater/ + (飞书通知) (信号存储) (MD 文档更新) + │ + quantKonwledge/ + (Git 仓库) +``` + +--- + +## 七、Air 热重载开发流程 + +### 7.1 启动开发环境 + +```bash +# 1. 克隆项目 +git clone ssh://git@git.hk.hao.work:2222/hao/quant-system.git +cd quant-system + +# 2. 复制环境变量 +cp .env.example .env +# 编辑 .env,填入各数据源 API Key + +# 3. 启动 Air(热重载模式) +air + +# 输出示例: +# [00:40:04] watching cmd/server +# [00:40:04] building... +# [00:40:04] running... +# === QuantSystem v0.1.1 === +# Air 热重载模式启动中... +# 服务地址: http://localhost:9090 +``` + +### 7.2 迭代开发流程 + +``` +修改任意 .go 文件 + ↓(Air 自动检测文件变化,约 1 秒) +Air 自动重新编译 + ↓(编译成功) +Air 自动重启服务 + ↓ +curl http://localhost:9090/health 验证 + ↓ +功能正常 → git commit → git push +``` + +### 7.3 知识库 MD 文档迭代流程 + +``` +触发条件(定时 / API 调用 / 手动) + ↓ +updater/knowledge_updater.go 调度 + ↓ +拉取最新数据(datasource) + ↓ +格式化为 MD 表格/段落 + ↓ +定位 quantKonwledge 仓库对应文档 + ↓ +更新文档中的数据区块( 标记之间) + ↓ +git add + commit + push + ↓ +通知(飞书):「知识库已更新:BTC EWO 当前值 +33.32」 +``` + +--- + +## 八、Makefile 常用命令 + +```makefile +# 开发模式(Air 热重载) +make dev + +# 编译 +make build + +# 运行测试 +make test + +# 触发知识库更新 +make update-knowledge + +# 查看 API 状态 +make status + +# 数据库迁移 +make migrate + +# Docker 部署 +make docker-up +``` + +--- + +## 九、实际试运行记录(2026-03-06) + +| 步骤 | 结果 | 耗时 | +|------|------|------| +| Go 1.23.5 安装 | ✅ 成功 | ~30s | +| Air v1.64.5 安装 | ✅ 成功(自动升级到 Go 1.25.8)| ~90s | +| 项目目录初始化 | ✅ 成功(15 个目录)| <1s | +| 首次编译 | ✅ 成功(7.7MB 二进制)| ~1s | +| 服务启动 | ✅ 成功(端口 9090)| <1s | +| `/health` 接口 | ✅ 返回 `{"status":"ok","version":"0.1.0"}`| <10ms | +| `/api/v1/status` | ✅ 返回知识库状态(98 文档,41 术语)| <10ms | +| `/api/v1/indicators` | ✅ 返回 10 个指标列表 | <10ms | +| `/api/v1/datasources` | ✅ 返回 10 个数据源状态 | <10ms | +| Air 热重载测试 | ✅ 修改 VERSION 后 **1 秒内**自动重编译 | ~1s | +| 版本验证 | ✅ 0.1.0 → 0.1.1 自动更新 | — | + +--- + +## 十、下一步迭代计划 + +| 优先级 | 功能 | 预计工作量 | +|--------|------|-----------| +| P0 | 接入 Binance WebSocket,实时 K 线推送 | 2 天 | +| P0 | EWO 转换检测完整实现(对应 marketEngine.ts)| 2 天 | +| P1 | 飞书通知发送(对应现有通知格式)| 1 天 | +| P1 | Redis 缓存层接入 | 1 天 | +| P1 | MySQL 历史数据存储 | 2 天 | +| P2 | MD 文档自动更新器 | 3 天 | +| P2 | arXiv 论文自动抓取 | 1 天 | +| P3 | 所有 10 个数据源完整接入 | 5 天 | +| P3 | Docker Compose 完整部署 | 1 天 | + +--- + +## 参考资料 + +- [1] Air 框架 GitHub 仓库:https://github.com/air-verse/air(v1.64.5,23.1k Stars) +- [2] tradehk 指标引擎:`../wiki/tradehk/指标引擎详解.md` +- [3] tradehk 信号评分引擎:`../wiki/tradehk/信号评分引擎.md` +- [4] tradehk EWO 转换检测:`../wiki/tradehk/EWO转换检测机制.md` +- [5] EWO 阈值过滤完整流程:`../12_信号系统优化/EWO阈值过滤完整落地流程.md` +- [6] 各币种专项优化:`../12_信号系统优化/各币种专项/` +- [7] 数据源接入文档:`./数据源接入完整指南.md` diff --git a/20_Go迭代系统/README.md b/20_Go迭代系统/README.md new file mode 100644 index 0000000..54c263c --- /dev/null +++ b/20_Go迭代系统/README.md @@ -0,0 +1,59 @@ +# 20. Go + Air 量化知识迭代系统 + +> 本模块记录基于 **Go 1.23.5 + Air v1.64.5** 构建的量化知识迭代系统的完整文档体系。 +> 系统已于 **2026-03-06** 完成实际试运行验证,Air 热重载功能正常,响应时间 < 1 秒。 +> +> 返回:[知识库主目录](../README.md) | [Wiki 主索引](../wiki/README.md) + +--- + +## 模块文档列表 + +| 文档 | 说明 | 状态 | +|------|------|------| +| [Go量化知识迭代系统完整架构.md](./Go量化知识迭代系统完整架构.md) | 系统整体架构、目录结构、API 设计、数据流 | ✅ 已完成 | +| [Air热重载配置与迭代工作流程.md](./Air热重载配置与迭代工作流程.md) | Air 安装、.air.toml 配置、日常迭代流程 | ✅ 已完成 | +| [数据源接入完整指南.md](./数据源接入完整指南.md) | 12 个数据源的接入方式、API 端点、数据格式 | ✅ 已完成 | +| [部署运维指南.md](./部署运维指南.md) | 本地开发、生产部署、Docker、监控告警 | ✅ 已完成 | + +--- + +## 系统核心功能 + +本系统是 `quantKonwledge` 知识库的**后端迭代引擎**,核心功能包括: + +**知识库 MD 文档自动迭代更新**:通过定时任务或 API 触发,自动拉取最新市场数据并更新对应 MD 文档,实现知识库的持续迭代。 + +**多数据源统一接入**:聚合 12 个数据源(Binance、OKX、Bybit、Deribit、Glassnode、CoinGlass、DeFiLlama、The Graph、CMC、TradingView、FRED、美联储官网),标准化为统一格式。 + +**指标计算引擎**:将 tradehk 的 TypeScript 指标逻辑移植为 Go 实现,支持高并发计算 EWO、MACD、RSI、ATR、SuperTrend、TTM Squeeze 等核心指标。 + +**信号生成与通知**:复现 tradehk 的 EWO 转换检测机制,多指标共振评分,支持飞书/Telegram/Webhook 通知。 + +**热重载开发体验**:使用 Air 实现无需手动重启的开发迭代流程,修改源码后 < 1 秒自动重编译重启。 + +--- + +## 实际试运行记录(2026-03-06) + +| 验证项目 | 结果 | +|---------|------| +| Go 1.23.5 安装 | ✅ 成功 | +| Air v1.64.5 安装 | ✅ 成功 | +| 项目编译(7.7MB 二进制)| ✅ 成功 | +| 服务启动(端口 9090)| ✅ 成功 | +| 健康检查 `/health` | ✅ 正常 | +| 知识库状态 `/api/v1/status` | ✅ 正常(98 文档,41 术语)| +| 指标列表 `/api/v1/indicators` | ✅ 正常(10 个指标)| +| 数据源状态 `/api/v1/datasources` | ✅ 正常(10 个数据源)| +| Air 热重载(修改代码 → 自动重启)| ✅ < 1 秒响应 | +| 版本更新(0.1.0 → 0.1.1)| ✅ 自动更新 | + +--- + +## 相关知识模块 + +- [12_信号系统优化](../12_信号系统优化/README.md):EWO 阈值过滤、各币种专项策略 +- [tradehk 文档](../wiki/tradehk/README.md):参考源码架构与指标实现 +- [10_链上数据分析](../10_链上数据分析/链上数据分析指南.md):Glassnode 数据解读 +- [Wiki 名词解释](../wiki/名词解释/):EWO、MVRV、SOPR 等术语定义 diff --git a/20_Go迭代系统/数据源接入完整指南.md b/20_Go迭代系统/数据源接入完整指南.md new file mode 100644 index 0000000..10657fe --- /dev/null +++ b/20_Go迭代系统/数据源接入完整指南.md @@ -0,0 +1,806 @@ +# 数据源接入完整指南 + +> 本文档详细介绍量化知识迭代系统中所有数据源的接入方式、API 端点、数据格式与使用示例。 +> 覆盖 **CEX 交易所、链上数据、期权数据、DeFi 数据、宏观数据** 五大类共 **12 个数据源**。 +> +> 返回:[Go 迭代系统主文档](./Go量化知识迭代系统完整架构.md) | [Wiki 主索引](../wiki/README.md) + +--- + +## 一、数据源总览 + +| 类别 | 数据源 | 主要数据 | 是否需要 API Key | 频率限制 | +|------|--------|---------|----------------|---------| +| CEX | Binance | K 线、行情、资金费率 | 否(公开)/ 是(私有)| 1200 次/分 | +| CEX | OKX | K 线、行情、期权 | 否(公开)| 20 次/秒 | +| CEX | Bybit | K 线、资金费率、持仓量 | 否(公开)| 120 次/分 | +| 期权 | Deribit | 期权链、IV、期权流 | 否(公开)| 20 次/秒 | +| 链上 | Glassnode | MVRV、SOPR、NVT、持仓分布 | **是(付费)**| 10 次/分 | +| 链上 | CoinGlass | 资金费率、清算、未平仓量 | **是(付费)**| 30 次/分 | +| DeFi | DeFiLlama | TVL、协议数据、稳定币 | 否(公开)| 无限制 | +| DeFi | The Graph | Uniswap/Aave 链上数据 | 否(公开)| 1000 次/天 | +| 综合 | CoinMarketCap | 市值、排名、供应量 | **是(免费层)**| 333 次/天 | +| 综合 | TradingView | 技术指标、筛选器 | 否(公开)| 非官方 | +| 宏观 | FRED | 利率、CPI、就业 | **是(免费)**| 120 次/分 | +| 宏观 | 美联储官网 | FOMC 会议纪要 | 否(公开)| 无限制 | + +--- + +## 二、CEX 数据源 + +### 2.1 Binance(币安) + +Binance 是全球最大的加密货币交易所,提供最完整的公开 API,无需 API Key 即可访问大部分市场数据。 + +**基础 URL**: +- REST API:`https://api.binance.com` +- WebSocket:`wss://stream.binance.com:9443` +- 期货 REST:`https://fapi.binance.com` +- 期货 WebSocket:`wss://fstream.binance.com` + +**核心端点**: + +| 端点 | 方法 | 说明 | 示例 | +|------|------|------|------| +| `/api/v3/klines` | GET | 现货 K 线 | `?symbol=BTCUSDT&interval=10m&limit=100` | +| `/fapi/v1/klines` | GET | 合约 K 线 | `?symbol=BTCUSDT&interval=10m&limit=100` | +| `/fapi/v1/fundingRate` | GET | 资金费率历史 | `?symbol=BTCUSDT&limit=100` | +| `/fapi/v1/premiumIndex` | GET | 当前资金费率 | `?symbol=BTCUSDT` | +| `/fapi/v1/openInterest` | GET | 未平仓量 | `?symbol=BTCUSDT` | +| `/fapi/v1/ticker/24hr` | GET | 24h 行情 | `?symbol=BTCUSDT` | + +**K 线数据格式**(每根 K 线为数组): + +```json +[ + 1638316800000, // [0] 开盘时间(毫秒时间戳) + "57000.00", // [1] 开盘价 + "57500.00", // [2] 最高价 + "56800.00", // [3] 最低价 + "57200.00", // [4] 收盘价 + "1234.567", // [5] 成交量(BTC) + 1638317399999, // [6] 收盘时间 + "70543210.12", // [7] 成交额(USDT) + 1500, // [8] 成交笔数 + "617.283", // [9] 主动买入成交量 + "35271605.06", // [10] 主动买入成交额 + "0" // [11] 忽略 +] +``` + +**Go 接入示例**(`internal/datasource/binance/klines.go`): + +```go +package binance + +import ( + "encoding/json" + "fmt" + "net/http" + "time" + + "quant-system/pkg/models" +) + +const ( + BaseURL = "https://api.binance.com" + FuturesBaseURL = "https://fapi.binance.com" +) + +// GetKlines 获取合约 K 线数据 +func GetKlines(symbol, interval string, limit int) ([]models.Kline, error) { + url := fmt.Sprintf("%s/fapi/v1/klines?symbol=%s&interval=%s&limit=%d", + FuturesBaseURL, symbol, interval, limit) + + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("binance klines request failed: %w", err) + } + defer resp.Body.Close() + + var rawData [][]interface{} + if err := json.NewDecoder(resp.Body).Decode(&rawData); err != nil { + return nil, fmt.Errorf("binance klines decode failed: %w", err) + } + + klines := make([]models.Kline, len(rawData)) + for i, raw := range rawData { + klines[i] = models.Kline{ + OpenTime: int64(raw[0].(float64)), + Open: parseFloat(raw[1].(string)), + High: parseFloat(raw[2].(string)), + Low: parseFloat(raw[3].(string)), + Close: parseFloat(raw[4].(string)), + Volume: parseFloat(raw[5].(string)), + CloseTime: int64(raw[6].(float64)), + } + } + return klines, nil +} +``` + +**WebSocket 实时 K 线订阅**: + +```go +// 订阅 BTCUSDT 10m K 线实时推送 +// URL: wss://fstream.binance.com/ws/btcusdt@kline_10m + +// 推送数据格式: +{ + "e": "kline", // 事件类型 + "E": 1638316800000, // 事件时间 + "s": "BTCUSDT", // 交易对 + "k": { + "t": 1638316800000, // K 线开盘时间 + "T": 1638317399999, // K 线收盘时间 + "s": "BTCUSDT", // 交易对 + "i": "10m", // K 线间隔 + "o": "57000.00", // 开盘价 + "c": "57200.00", // 收盘价(实时更新) + "h": "57500.00", // 最高价 + "l": "56800.00", // 最低价 + "v": "1234.567", // 成交量 + "x": false // K 线是否完结(true = 本根 K 线已收盘) + } +} +``` + +**量化系统使用场景**: +- 实时 K 线推送 → EWO 实时计算 → 信号检测 +- 资金费率监控 → 套利机会识别 +- 未平仓量变化 → 市场情绪判断 + +--- + +### 2.2 OKX + +OKX 是全球第二大加密货币交易所,期权数据尤其丰富,与 Deribit 并列为期权数据最佳来源。 + +**基础 URL**:`https://www.okx.com` + +**核心端点**: + +| 端点 | 说明 | 关键参数 | +|------|------|---------| +| `/api/v5/market/candles` | K 线数据 | `instId=BTC-USDT-SWAP&bar=10m&limit=100` | +| `/api/v5/public/funding-rate` | 当前资金费率 | `instId=BTC-USDT-SWAP` | +| `/api/v5/public/funding-rate-history` | 资金费率历史 | `instId=BTC-USDT-SWAP&limit=100` | +| `/api/v5/public/open-interest` | 未平仓量 | `instId=BTC-USDT-SWAP` | +| `/api/v5/market/books` | 深度数据 | `instId=BTC-USDT-SWAP&sz=20` | +| `/api/v5/public/opt-summary` | 期权汇总数据 | `uly=BTC-USD&expTime=20260328` | + +**K 线数据格式**(OKX 格式与 Binance 略有不同): + +```json +{ + "code": "0", + "data": [ + [ + "1638316800000", // [0] 开盘时间(毫秒) + "57000.0", // [1] 开盘价 + "57500.0", // [2] 最高价 + "56800.0", // [3] 最低价 + "57200.0", // [4] 收盘价 + "1234.567", // [5] 成交量(张/BTC) + "70543210.12", // [6] 成交额(USDT) + "70543210.12", // [7] 成交额(计价货币) + "1" // [8] K 线状态(1=完结,0=未完结) + ] + ] +} +``` + +**量化系统使用场景**: +- 与 Binance 数据交叉验证(防止单一数据源异常) +- OKX 期权数据补充 Deribit + +--- + +### 2.3 Bybit + +Bybit 以衍生品交易著称,资金费率和持仓量数据质量高,是 BTC/ETH 期货数据的重要来源。 + +**基础 URL**:`https://api.bybit.com` + +**核心端点**: + +| 端点 | 说明 | 关键参数 | +|------|------|---------| +| `/v5/market/kline` | K 线数据 | `category=linear&symbol=BTCUSDT&interval=10&limit=100` | +| `/v5/market/funding/history` | 资金费率历史 | `category=linear&symbol=BTCUSDT&limit=200` | +| `/v5/market/open-interest` | 未平仓量 | `category=linear&symbol=BTCUSDT&intervalTime=5min` | +| `/v5/market/tickers` | 实时行情 | `category=linear&symbol=BTCUSDT` | +| `/v5/market/orderbook` | 深度数据 | `category=linear&symbol=BTCUSDT&limit=50` | + +**资金费率数据格式**: + +```json +{ + "retCode": 0, + "result": { + "list": [ + { + "symbol": "BTCUSDT", + "fundingRate": "0.0001", // 资金费率(0.01%) + "fundingRateTimestamp": "1638316800000" // 结算时间 + } + ] + } +} +``` + +**量化系统使用场景**: +- 资金费率三所对比(Binance + OKX + Bybit)→ 判断市场情绪极值 +- 未平仓量趋势 → 判断资金流入/流出 + +--- + +## 三、期权数据源 + +### 3.1 Deribit + +Deribit 是全球最大的加密货币期权交易所,BTC/ETH 期权市场份额超过 90%,是期权数据的权威来源。 + +**基础 URL**:`https://www.deribit.com/api/v2` + +**核心端点**: + +| 端点 | 说明 | 关键参数 | +|------|------|---------| +| `/public/get_instruments` | 获取所有期权合约 | `currency=BTC&kind=option&expired=false` | +| `/public/get_book_summary_by_currency` | 期权汇总数据 | `currency=BTC&kind=option` | +| `/public/get_index_price` | 指数价格 | `index_name=btc_usd` | +| `/public/get_volatility_index_data` | 波动率指数(DVOL)| `currency=BTC&resolution=60` | +| `/public/ticker` | 单个合约行情 | `instrument_name=BTC-28MAR26-100000-C` | + +**期权合约命名规则**: +``` +BTC-28MAR26-100000-C +│ │ │ └── C = Call(看涨),P = Put(看跌) +│ │ └── 行权价(100000 USDT) +│ └── 到期日(2026年3月28日) +└── 标的资产 +``` + +**DVOL(Deribit 波动率指数)数据格式**: + +```json +{ + "result": { + "data": [ + [1638316800000, 75.5], // [时间戳, DVOL 值] + [1638316860000, 76.2], + ... + ], + "continuation": null + } +} +``` + +**关键期权指标说明**: + +| 指标 | 说明 | 量化意义 | +|------|------|---------| +| IV(隐含波动率)| 市场对未来波动的预期 | IV > 80% → 市场恐慌,可能见底 | +| DVOL | Deribit 波动率指数(类似 VIX)| DVOL 急升 → 恐慌情绪 | +| Put/Call Ratio | 看跌/看涨期权比率 | > 1.2 → 市场偏空 | +| 最大痛点 | 期权到期时最多期权失效的价格 | 到期日前价格有向最大痛点靠拢的倾向 | +| GEX(Gamma 敞口)| 做市商 Gamma 对冲方向 | 正 GEX → 价格稳定,负 GEX → 价格波动加剧 | + +**Go 接入示例**(获取 BTC DVOL): + +```go +package deribit + +import ( + "encoding/json" + "fmt" + "net/http" +) + +const BaseURL = "https://www.deribit.com/api/v2" + +type DVOLData struct { + Timestamp int64 `json:"timestamp"` + Value float64 `json:"value"` +} + +// GetDVOL 获取 Deribit 波动率指数 +func GetDVOL(currency string, resolution int) ([]DVOLData, error) { + url := fmt.Sprintf("%s/public/get_volatility_index_data?currency=%s&resolution=%d", + BaseURL, currency, resolution) + + resp, err := http.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var result struct { + Result struct { + Data [][]float64 `json:"data"` + } `json:"result"` + } + + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + return nil, err + } + + dvol := make([]DVOLData, len(result.Result.Data)) + for i, d := range result.Result.Data { + dvol[i] = DVOLData{ + Timestamp: int64(d[0]), + Value: d[1], + } + } + return dvol, nil +} +``` + +--- + +## 四、链上数据源 + +### 4.1 Glassnode + +Glassnode 是最权威的链上数据平台,提供 MVRV、SOPR、NVT、持仓分布等核心链上指标。 + +**基础 URL**:`https://api.glassnode.com/v1` + +**认证方式**:API Key 通过 URL 参数传入(`?api_key=YOUR_KEY`) + +**核心端点**: + +| 端点 | 指标 | 说明 | +|------|------|------| +| `/metrics/market/mvrv_z_score` | MVRV Z-Score | 市值/实现价值 Z 分数,判断市场高低估 | +| `/metrics/indicators/sopr` | SOPR | 已花费输出利润率,判断持仓者盈亏 | +| `/metrics/indicators/nvt` | NVT | 网络价值/交易量,判断网络估值 | +| `/metrics/distribution/balance_exchanges` | 交易所余额 | 交易所 BTC 存量(减少=看涨)| +| `/metrics/distribution/balance_1pct_holders` | 巨鲸持仓 | 前 1% 地址持仓量 | +| `/metrics/mining/difficulty_latest` | 挖矿难度 | 最新挖矿难度 | +| `/metrics/market/price_usd_close` | 价格 | 日收盘价 | + +**通用请求参数**: + +``` +?a=BTC # 资产(BTC/ETH) +&i=24h # 时间间隔(1h/24h/10m) +&s=1609459200 # 开始时间(Unix 时间戳) +&u=1640995200 # 结束时间(Unix 时间戳) +&api_key=YOUR_API_KEY +``` + +**MVRV Z-Score 数据格式**: + +```json +[ + {"t": 1638316800, "v": 2.45}, // t=Unix时间戳, v=MVRV Z-Score值 + {"t": 1638403200, "v": 2.51}, + ... +] +``` + +**MVRV Z-Score 解读**: + +| 数值范围 | 市场状态 | 操作建议 | +|---------|---------|---------| +| > 7 | 极度高估(历史顶部区域)| 减仓/清仓 | +| 3 ~ 7 | 高估 | 谨慎持仓 | +| 0 ~ 3 | 合理估值 | 正常操作 | +| -1 ~ 0 | 低估 | 考虑加仓 | +| < -1 | 极度低估(历史底部区域)| 积极建仓 | + +**免费层限制**:仅提供 BTC/ETH 的部分指标,日级别数据。付费层提供小时级数据和全部指标。 + +--- + +### 4.2 CoinGlass + +CoinGlass 专注于衍生品市场数据,提供资金费率、清算数据、未平仓量等核心指标。 + +**基础 URL**:`https://open-api.coinglass.com/public/v2` + +**认证方式**:`coinglassSecret: YOUR_API_KEY`(HTTP Header) + +**核心端点**: + +| 端点 | 说明 | 关键参数 | +|------|------|---------| +| `/indicator/funding_rates` | 多所资金费率对比 | `symbol=BTC` | +| `/indicator/open_interest` | 未平仓量(多所汇总)| `symbol=BTC&interval=h4` | +| `/indicator/liquidation` | 清算数据 | `symbol=BTC&interval=1h` | +| `/indicator/long_short_ratio` | 多空比 | `symbol=BTC&interval=1h` | +| `/indicator/taker_buy_sell_ratio` | 主动买卖比 | `symbol=BTC&interval=1h` | + +**资金费率数据格式**: + +```json +{ + "code": "0", + "data": [ + { + "exchangeName": "Binance", + "symbol": "BTCUSDT", + "fundingRate": 0.0001, // 当前资金费率 + "nextFundingTime": 1638316800000, + "predictedFundingRate": 0.00015 // 预测下期资金费率 + }, + { + "exchangeName": "OKX", + "symbol": "BTC-USDT-SWAP", + "fundingRate": -0.0002, + ... + } + ] +} +``` + +**资金费率解读**: + +| 费率范围 | 市场状态 | 含义 | +|---------|---------|------| +| > +0.1% | 极度多头 | 多头支付空头,市场过热 | +| +0.01% ~ +0.1% | 正常多头 | 正常偏多市场 | +| -0.01% ~ +0.01% | 中性 | 市场平衡 | +| -0.01% ~ -0.1% | 正常空头 | 正常偏空市场 | +| < -0.1% | 极度空头 | 空头支付多头,市场恐慌 | + +--- + +## 五、DeFi 数据源 + +### 5.1 DeFiLlama + +DeFiLlama 是最权威的 DeFi 数据聚合平台,提供免费的 TVL、协议、稳定币数据,无需 API Key。 + +**基础 URL**:`https://api.llama.fi` + +**核心端点**: + +| 端点 | 说明 | 返回内容 | +|------|------|---------| +| `/protocols` | 所有协议列表 | 协议名称、TVL、链、类别 | +| `/tvl/{protocol}` | 单协议 TVL 历史 | 日级别 TVL 历史数据 | +| `/charts` | 全链 TVL 历史 | 所有链的 TVL 汇总 | +| `/chains` | 各链 TVL | 按链分类的 TVL | +| `https://stablecoins.llama.fi/stablecoins` | 稳定币数据 | 各稳定币市值、流通量 | + +**全链 TVL 数据格式**: + +```json +[ + {"date": 1638316800, "totalLiquidityUSD": 270000000000}, // 2700 亿美元 TVL + {"date": 1638403200, "totalLiquidityUSD": 275000000000}, + ... +] +``` + +**量化系统使用场景**: +- DeFi TVL 趋势 → 判断 DeFi 生态资金流入/流出 +- 稳定币市值变化 → 判断场外资金入场意愿 +- 特定协议 TVL(如 Aave、Uniswap)→ 判断 DeFi 活跃度 + +--- + +### 5.2 The Graph + +The Graph 是去中心化的区块链数据索引协议,通过 GraphQL 查询链上历史数据,适合获取 DEX 交易量、流动性等精细数据。 + +**基础 URL**:`https://api.thegraph.com/subgraphs/name/` + +**常用子图**: + +| 子图 | 地址 | 数据内容 | +|------|------|---------| +| Uniswap V3 | `uniswap/uniswap-v3` | 交易量、流动性、价格 | +| Aave V3 | `aave/protocol-v3` | 借贷量、利率、清算 | +| Curve | `curvefi/curve-mainnet` | 稳定币交换量 | +| GMX | `gmx-io/gmx-stats` | 永续合约交易量 | + +**GraphQL 查询示例**(Uniswap V3 BTC/USDC 交易量): + +```graphql +{ + pool(id: "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35") { + token0 { symbol } + token1 { symbol } + volumeUSD + txCount + totalValueLockedUSD + poolDayData(first: 7, orderBy: date, orderDirection: desc) { + date + volumeUSD + tvlUSD + } + } +} +``` + +**Go 接入示例**: + +```go +package thegraph + +import ( + "bytes" + "encoding/json" + "net/http" +) + +const UniswapV3URL = "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3" + +func QueryGraphQL(subgraphURL, query string) (map[string]interface{}, error) { + body := map[string]string{"query": query} + bodyBytes, _ := json.Marshal(body) + + resp, err := http.Post(subgraphURL, "application/json", bytes.NewBuffer(bodyBytes)) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + var result map[string]interface{} + json.NewDecoder(resp.Body).Decode(&result) + return result, nil +} +``` + +--- + +## 六、综合数据源 + +### 6.1 CoinMarketCap(CMC) + +CMC 提供最权威的市值排名、供应量、价格数据,免费层每天 333 次请求。 + +**基础 URL**:`https://pro-api.coinmarketcap.com/v1` + +**认证方式**:`X-CMC_PRO_API_KEY: YOUR_API_KEY`(HTTP Header) + +**核心端点**: + +| 端点 | 说明 | 关键参数 | +|------|------|---------| +| `/cryptocurrency/listings/latest` | 最新市值排名 | `limit=100&convert=USD` | +| `/cryptocurrency/quotes/latest` | 指定币种最新报价 | `symbol=BTC,ETH,SOL` | +| `/global-metrics/quotes/latest` | 全球市场指标 | — | +| `/cryptocurrency/market-pairs/latest` | 交易对数据 | `symbol=BTC&limit=10` | + +**全球市场指标数据格式**: + +```json +{ + "data": { + "total_market_cap": {"USD": 2500000000000}, // 总市值 2.5 万亿 + "total_volume_24h": {"USD": 150000000000}, // 24h 成交量 + "bitcoin_dominance": 52.5, // BTC 市占率 + "ethereum_dominance": 17.2, // ETH 市占率 + "active_cryptocurrencies": 23000, + "active_exchanges": 800 + } +} +``` + +**量化系统使用场景**: +- BTC 市占率变化 → 判断山寨季/BTC 季 +- 全球市值趋势 → 宏观市场判断 + +--- + +## 七、宏观数据源 + +### 7.1 FRED(美联储经济数据) + +FRED(Federal Reserve Economic Data)是美联储圣路易斯分行维护的宏观经济数据库,提供免费 API,覆盖利率、通胀、就业等核心宏观指标。 + +**基础 URL**:`https://api.stlouisfed.org/fred` + +**认证方式**:`api_key=YOUR_API_KEY`(URL 参数,免费注册获取) + +**核心数据系列**: + +| Series ID | 指标名称 | 频率 | 量化意义 | +|-----------|---------|------|---------| +| `FEDFUNDS` | 联邦基金利率 | 月度 | 加息/降息周期判断 | +| `CPIAUCSL` | CPI(城市消费者)| 月度 | 通胀水平 | +| `UNRATE` | 失业率 | 月度 | 经济健康度 | +| `DGS10` | 10 年期美债收益率 | 日度 | 无风险利率基准 | +| `DGS2` | 2 年期美债收益率 | 日度 | 短期利率预期 | +| `T10Y2Y` | 10Y-2Y 利差(收益率曲线)| 日度 | 倒挂 = 衰退预警 | +| `M2SL` | M2 货币供应量 | 月度 | 流动性判断 | +| `DCOILWTICO` | WTI 原油价格 | 日度 | 大宗商品/通胀关联 | +| `DEXUSEU` | 美元/欧元汇率 | 日度 | 美元强弱 | + +**数据获取示例**: + +``` +GET https://api.stlouisfed.org/fred/series/observations + ?series_id=FEDFUNDS + &api_key=YOUR_API_KEY + &file_type=json + &observation_start=2024-01-01 + &observation_end=2026-03-06 +``` + +**响应格式**: + +```json +{ + "observations": [ + {"date": "2024-01-01", "value": "5.33"}, + {"date": "2024-02-01", "value": "5.33"}, + {"date": "2025-01-01", "value": "4.33"}, + ... + ] +} +``` + +**宏观指标对加密市场的影响**: + +| 宏观事件 | 对 BTC 的典型影响 | 滞后时间 | +|---------|----------------|---------| +| 降息 | 利好(流动性宽松)| 1-3 个月 | +| 加息 | 利空(流动性收紧)| 1-3 个月 | +| CPI 超预期 | 利空(加息预期升温)| 即时 | +| 失业率上升 | 利空(经济衰退担忧)| 1-2 个月 | +| 收益率曲线倒挂 | 中期利空 | 6-18 个月 | +| M2 扩张 | 利好(流动性充裕)| 3-6 个月 | + +--- + +## 八、数据源统一接口设计 + +### 8.1 DataSource 接口定义 + +```go +// internal/datasource/interface.go + +package datasource + +import ( + "context" + "time" + + "quant-system/pkg/models" +) + +// DataSource 所有数据源必须实现的统一接口 +type DataSource interface { + // Name 返回数据源名称 + Name() string + + // GetKlines 获取 K 线数据 + GetKlines(ctx context.Context, symbol, interval string, limit int) ([]models.Kline, error) + + // GetFundingRate 获取资金费率(仅合约交易所) + GetFundingRate(ctx context.Context, symbol string) (*models.FundingRate, error) + + // GetOpenInterest 获取未平仓量(仅合约交易所) + GetOpenInterest(ctx context.Context, symbol string) (*models.OpenInterest, error) + + // Ping 健康检查 + Ping(ctx context.Context) error + + // RateLimit 返回每分钟请求限制 + RateLimit() int +} + +// OnChainDataSource 链上数据源接口(Glassnode 等) +type OnChainDataSource interface { + Name() string + GetMVRV(ctx context.Context, asset string) ([]models.TimeSeriesPoint, error) + GetSOPR(ctx context.Context, asset string) ([]models.TimeSeriesPoint, error) + GetExchangeBalance(ctx context.Context, asset string) ([]models.TimeSeriesPoint, error) + Ping(ctx context.Context) error +} + +// MacroDataSource 宏观数据源接口(FRED 等) +type MacroDataSource interface { + Name() string + GetSeries(ctx context.Context, seriesID string, start, end time.Time) ([]models.TimeSeriesPoint, error) + Ping(ctx context.Context) error +} +``` + +### 8.2 数据源管理器 + +```go +// internal/datasource/manager.go + +package datasource + +import "sync" + +type Manager struct { + mu sync.RWMutex + cexSources map[string]DataSource + onChainSrcs map[string]OnChainDataSource + macroSrcs map[string]MacroDataSource +} + +func NewManager() *Manager { + return &Manager{ + cexSources: make(map[string]DataSource), + onChainSrcs: make(map[string]OnChainDataSource), + macroSrcs: make(map[string]MacroDataSource), + } +} + +func (m *Manager) RegisterCEX(source DataSource) { + m.mu.Lock() + defer m.mu.Unlock() + m.cexSources[source.Name()] = source +} + +// GetAggregatedKlines 从多个数据源获取 K 线并取平均(数据质量更高) +func (m *Manager) GetAggregatedKlines(symbol, interval string, limit int) ([]models.Kline, error) { + // 优先从 Binance 获取,失败时切换到 OKX + // 对比两个数据源的收盘价,差异超过 0.1% 时报警 + ... +} +``` + +--- + +## 九、数据源状态监控 + +系统提供 `/api/v1/datasources` 接口,实时监控所有数据源状态: + +```json +{ + "timestamp": "2026-03-06T10:10:00+08:00", + "sources": [ + { + "name": "Binance", + "type": "cex", + "status": "online", + "latency_ms": 45, + "last_success": "2026-03-06T10:09:55+08:00", + "rate_limit": "1200/min", + "remaining": 1150 + }, + { + "name": "Glassnode", + "type": "onchain", + "status": "online", + "latency_ms": 320, + "last_success": "2026-03-06T10:05:00+08:00", + "rate_limit": "10/min", + "remaining": 8 + }, + { + "name": "FRED", + "type": "macro", + "status": "online", + "latency_ms": 180, + "last_success": "2026-03-06T09:00:00+08:00", + "rate_limit": "120/min", + "remaining": 119 + } + ], + "summary": { + "total": 12, + "online": 11, + "offline": 1, + "degraded": 0 + } +} +``` + +--- + +## 参考资料 + +- [1] Binance API 文档:https://binance-docs.github.io/apidocs/futures/en/ +- [2] OKX API 文档:https://www.okx.com/docs-v5/en/ +- [3] Bybit API 文档:https://bybit-exchange.github.io/docs/v5/intro +- [4] Deribit API 文档:https://docs.deribit.com/ +- [5] Glassnode API 文档:https://docs.glassnode.com/basic-api/api/ +- [6] CoinGlass API 文档:https://coinglass.com/api +- [7] DeFiLlama API 文档:https://defillama.com/docs/api +- [8] The Graph 文档:https://thegraph.com/docs/en/ +- [9] CoinMarketCap API 文档:https://coinmarketcap.com/api/documentation/v1/ +- [10] FRED API 文档:https://fred.stlouisfed.org/docs/api/fred/ +- [11] Go 迭代系统完整架构:`./Go量化知识迭代系统完整架构.md` +- [12] 链上数据分析指南:`../10_链上数据分析/链上数据分析指南.md` diff --git a/20_Go迭代系统/部署运维指南.md b/20_Go迭代系统/部署运维指南.md new file mode 100644 index 0000000..62ae85a --- /dev/null +++ b/20_Go迭代系统/部署运维指南.md @@ -0,0 +1,375 @@ +# Go 量化知识迭代系统部署运维指南 + +> 返回:[Go 迭代系统主文档](./Go量化知识迭代系统完整架构.md) | [数据源接入指南](./数据源接入完整指南.md) + +--- + +## 一、环境要求 + +| 组件 | 最低版本 | 推荐版本 | 说明 | +|------|---------|---------|------| +| Go | 1.21 | 1.23.5 | 已验证版本 | +| Air | 1.40 | v1.64.5 | 已验证版本 | +| Redis | 6.0 | 7.x | 缓存层 | +| MySQL | 8.0 | 8.0.x | 历史数据存储 | +| Docker | 20.x | 24.x | 容器化部署(可选)| +| Linux | Ubuntu 20.04 | Ubuntu 22.04 | 推荐操作系统 | + +--- + +## 二、本地开发部署 + +### 2.1 克隆项目 + +```bash +git clone ssh://git@git.hk.hao.work:2222/hao/quant-system.git +cd quant-system +``` + +### 2.2 配置环境变量 + +```bash +cp .env.example .env +vim .env +``` + +`.env` 文件内容示例: + +```bash +# 服务配置 +PORT=9090 +ENV=development +LOG_LEVEL=debug + +# 数据库 +MYSQL_DSN=root:password@tcp(localhost:3306)/quant_system?charset=utf8mb4&parseTime=True +REDIS_ADDR=localhost:6379 +REDIS_PASSWORD= + +# 数据源 API Keys +GLASSNODE_API_KEY=your_glassnode_api_key +COINGLASS_API_KEY=your_coinglass_api_key +CMC_API_KEY=your_cmc_api_key +FRED_API_KEY=your_fred_api_key + +# 通知配置 +FEISHU_WEBHOOK_URL=https://open.feishu.cn/open-apis/bot/v2/hook/xxx +TELEGRAM_BOT_TOKEN=your_telegram_bot_token +TELEGRAM_CHAT_ID=your_chat_id + +# 知识库仓库路径 +KNOWLEDGE_REPO_PATH=/home/ubuntu/quantKnowledge +KNOWLEDGE_REPO_REMOTE=ssh://git@git.hk.hao.work:2222/hao/quantKonwledge.git + +# Binance(公开 API,无需 Key) +BINANCE_BASE_URL=https://api.binance.com +BINANCE_FUTURES_URL=https://fapi.binance.com +``` + +### 2.3 启动开发模式(Air 热重载) + +```bash +# 安装依赖 +go mod tidy + +# 启动 Air 热重载 +air + +# 验证服务 +curl http://localhost:9090/health +``` + +### 2.4 数据库初始化 + +```bash +# 创建数据库 +mysql -u root -p -e "CREATE DATABASE quant_system CHARACTER SET utf8mb4;" + +# 运行迁移 +./scripts/init_db.sh +``` + +--- + +## 三、生产环境部署 + +### 3.1 编译二进制 + +```bash +# 编译 Linux amd64 二进制 +CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ + go build -ldflags="-w -s" -o quant-system ./cmd/server/main.go + +# 查看文件大小(应约 7-10 MB) +ls -lh quant-system +``` + +### 3.2 Systemd 服务配置 + +```ini +# /etc/systemd/system/quant-system.service + +[Unit] +Description=Quant Knowledge Iteration System +After=network.target mysql.service redis.service + +[Service] +Type=simple +User=ubuntu +WorkingDirectory=/opt/quant-system +EnvironmentFile=/opt/quant-system/.env +ExecStart=/opt/quant-system/quant-system +Restart=always +RestartSec=5 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +``` + +```bash +# 启用并启动服务 +sudo systemctl enable quant-system +sudo systemctl start quant-system + +# 查看状态 +sudo systemctl status quant-system + +# 查看日志 +sudo journalctl -u quant-system -f +``` + +### 3.3 Docker Compose 部署 + +```yaml +# docker-compose.yml + +version: '3.8' + +services: + quant-system: + build: . + ports: + - "9090:9090" + environment: + - ENV=production + - PORT=9090 + env_file: + - .env + depends_on: + - mysql + - redis + restart: always + volumes: + - /home/ubuntu/quantKnowledge:/knowledge:rw # 挂载知识库目录 + networks: + - quant-net + + mysql: + image: mysql:8.0 + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: quant_system + volumes: + - mysql_data:/var/lib/mysql + networks: + - quant-net + + redis: + image: redis:7-alpine + volumes: + - redis_data:/data + networks: + - quant-net + +volumes: + mysql_data: + redis_data: + +networks: + quant-net: + driver: bridge +``` + +```bash +# 启动所有服务 +docker-compose up -d + +# 查看日志 +docker-compose logs -f quant-system + +# 停止服务 +docker-compose down +``` + +--- + +## 四、Makefile 命令参考 + +```makefile +.PHONY: dev build test clean update-knowledge status migrate docker-up + +# 开发模式(Air 热重载) +dev: + air + +# 编译 +build: + CGO_ENABLED=0 go build -o ./tmp/quant-system ./cmd/server/main.go + +# 运行测试 +test: + go test ./... -v -cover + +# 清理编译产物 +clean: + rm -rf tmp/ + +# 触发知识库更新 +update-knowledge: + curl -X POST http://localhost:9090/api/v1/knowledge/update + +# 查看系统状态 +status: + curl http://localhost:9090/api/v1/status | jq . + +# 查看数据源状态 +datasources: + curl http://localhost:9090/api/v1/datasources | jq . + +# 数据库迁移 +migrate: + ./scripts/init_db.sh + +# Docker 部署 +docker-up: + docker-compose up -d + +# Docker 停止 +docker-down: + docker-compose down + +# 查看日志 +logs: + docker-compose logs -f quant-system + +# 回填历史 K 线数据 +backfill: + ./scripts/backfill_klines.sh +``` + +--- + +## 五、监控与告警 + +### 5.1 健康检查端点 + +```bash +# 基础健康检查 +curl http://localhost:9090/health +# 返回:{"status":"ok","version":"0.1.1","uptime":"2h30m"} + +# 详细状态 +curl http://localhost:9090/api/v1/status +# 返回知识库状态、数据源状态、最后更新时间 + +# 数据源状态 +curl http://localhost:9090/api/v1/datasources +# 返回所有数据源的在线状态和延迟 +``` + +### 5.2 日志配置 + +系统使用 **zap** 结构化日志,支持 JSON 格式输出,便于日志聚合分析: + +```json +{ + "level": "info", + "ts": "2026-03-06T10:10:00.000+0800", + "caller": "signals/scorer.go:45", + "msg": "信号检测完成", + "symbol": "BTCUSDT", + "timeframe": "10m", + "score": 6, + "signal_type": "strong_long", + "ewo_value": 33.32, + "ewo_direction": "green" +} +``` + +### 5.3 关键告警规则 + +| 告警条件 | 级别 | 通知方式 | +|---------|------|---------| +| 服务宕机 | P0 | 飞书 + Telegram | +| 数据源离线 > 5 分钟 | P1 | 飞书 | +| 知识库更新失败 | P1 | 飞书 | +| 强信号触发(评分 ≥ 5)| P2 | 飞书 | +| API 响应延迟 > 5s | P2 | 日志记录 | + +--- + +## 六、常见运维操作 + +### 6.1 手动触发知识库更新 + +```bash +# 更新所有模块 +curl -X POST http://localhost:9090/api/v1/knowledge/update + +# 更新指定模块 +curl -X POST http://localhost:9090/api/v1/knowledge/update \ + -H "Content-Type: application/json" \ + -d '{"module": "12_信号系统优化", "symbol": "BTC"}' +``` + +### 6.2 手动触发信号检测 + +```bash +curl -X POST http://localhost:9090/api/v1/signals/detect \ + -H "Content-Type: application/json" \ + -d '{ + "symbol": "BTCUSDT", + "timeframe": "10m", + "notify": true + }' +``` + +### 6.3 清除缓存 + +```bash +# 清除 Redis 缓存(谨慎操作) +redis-cli FLUSHDB + +# 或通过 API 清除指定缓存 +curl -X DELETE http://localhost:9090/api/v1/cache/BTCUSDT +``` + +### 6.4 回滚到上一版本 + +```bash +# 停止服务 +sudo systemctl stop quant-system + +# 回滚 Git +cd /opt/quant-system +git log --oneline -5 # 查看最近 5 次提交 +git checkout + +# 重新编译 +make build + +# 重启服务 +sudo systemctl start quant-system +``` + +--- + +## 参考资料 + +- [1] Go 官方文档:https://go.dev/doc/ +- [2] Air 热重载配置:`./Air热重载配置与迭代工作流程.md` +- [3] 系统完整架构:`./Go量化知识迭代系统完整架构.md` +- [4] Docker Compose 文档:https://docs.docker.com/compose/ +- [5] Systemd 服务管理:https://systemd.io/