as-event/ARCHITECTURE.md

135 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# A股大事记录 / 大周期择时看板 · 架构设计
> 目标:把 **指数日成交量、ETF流入、股民情绪、重大事件** 四类信息按时间轴叠加到
> **上证综指 / 创业板指 / 科创50** 的指数K线上形成一份 A 股「大事记录」,
> 用于辅助判断 A 股 **大周期的顶与底**。
>
> 本文件是设计基线,随迭代更新。数据字段口径参考同目录 `DATA_MODEL.md`。
---
## 1. 设计原则与关键决策
| 决策点 | 结论 | 说明 |
|---|---|---|
| 数据来源 | **直连现有内网库** + 自有库 | 指数收盘/成交额直读 `zs_day_data`(MySQL-A 18.199),情绪直读 `gp_market_sentiment`(PG 16.150);本系统另建**自有 Postgres** 存事件、ETF、派生指标与本地快照。 |
| 指数 OHLC | **可插拔 Provider暂缺** | 现有 `zs_day_data` 只有 `close`,无开/高/低画不了完整蜡烛图。OHLC 源由你后续提供,系统预留 `OHLCProvider` 接口;未接入时**退化为收盘线**`ohlc_source='close_only'`),接入后自动转蜡烛图。 |
| ETF & 事件 | **人工录入为主 + 自动化接口预留** | 提供 Web 表单录入 + CSV 导入模板;`importers.py` 预留 `EventImporter`/`EtfFlowImporter` 接口,未来可挂新闻/公告/资金流抓取。 |
| 前端 | **FastAPI + ECharts** | 单页看板:蜡烛图 + 成交量副图 + 情绪/温度副图 + 事件打点;切换指数、缩放、看事件详情。 |
| 部署 | **Docker Compose** | `db`(自有 Postgres) + `backend`(FastAPI含静态前端)。外部内网库 DSN 走环境变量,可缺省降级。 |
| 数据落地 | **读→同步→自有库→看板** | ETL 从内网库拉取并落一份到自有库;看板只读自有库,保证「大事记录」自包含、可离线回看、事件可长期叠加。 |
### 为什么不直接在看板里跨库实时查?
「大事记录」要长期留存、可离线回看、和事件长期叠加,且要跨 MySQL + PG 联合出图。
因此采用 **ETL 同步进自有库** 的读写分离:内网库只在同步时被读,看板永远读自有库,
既尊重「直连现有库」的选择,又让系统自包含、易 Docker 化、查询快。
---
## 2. 系统拓扑
```
外部(现有内网库,只读)
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ MySQL-A 192.168.18.199 │ │ PostgreSQL 192.168.16.150 │
│ zs_day_data(指数 close/额) │ │ gp_market_sentiment(情绪) │
└───────────────┬──────────────┘ └───────────────┬──────────────┘
│ (LEGACY_MYSQL_DSN) │ (LEGACY_PG_DSN)
▼ ▼
┌───────────────────────────────────────────────────────────┐
│ backend (FastAPI 容器) │
│ sources.py —— 现有库读适配 + 可插拔 OHLCProvider(预留) │
│ etl.py —— 同步 index_daily / sentiment_daily │
│ importers.py—— ETF/事件 CSV导入 + 自动化接口(预留) │
│ signals.py —— 顶底「市场温度」透明启发式 │
│ api.py —— REST 接口 │
│ frontend/index.html —— ECharts 看板(静态挂载) │
└───────────────────────────┬───────────────────────────────┘
│ (OWN_DB_DSN)
┌──────────────────────────────┐
│ db: 自有 Postgres(容器) │
│ index_daily / sentiment_daily│
│ etf_flow / market_event │
│ cycle_annotation │
└──────────────────────────────┘
```
---
## 3. 指数范围
| 名称 | 代码(dot式) | zs_day_data 有 | 说明 |
|---|---|---|---|
| 上证综指 | `000001.SH` | ✅ | 主看盘 |
| 创业板指 | `399006.SZ` | ✅ | 成长/科技情绪 |
| 科创50 | `000688.SH` | ✅ | 科创板代表指数科创板本身无指数用科创50代理 |
| 深证成指 | `399001.SZ` | ✅ | 可选,默认关闭 |
代码统一用 **dot 式**`000001.SH`),与 `zs_day_data.symbol` 一致,避免格式互转。
---
## 4. 数据模型(自有库)
详见 `ddl/own_db_init.sql``backend/app/db.py`。摘要:
- **`index_daily`** — 指数日线(同步落地):`index_code, trade_date, open/high/low/close, volume, amount, pct_chg, turnover_rate, ohlc_source`。唯一键 `(index_code, trade_date)`
- **`sentiment_daily`** — 情绪日度:`trade_date, up_down_ratio, median_pct_chg, pct_chg_gt_5_count, limit_up/down_count, margin_balance, new_accounts, sentiment_score`。
- **`etf_flow`** — ETF 流入(人工/导入/自动):`trade_date, etf_code, etf_name, category, related_index, net_inflow(亿元), shares_change, source, note`。
- **`market_event`** — 重大事件:`event_date, title, category(监管/IPO/政策/资金/外部/其他), impact_direction(bullish/bearish/neutral), severity(1-5), related_indices, cycle_tag(top/bottom/none), description, source_url, source(manual/import/auto)`。
- **`cycle_annotation`** — 人工顶底标注(复盘用):`index_code, anno_date, kind(top/bottom/watch), note`。
---
## 5. 顶底信号方法论(`signals.py`,透明可调)
不做黑盒。综合几个 A 股经典的顶底极值信号,产出每日 **市场温度 0100** 与离散标记:
| 分量 | 顶部含义 | 底部含义 | 计算 |
|---|---|---|---|
| 量能分位 `vol_pct` | 天量见天价 | 地量见地价 | `amount` 在滚动 N 日(默认250)的百分位 |
| 价格分位 `price_pct` | 高位 | 低位 | `close` 在滚动 N 日的百分位 |
| 情绪分 `sentiment` | 涨停潮/普涨亢奋 | 跌停潮/普跌冰点 | `up_down_ratio`、`pct_chg_gt_5_count` 归一 |
| ETF资金 `etf_z` | 大额净流出 | 大额净流入(国家队) | 净流入 z-score |
**市场温度** = 各分量加权(默认权重写在 `signals.py` 顶部,便于你用自己数据回测调参)。
温度 >80 记 **过热/顶部风险**<20 **冰点/底部机会**并在看板上以**热力带 + 标记**呈现
> 权重与阈值是初值,需你在实机用历史数据回测校准;方法论刻意保持透明,不追求复杂模型。
---
## 6. 接口一览REST
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/health` | 健康检查含各库连通性 |
| GET | `/api/index/list` | 可用指数列表 |
| GET | `/api/index/{code}/kline?start=&end=` | K线(OHLC/收盘)+成交量+温度 |
| GET | `/api/sentiment?start=&end=` | 情绪日度序列 |
| GET | `/api/etf?start=&end=&index=` | ETF 流入序列 |
| GET/POST/PUT/DELETE | `/api/events` | 事件 CRUD人工录入 |
| POST | `/api/events/import` `/api/etf/import` | CSV 导入 |
| GET | `/api/signals?code=&start=&end=` | 顶底温度与离散标记 |
| POST | `/api/sync/index` `/api/sync/sentiment` | 触发 ETL也可 CLI/定时 |
---
## 7. 部署与运维
- `docker compose up -d` `db` + `backend`前端由 backend 静态挂载浏览器访问 `:8000`
- 内网库 DSN`LEGACY_MYSQL_DSN` / `LEGACY_PG_DSN` `.env` 注入**留空则该同步自动跳过**降级不报错)。
- ETL`docker compose exec backend python -m app.etl sync-index --start 20240101`后续可挂 cron / APScheduler
- 开发机 服务器**git 同步代码**数据不入库随代码走每个里程碑提示提交
---
## 8. 里程碑
1. 架构 + 骨架 + Docker + 自有库DDL
2. 数据源适配 + ETL + API + 顶底信号
3. ECharts 看板 + 事件录入/导入
4. 实机联调你跑测试回传)→ OHLC 源接入 顶底权重校准
5. 自动化接入ETF/事件抓取按需开启