324 lines
23 KiB
Markdown
324 lines
23 KiB
Markdown
# Bionic Trader 数据模型
|
||
|
||
> 全部库表、Milvus 集合、Redis 键与 MongoDB 集合的 Schema 与上下游关系。存储拓扑与连接配置见 `ARCHITECTURE.md` §2.2。
|
||
|
||
约定:
|
||
- 股票代码在不同库里有两种格式 —— **交易所前缀式**(`SH600000` / `SZ000001`,`strategy_daily_results`、`gp_day_data`、**因子分表 `gp_stock_factor_pro_*` 的 `symbol`** 用)与 **Tushare 式**(`600000.SH` / `000001.SZ`,PG、行情 Redis、盘中告警流用)。代码里通过 `parts[1]+parts[0]` 互转。
|
||
> ⚠️ 2026-07-07 实测更正:因子分表 `symbol` 为**前缀式**(`SH603501` 命中、`603501.SH` 查空),早期文档误记为 Tushare 式。全链取数一律传前缀式给 `DataLoader`。
|
||
- 日期同样有两种:`INT YYYYMMDD`(`strategy_daily_results`、`trade_date`)与 `DATE`/`DATETIME`。
|
||
|
||
---
|
||
|
||
## 1. MySQL-A · 本地库 `db_gp_cj`(192.168.18.199)
|
||
|
||
原始行情与筹码,主要供旧形态线与宏观情绪使用。
|
||
|
||
### 1.1 `gp_day_data` — 原始日线(模型 `DayData`)
|
||
|
||
⚠️ 价格字段是 **VARCHAR**,读出后必须 `pd.to_numeric` 转换。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `id` | BIGINT PK | 自增 |
|
||
| `symbol` | VARCHAR(255) idx | 个股代码 |
|
||
| `timestamp` | DATETIME idx | 交易时间 |
|
||
| `volume` | BIGINT | 成交量 |
|
||
| `open` / `high` / `low` / `close` | VARCHAR(255) | 价格(字符串存储) |
|
||
| `chg` | VARCHAR | 涨跌额 |
|
||
| `percent` | DECIMAL(10,2) | 涨跌幅 % |
|
||
| `turnoverrate` | DECIMAL(10,2) | 换手率 |
|
||
| `amount` | BIGINT | 成交额 |
|
||
| `pb` / `pe` / `ps` | DECIMAL(10,2) | 估值 |
|
||
| `pre_close` | DECIMAL(10,2) | 前收 |
|
||
|
||
消费者:`slicer.py`(旧)、`backtester.py`/`tasks_backtest.py`(旧)、`visualizer.py`(旧)、`curve_algo._fetch_future_prices`、**`DataLoader._append_raw_daily_fallback`(V7.2 日线兜底:因子分表尾部缺行时按重叠日对账后补尾,2026-07-07 起)**。
|
||
|
||
### 1.2 `gp_chip_data` — 筹码分布
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `symbol`, `trade_date` | 主键维度 |
|
||
| `winner_rate` | 获利盘比例 |
|
||
| `cost_5pct` / `cost_50pct` / `cost_95pct` | 成本分位 |
|
||
|
||
消费者:`data_loader.fetch_chip_data` → `get_resistance_support_map`(算支撑压力)。
|
||
|
||
### 1.3 `zs_day_data` — 大盘指数日线
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `symbol` | 指数代码(000001.SH / 399001.SZ / 000688.SH / 399006.SZ) |
|
||
| `timestamp` | 日期 |
|
||
| `close` | 收盘 |
|
||
| `percent` | 涨跌幅 |
|
||
| `amount` | 成交额 |
|
||
|
||
消费者:`MarketSentimentAnalyzer`(大脑第 3 步「水温」)、`GlobalIndexLoader`(Miner,预留)。
|
||
|
||
> **注意**:`intraday_watcher` 读 `strategy_daily_results` 走 `PROXY_DB_URL`(ShardingSphere 代理 192.168.16.153:3307,已前置 16.150 主业务库),与日终主链路写入库(`SOURCE_DB_EXT_DSN`/16.150)一致,**不读本库**。早期文档误记为本库(`DB_MYSQL_URL`/18.199),已订正。
|
||
|
||
---
|
||
|
||
## 2. MySQL-B · 外部主业务库 `factordb_mysql`(192.168.16.150)
|
||
|
||
系统的运行主库。`tasks_brain.db_engine` 与 `daily_scan_v2.engine` 都指向这里。
|
||
|
||
### 2.1 `gp_stock_factor_pro_YYYYMM` — 按月分表的前复权因子(核心特征源)
|
||
|
||
每月一张表(如 `gp_stock_factor_pro_202405`)。`data_loader._get_sharded_table_names` 按日期范围拼 `UNION ALL` 查询。
|
||
|
||
关键字段(`data_loader.fetch_technical_factors` 选取):
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `symbol`(→ts_code), `trade_date` | 维度 |
|
||
| `close_qfq` / `open_qfq` / `high_qfq` / `low_qfq` | 前复权 OHLC |
|
||
| `pct_chg`, `vol`, `amount`, `turnover_rate`, `volume_ratio` | 量价 |
|
||
| `pe_ttm`, `pb`, `total_mv`, `circ_mv` | 估值/市值 |
|
||
| `macd_dif_qfq` / `macd_dea_qfq` / `macd_qfq` | MACD |
|
||
| `kdj_k_qfq` / `kdj_d_qfq` / `kdj_qfq` | KDJ |
|
||
| `rsi_qfq_12`, `atr_qfq`, `cci_qfq` | RSI/ATR/CCI |
|
||
| `boll_upper_qfq` / `boll_lower_qfq` / `boll_mid_qfq` | 布林带 |
|
||
| `obv_qfq` | **OBV(向量「资金」通道的核心,缺它则降级用 vol)** |
|
||
|
||
消费者:`DataLoader.get_daily_data`(几乎所有模块的行情入口)、`FactorCalculator`(在线向量)、`MinerController`(离线向量)。
|
||
|
||
### 2.2 `strategy_daily_results` — 核心产出表
|
||
|
||
系统最终结论落库于此。**无随代码提供的建表 DDL,需手工建立**(建表语句见 `DEPLOYMENT.md` §4)。写入方 `tasks_brain.save_to_database`(`INSERT ... ON DUPLICATE KEY UPDATE`,唯一键应为 `(stock_code, trade_date)`)。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `stock_code` | VARCHAR | 交易所前缀式(`SZ000001`) |
|
||
| `trade_date` | INT | YYYYMMDD |
|
||
| `signal_type` | VARCHAR | `BUY` / `WATCH` / `SELL` / `DROPPED`(`AVOID` 入库时映射为 `SELL`) |
|
||
| `confidence_score` | INT | 0–100 |
|
||
| `support_level` / `pressure_level` | DECIMAL | 支撑/压力位 |
|
||
| `analysis_summary` | TEXT | 中文研报(Markdown) |
|
||
| `raw_logic_json` | TEXT/JSON | 完整 decision JSON(含 `forecast` / `forecast_script`) |
|
||
| `visual_pattern` | VARCHAR | 视觉识别形态 |
|
||
| `smart_score` | FLOAT | 资金评分 |
|
||
| `updated_at` | DATETIME | 更新时间 |
|
||
|
||
消费者:`/api/pool`、`/api/stock/{code}`、`/api/v1/reports/export_csv`、`DailyInspector`(对账)、`ReviewerAgent`(取上次结论)、`intraday_watcher`(取昨日底牌)。
|
||
|
||
### 2.3 `strategy_audit_log` — 审计日志(自动建表)
|
||
|
||
`daily_scan_v2._init_audit_table` 启动时自动 `CREATE TABLE IF NOT EXISTS`。
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `id` | PK 自增 |
|
||
| `stock_code` | 代码 |
|
||
| `audit_date` | INT 审计日 |
|
||
| `strategy_date` | INT 被审策略日 |
|
||
| `verdict` | `MAINTAIN` / `ADAPT` / `FAIL` |
|
||
| `reason` | TEXT 审计理由(截断 2000) |
|
||
| `created_at` | DATETIME |
|
||
| INDEX | `idx_code_date(stock_code, audit_date)` |
|
||
|
||
### 2.4 `gp_stock_category` — 行业归属
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `ts_code`, `trade_date` | 维度(按日期变化,支持历史行业切换) |
|
||
| `industry` | 行业名称 |
|
||
|
||
消费者:`SectorMapper`(全内存加载 + 二分查找历史行业;行业名 CRC32 哈希成 int ID)、`data_loader.fetch_sector_info`。
|
||
|
||
### 2.5 `trading_position` — 持仓快照(下游维护,经 153 代理读取)
|
||
|
||
由下游交易系统维护的**当前持仓**快照表,完整 DDL 不在本项目。本系统一律经 `PROXY_DB_URL`(153 代理)做**单表 SELECT**(代理禁多表联查),且**仅消费 `stock_code` 一列**。
|
||
|
||
消费者:`periodic.position_intraday_check`(持仓体检轮询,见 PIPELINES ⑥)、`alert_query_service.query_alerts_by_positions`(`by_positions` 告警聚合)。
|
||
|
||
> 表内 `stock_code` 已实测确认为**点式**(如 `000636.SZ`,2026-07-03 查证)。持仓体检的 TP_BRAIN 锁键继承表内原文 = 点式,与告警侧锁互认成立;告警聚合侧另有双格式兼容兜底。
|
||
|
||
---
|
||
|
||
## 3. PostgreSQL · `factordb`(192.168.16.150)
|
||
|
||
量化评分、资金流、市场情绪。
|
||
|
||
### 3.1 `t_signal_daily_results` — 量化评分(选股淘金源)
|
||
|
||
| 字段 | 说明 |
|
||
|---|---|
|
||
| `ts_code`, `trade_date`(DATE) | 维度 |
|
||
| `total_score` | 综合评分(**小数 0~1,代码里 ×100 转百分制**) |
|
||
|
||
消费者:
|
||
- `daily_scan_v2.get_quant_score`:取当日评分作为 Smart Score 传给大脑。
|
||
- `daily_scan_v2.get_discovery_queue`:淘金池筛选(最新日 `total_score > 0.9` 且较 5 日前上升)。
|
||
|
||
### 3.2 资金流系列(模型 `MoneyFlow` / `ConceptMoneyFlow` / `IndustryMoneyFlow`)
|
||
|
||
- `gp_moneyflow_ths` — 个股资金流:`trade_date, symbol, ts_code, name, pct_change, latest, net_amount, net_d5_amount, buy_lg/md/sm_amount(+_rate)`。
|
||
- `gp_concept_moneyflow_ths` — 概念资金流:`concept_code, concept_name, lead_stock, net_buy/sell/net_amount` 等。
|
||
- `gp_industry_moneyflow_ths` — 行业资金流:结构同概念。
|
||
|
||
> 这些表已建模,但在当前 V6 主链路中未见直接消费(资金维度主要通过 PG 的 `total_score` 与因子表的 `obv_qfq` 体现)。
|
||
|
||
### 3.3 其它(`data_loader` 读取)
|
||
|
||
- `gp_market_sentiment`:`trade_date, up_down_ratio, median_pct_chg, pct_chg_gt_5_count`。
|
||
- `gp_sector_daily`:`trade_date, sector_name, avg_pct_chg, relative_strength, leader_stock`。
|
||
|
||
### 3.4 `gp_pattern_analysis` — 旧形态线(模型 `PatternAnalysis`)
|
||
|
||
⚠️ 属已废弃管线(见 `ARCHITECTURE.md` §7)。字段:`symbol, start_date, end_date, pattern_name, is_bullish, confidence, analysis_json(JSONB), theoretical_curve(JSONB), context_snapshot(JSONB), backtest_status, similarity_score, actual_return, exit_date, holding_days`。`backtest_status` 流转:`PENDING_RENDERING → PENDING → FINISHED/INVALID/CANCELLED/WIN/LOSS/TIMEOUT`。
|
||
|
||
---
|
||
|
||
## 4. MongoDB · `stock_predictions`(192.168.16.222)
|
||
|
||
### `stock_groups` — 核心选股池
|
||
|
||
每个文档含一个 `stock_codes` 数组字段。`daily_scan_v2.get_mongo_stock_pool` 汇总所有文档的 `stock_codes`,过滤出以 `SH`/`SZ` 开头的代码去重后作为核心池。
|
||
|
||
---
|
||
|
||
## 5. Redis-B · 行情/信号实例(192.168.18.208)
|
||
|
||
> 注意:Celery 总线(`REDIS_URL`,16.150 db7)不在此列。库号经 `settings.SIGNAL_REDIS_DB_*` 配置。
|
||
|
||
### 5.1 db 2(`SIGNAL_REDIS_DB_INTRADAY`)— 盘中告警与信号
|
||
|
||
| 键 | 类型 | 方向 | 说明 |
|
||
|---|---|---|---|
|
||
| `intraday_alerts:{YYYY-MM-DD}` | Stream | 上游写 / watcher 读 | 离散告警(consumer group `bionic_audit_group`) |
|
||
| `mtf:intraday:stream:metrics` | Stream | 上游写 / watcher 读 | 事件式资金异动告警(2026-06 协议升级,字段 `direction/z/mode/window_net/cum_large_amount`;旧 `smart_score` 协议过渡兼容) |
|
||
| `intraday_signals:{YYYY-MM-DD}` | Stream | `tasks_intraday.broadcast_signal` 写 | ENTRY/EXIT 反转/止盈信号(见 5.4) |
|
||
| `bionic:signal_timeline:{date}:{ts_code}` | List | watcher 读写 | 当日该股信号时间线(喂给风控仲裁),TTL 12h |
|
||
| `bionic_lock:{type}:{date}:{ts_code}` | String | watcher / tasks_risk / tasks_periodic | 防抖锁。碰撞类 BREAK_*/BULLISH_BRAIN/COLD_START_RESCAN/TP_BRAIN TTL 2h(**TP_BRAIN 由告警止盈评估与持仓体检共用同一把锁**,体检写入值 `holding_check`;无价/异常时体检会释放锁供下轮重试);METRICS_RISK 30min;**ENTRY_GATE 30min(建仓仲裁同股重判节流,context 构造失败时释放供下轮重试)**;**RESCAN_GLOBAL 5min(统一重算节流,跨碰撞/风控/止盈/冷启动去重)** |
|
||
| `bionic:internal_alerts_state:{date}` | Hash | watcher | 收件箱去重 + 处理状态,TTL 48h |
|
||
| `bionic:risk_rescan:{ymd}:{ts_code}` | Hash | tasks_risk | SELL→重算高水位(`hwm_conf/last_ts`),TTL 1 天 |
|
||
|
||
> **资金告警**:`capital_accumulation`(放量吸筹,UP)/ `capital_distribution`(放量出货,DOWN)为上游告警流新增源,`metadata` 含 `main_net_ratio/divergence/purified_volume`,watcher 经 `_enrich_capital_semantics` 拼成带数字的证据描述喂大脑。`Massive_Outflow` / `Massive_Inflow` 则是 watcher 对 metrics 流(mode=z)的合成告警记录(`value=z`、`metadata` 携 direction/z/mode/window_net/cum),压入时间线供风控仲裁消费。
|
||
|
||
> **收件箱状态码**(`bionic:internal_alerts_state:{date}` 的 `{uid}:status` 取值):
|
||
> - 看多:`BULLISH_DISPATCHED` / `BULLISH_IMMUNE`(昨日已BUY/MAINTAIN且未达DANGER止盈门槛)/ `BULLISH_COLDSTART` / `BULLISH_LOCKED`
|
||
> - 止盈:`TP_DISPATCHED`(持仓+DANGER派发止盈研判)/ `TP_LOCKED` / `TP_NO_BASELINE`
|
||
> - 碰撞:`COLLIDE_DISPATCHED` / `COLLIDE_IMMUNE` / `COLLIDE_NO_BREAK`(未破位拦截)/ `COLLIDE_NO_PRICE` / `COLLIDE_LOCKED` / `COLLIDE_COLDSTART`
|
||
> - 风控(DOWN/metrics流出):`RISK_TRIGGERED` / `RISK_COOLDOWN`(30min锁命中)
|
||
> - metrics 暖机:`OUTFLOW_COLD_LOGGED` / `INFLOW_COLD_LOGGED`(mode=cold 仅留痕)
|
||
> - 组合形式:DOWN/流出写 `{风控状态}|{碰撞状态}`(如 `RISK_TRIGGERED|COLLIDE_NO_BREAK`);流入写 `INFLOW|{TP_*或COLLIDE_*}`。
|
||
### 5.2 db 3(`SIGNAL_REDIS_DB_ACTIONS`)— 风控卖出指令
|
||
|
||
| 键 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `bionic:signals:llm_sell_actions` | Stream | `tasks_risk` 写 SELL(见 5.5),`/api/v1/risk/sell_signals` 读 |
|
||
|
||
### 5.3 db13(`SIGNAL_REDIS_DB_QUOTES`)— 实时行情
|
||
|
||
| 键 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `tushare:rt_min:1MIN:{ts_code}` | String | 每股一个 key(`ts_code` 为 Tushare 式,拼在键名内)。值为**当日分钟 K 线 JSON 数组**,每根含 `open/close/high/low/vol/amount`,时间正序。取现价 = `json.loads(get(key))[-1]['close']`(用 `get` 取整个 key,顶层是 list,取最后一根 `[-1]`)。`intraday_watcher` 与 `tasks_risk` 均按此读取。 |
|
||
|
||
### 5.4 ENTRY/EXIT 信号 Payload(`intraday_signals` 流,扁平结构)
|
||
|
||
`schema_version, signal_id, ts_code, trade_date, trigger_time, producer_id="bionic_brain_intraday_v2.0", action(BUY/SELL), signal_type(ENTRY/EXIT), verdict(REVERSAL_SELL/REVERSAL_BUY/TAKE_PROFIT,统一区分止损/入场/止盈离场;下游不识别可忽略), suggested_price, confidence, in_candidate_pool, signal_validity(JSON, 含 expires_at/ttl_seconds=300), audit_reason, component_scores, pred_upside, pred_downside`。
|
||
|
||
> **同股同日下游消费规则(B1)**:同一 `ts_code` 多条信号按 stream 消息 ID 时序**后写覆盖先写**;大脑审计信号(`producer_id="bionic_brain_intraday_v2.0"` 且 `verdict` 非空)为对上游原始信号的知情二审,语义上覆盖上游 ENTRY/EXIT。解决上游 `intraday_buy_emitted` 自写 ENTRY 与我方 TAKE_PROFIT 同流并存的方向冲突。
|
||
|
||
### 5.5 SELL 指令 Payload(`llm_sell_actions` 流)
|
||
|
||
包在 `{"data": <json>}` 中:`ts_code, action="SELL", confidence, dominant_signal, llm_reason, is_fallback, timestamp(ms)`。`dominant_signal` 为风控仲裁的主导信号枚举(如 `daily_qrs_symmetric_down/Massive_Outflow/...`),**新增 `take_profit`**——由持仓止盈(`tasks_intraday._emit_sell_action`)写入,下游据此区分"风控止损卖出"与"止盈离场"。
|
||
|
||
### 5.6 上游单股信号查询 API(192.168.16.188:28000,非 Redis)
|
||
|
||
上游提供的**纯 HTTP 按需计算**接口(单股冷算,无需预热),响应条目格式对齐 db2 告警流。当前唯一消费者:持仓体检 `workers/holding_check.py`(每次体检即时拉取,超时 4s)。
|
||
|
||
| 端点(GET,参数 `ts_code` 点式) | 内容 | 体检 context 中的角色 |
|
||
|---|---|---|
|
||
| `/api/v1/qrs/minute` | 分钟级 QRS(盘中择时核心分量,需 ~30 根分钟窗口,约 10:00 起可用) | 第一部分·盘中实时信号现状 |
|
||
| `/api/v1/qrs/daily` | 日线 QRS | 同上 |
|
||
| `/api/v1/capital/distribution` | 资金分布(`main_net_ratio` / `divergence` / `purified_volume`,早盘提纯量可能不足) | 同上 |
|
||
|
||
响应包络(本系统消费的字段面,完整 schema 以上游为准):
|
||
|
||
```json
|
||
{"available": true, "reason": "...", "value": ..., "level": "WARNING|DANGER|...",
|
||
"metadata": {"direction": "...", "main_net_ratio": ..., "divergence": ..., "purified_volume": ...}}
|
||
```
|
||
|
||
降级语义:`available=false` / 超时 / HTTP 非 200 / 异常 → 取数函数一律返回 `None`,context 中该维度渲染为"未获取到(该维度当前无异常或数据未就绪)",**绝不中断体检**。
|
||
|
||
---
|
||
|
||
## 6. Milvus(`trader_milvus`:19530)
|
||
|
||
### 6.1 `market_memories_v2` — 当前记忆库(活跃)
|
||
|
||
向量口径:`z-score(close 64) + z-score(obv 64) = 128 维`(训练/推理一致,见 `ARCHITECTURE.md` §5)。索引 `L2 / IVF_FLAT`。
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|---|---|---|
|
||
| `stock_code` | VARCHAR | Tushare 式代码 |
|
||
| `trade_date` | INT64 | YYYYMMDD |
|
||
| `industry` | INT64 | 行业 CRC32 ID |
|
||
| `vector` | FLOAT_VECTOR(128) | 特征向量 |
|
||
| `score_smart` / `score_trend` / `score_chip` / `score_heat` | FLOAT | 影子分数(rolling rank 百分位) |
|
||
| `label_profit` | FLOAT | 后验:未来 20 日最高价收益率 |
|
||
|
||
写:`MinerController._insert_to_milvus`(字段顺序须与上表一致)。读:`tasks_brain`(`anns_field="vector"`,`output_fields=[stock_code, trade_date, label_profit]`)。
|
||
|
||
> ⚠️ Miner 假设该集合**已存在**(`Collection("market_memories_v2")`),不会自动建表。首次部署需手工创建集合 + 索引,DDL/脚本见 `DEPLOYMENT.md` §5。
|
||
|
||
### 6.2 `market_failures_v1` — 失败记忆
|
||
|
||
完整 Schema(2026-07-09 实测穷举):`id`(主键) / `vector`(FLOAT_VECTOR 128) / `stock_code` / `fail_date`(INT64) / `reason`(VARCHAR) / `original_signal`(VARCHAR)。
|
||
|
||
读:`tasks_brain` 检索(`output_fields=[stock_code, reason]`),命中则在 Prompt 注入「痛苦记忆」。写:**2026-07-09 起由二期 L2 自动沉淀**(`meta_reflection.sink_failures`,每晚 ≤20 条,schema 自适应插入 + `decision_outcome.l2_sunk` 防重;早期为人工维护)。⚠️ 本环境 pymilvus 的 `str(dtype)` 返回枚举数字(101=FLOAT_VECTOR),判型须用 DataType 数字码。
|
||
|
||
### 6.3 `market_memories_v1` — 旧记忆库(已弃用)
|
||
|
||
由 `memory_service.py` + `vectorizer.HolographicVectorizer`(60 日线 + 40 周线 + 20 量比 + 8 状态 = 128 维)维护,字段 `memory_id, stock_code, event_date, embedding(128), outcome_label, profit_20d, raw_data(json)`。已被 v2 取代,见 `ARCHITECTURE.md` §7。
|
||
|
||
---
|
||
|
||
## 7. 数据流向速查
|
||
|
||
| 数据 | 来源 | 去向 / 消费者 |
|
||
|---|---|---|
|
||
| 选股池 | Mongo `stock_groups` + PG `t_signal_daily_results` | `DailyCognitiveLoop` |
|
||
| 行情/因子 | MySQL-B `gp_stock_factor_pro_*` | `DataLoader` → 大脑/Miner |
|
||
| 特征向量 | `FactorCalculator`/`Miner` | Milvus `market_memories_v2` |
|
||
| 策略结论 | 大脑 `save_to_database` | MySQL-B `strategy_daily_results` → API/前端 |
|
||
| 盘中告警 | 上游 → Redis-B db2 | `intraday_watcher` → 风控/大脑 |
|
||
| 实时行情 | 上游 → Redis-B db13 | `intraday_watcher` |
|
||
| SELL 指令 | `tasks_risk` / 持仓止盈·体检 → Redis-B db3 | `/api/v1/risk/sell_signals` |
|
||
| ENTRY/EXIT | `tasks_intraday` → Redis-B db2 | 下游交易系统 |
|
||
| 持仓快照 | 下游交易系统 → `trading_position`(153 代理读) | `position_intraday_check`(体检)、`by_positions` 告警聚合、ENTRY_GATE(持仓数)、watch 扫描(持仓态) |
|
||
| 单股盘中信号 | 上游单股 API(188:28000,§5.6) | `holding_check` 体检 context |
|
||
| 建仓意向单 | 上游 → `trading_order` 状态 '7'(153 代理,§8.1) | `entry_gate_poll` 仲裁 → 置 '6' / 留 '7' |
|
||
| 决策账本 | 盘中裁决出口 → `decision_ledger`(§8.2) | ENTRY_GATE 交易史注入、L1 判分 |
|
||
| 关注条件 | 大脑布防 → `watch_conditions`(§8.4) | `watch_condition_scan` → CONDITION_HIT |
|
||
| 判分结果 | `outcome_scorer` → `decision_outcome`(§8.3) | 滚动摘要、L2/L3(二期) |
|
||
|
||
---
|
||
|
||
## 8. 153 代理侧 · 决策闭环 V7 表
|
||
|
||
> 一律经 `PROXY_DB_URL` 访问,**严格单表**(代理禁多表联查;判分器用"两次单表查询 + 内存比对"替代 JOIN)。建表 DDL 见仓库根 `ddl_decision_loop_v7.sql`(2026-07-03 已在 153 侧手工建立)。设计详见 `DECISION_LOOP_DESIGN.md` §5。
|
||
|
||
### 8.1 `trading_buy_plan` — 买入计划表(仲裁状态机所在,2026-07-07 更正)+ `trading_order` — 成交执行表
|
||
|
||
> ⚠️ **表更正(2026-07-07 实盘发现)**:置 7 的状态机在 **`trading_buy_plan.is_active`**,不在 `trading_order.order_status`(设计对账时曾误按后者的 DDL 建轮询,上游切换上线首日暴露;fail-closed 期间无错误买入)。`trading_order` 仍是成交执行表,作 ENTRY_GATE **真实交易史**来源(completed/filled 双向单,严格模式/连败判定依据)。
|
||
|
||
`trading_buy_plan.is_active` 状态词汇(**2026-07-09 上游代码实证版**):`3`=盘中评估池(上游 orchestrator/intake **只认 3**)→ 上游评估触发时 `mark_intraday_triggered` 做 **3→7**(幂等守卫 `WHERE is_active=3`,同时经其 publisher 发带 `entry_score/price_band/target_price` 的买入信号)→ `7`=已触发待我方仲裁(**不进上游评估池、不产信号**;但仍在 M16 风控监控池)→ 我方 APPROVE 置 `6`=待挂单(下游取走置 `1`);`5`=上游盘中拒、`2`=盘前审。REJECT 留 7(上游不会再碰)。**V7.3(已启用)**:我方 REVERSAL_BUY 变盘裁决可将今日 `5` 翻案回 **`3`(回评估池,绝不直置 7——那是永无信号的死单)**,`approved_by='bionic_revive'` + `change_reason` 署名,上游重评估触发后经 3→7 进我方 gate 二审。我方写入词汇 = **{6, 3}**,其余状态不写。
|
||
|
||
本系统消费字段:`id`(仲裁回写锚,账本 ref=`plan_{id}`) / `stock_code`(点式) / `target_price`(**实为计划买入限价**) / `tp_ratio`/`sl_ratio`(换算上望位=买价×(1+tp)、止损位=买价×(1−sl),直接供 RR) / `buy_amount`(估算股数) / `strategy_id` / `factor_code`(来源池 TEMP_POOL/event_driven/TRADING_POOL) / `prob_thresh`/`hold_days` / `update_time`(置7时刻,FIFO)。仅取 `trading_time >= 当日` 的计划(隔日 7 单由上游过期机制处置)。回写仅一种:`UPDATE trading_buy_plan SET is_active=6, approved_by='bionic_gate' WHERE id=? AND is_active=7`。
|
||
|
||
### 8.2 `decision_ledger` — 决策账本(共用基座)
|
||
|
||
每笔盘中裁决的结构化记账。写入方:ENTRY_GATE 出口(ENTRY_APPROVE/ENTRY_REJECT,`price_at` 必填=反事实判分锚)+ `process_intraday_audit` 通用落笔(REVERSAL_*/TAKE_PROFIT/MAINTAIN_HOLD/MAINTAIN,全 direction 含 CONDITION_HIT/HOLD_CHECK)。关键字段:`ts_code`(点式) / `kind` / `direction` / `price_at` / `ref_id`(order_id 或 cond_id) / `strategy_id` / `gate_mode`(normal/strict) / `extra_json`(严格模式 checklist) / `outcome_scored`(L1 位图: 1=T+1, 2=T+5, 4=T+20)。消费方:ENTRY_GATE 交易史注入、L1 判分。与 `strategy_audit_log` 分工:audit_log 记思考文本(人查),ledger 记结构化动作(机读)。
|
||
|
||
### 8.3 `decision_outcome` — L1 判分结果
|
||
|
||
维度键 `(ref_type, ref_id, horizon)` 唯一(INSERT IGNORE 幂等)。`ref_type` ∈ `strategy`(ref_id=`{stock_code}_{trade_date}`)/ `ledger`(账本 id)/ `watch`(cond_id);`horizon` ∈ 1/5/20。指标:`ret_pct / excess_pct`(对 000001.SH) `/ dir_hit / mdd_pct / post_high_pct`(卖飞度) `/ support_tested/held / pressure_tested/broken / conf_bucket / visual_pattern / fund_structure / gate_mode`。写入方 `outcome_scorer`(每晚 23:45,从最老开始回填,水位 800 行/晚)。
|
||
|
||
### 8.4 `watch_conditions` — 大脑声明的关注条件
|
||
|
||
状态机 `armed → hit / expired / superseded`。生成端 `tasks_brain._persist_watch_conditions`(校验+布防,新策略落库时该股旧 armed 全部 superseded);扫描端 `watch_scanner`(每 5 分钟机检,hit 用条件 UPDATE 防双派);`verdict` 由 CONDITION_HIT 裁决回写。字段:`cond_id`(`{ymd}_{prefix}_{seq}`) / `cond_type`(break_above/break_below/volume_surge/pullback_to/time_stop) / `level / volume_gate / vol_base`(生成时算好的近5日均量) / `horizon_days / expires_date`(交易日口径) / `then_action`(UPGRADE/EXIT_WARN/RECHECK) / `note`(声明逻辑,命中时喂回大脑) / `hit_at / hit_price / verdict`。
|