as-event/DATA_MODEL.md

23 KiB
Raw Permalink Blame History

Bionic Trader 数据模型

全部库表、Milvus 集合、Redis 键与 MongoDB 集合的 Schema 与上下游关系。存储拓扑与连接配置见 ARCHITECTURE.md §2.2。

约定:

  • 股票代码在不同库里有两种格式 —— 交易所前缀式SH600000 / SZ000001strategy_daily_resultsgp_day_data因子分表 gp_stock_factor_pro_*symbol 用)与 Tushare 式600000.SH / 000001.SZPG、行情 Redis、盘中告警流用。代码里通过 parts[1]+parts[0] 互转。

    ⚠️ 2026-07-07 实测更正:因子分表 symbol前缀式SH603501 命中、603501.SH 查空),早期文档误记为 Tushare 式。全链取数一律传前缀式给 DataLoader

  • 日期同样有两种:INT YYYYMMDDstrategy_daily_resultstrade_date)与 DATE/DATETIME

1. MySQL-A · 本地库 db_gp_cj192.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_pricesDataLoader._append_raw_daily_fallbackV7.2 日线兜底因子分表尾部缺行时按重叠日对账后补尾2026-07-07 起)

1.2 gp_chip_data — 筹码分布

字段 说明
symbol, trade_date 主键维度
winner_rate 获利盘比例
cost_5pct / cost_50pct / cost_95pct 成本分位

消费者:data_loader.fetch_chip_dataget_resistance_support_map(算支撑压力)。

1.3 zs_day_data — 大盘指数日线

字段 说明
symbol 指数代码000001.SH / 399001.SZ / 000688.SH / 399006.SZ
timestamp 日期
close 收盘
percent 涨跌幅
amount 成交额

消费者:MarketSentimentAnalyzer(大脑第 3 步「水温」)、GlobalIndexLoaderMiner预留

注意intraday_watcherstrategy_daily_resultsPROXY_DB_URLShardingSphere 代理 192.168.16.153:3307已前置 16.150 主业务库),与日终主链路写入库(SOURCE_DB_EXT_DSN/16.150)一致,不读本库。早期文档误记为本库(DB_MYSQL_URL/18.199),已订正。


2. MySQL-B · 外部主业务库 factordb_mysql192.168.16.150

系统的运行主库。tasks_brain.db_enginedaily_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_databaseINSERT ... ON DUPLICATE KEY UPDATE,唯一键应为 (stock_code, trade_date))。

字段 类型 说明
stock_code VARCHAR 交易所前缀式(SZ000001
trade_date INT YYYYMMDD
signal_type VARCHAR BUY / WATCH / SELL / DROPPEDAVOID 入库时映射为 SELL
confidence_score INT 0100
support_level / pressure_level DECIMAL 支撑/压力位
analysis_summary TEXT 中文研报Markdown
raw_logic_json TEXT/JSON 完整 decision JSONforecast / forecast_script
visual_pattern VARCHAR 视觉识别形态
smart_score FLOAT 资金评分
updated_at DATETIME 更新时间

消费者:/api/pool/api/stock/{code}/api/v1/reports/export_csvDailyInspector(对账)、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 IDdata_loader.fetch_sector_info

2.5 trading_position — 持仓快照(下游维护,经 153 代理读取)

由下游交易系统维护的当前持仓快照表,完整 DDL 不在本项目。本系统一律经 PROXY_DB_URL153 代理)做单表 SELECT(代理禁多表联查),且仅消费 stock_code 一列

消费者:periodic.position_intraday_check(持仓体检轮询,见 PIPELINES ⑥)、alert_query_service.query_alerts_by_positionsby_positions 告警聚合)。

表内 stock_code 已实测确认为点式(如 000636.SZ2026-07-03 查证)。持仓体检的 TP_BRAIN 锁键继承表内原文 = 点式,与告警侧锁互认成立;告警聚合侧另有双格式兼容兜底。


3. PostgreSQL · factordb192.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_sentimenttrade_date, up_down_ratio, median_pct_chg, pct_chg_gt_5_count
  • gp_sector_dailytrade_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_daysbacktest_status 流转:PENDING_RENDERING → PENDING → FINISHED/INVALID/CANCELLED/WIN/LOSS/TIMEOUT


4. MongoDB · stock_predictions192.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_URL16.150 db7不在此列。库号经 settings.SIGNAL_REDIS_DB_* 配置。

5.1 db 2SIGNAL_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 2hTP_BRAIN 由告警止盈评估与持仓体检共用同一把锁,体检写入值 holding_check;无价/异常时体检会释放锁供下轮重试METRICS_RISK 30minENTRY_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_tsTTL 1 天

资金告警capital_accumulation放量吸筹UP/ capital_distribution放量出货DOWN为上游告警流新增源metadatamain_net_ratio/divergence/purified_volumewatcher 经 _enrich_capital_semantics 拼成带数字的证据描述喂大脑。Massive_Outflow / Massive_Inflow 则是 watcher 对 metrics 流mode=z的合成告警记录value=zmetadata 携 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_COOLDOWN30min锁命中
  • metrics 暖机:OUTFLOW_COLD_LOGGED / INFLOW_COLD_LOGGEDmode=cold 仅留痕)
  • 组合形式DOWN/流出写 {风控状态}|{碰撞状态}(如 RISK_TRIGGERED|COLLIDE_NO_BREAK);流入写 INFLOW|{TP_*或COLLIDE_*}

5.2 db 3SIGNAL_REDIS_DB_ACTIONS)— 风控卖出指令

类型 说明
bionic:signals:llm_sell_actions Stream tasks_risk 写 SELL见 5.5/api/v1/risk/sell_signals

5.3 db13SIGNAL_REDIS_DB_QUOTES)— 实时行情

类型 说明
tushare:rt_min:1MIN:{ts_code} String 每股一个 keyts_code 为 Tushare 式,拼在键名内)。值为当日分钟 K 线 JSON 数组,每根含 open/close/high/low/vol/amount,时间正序。取现价 = json.loads(get(key))[-1]['close'](用 get 取整个 key顶层是 list取最后一根 [-1])。intraday_watchertasks_risk 均按此读取。

5.4 ENTRY/EXIT 信号 Payloadintraday_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 指令 Payloadllm_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 上游单股信号查询 API192.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 以上游为准):

{"available": true, "reason": "...", "value": ..., "level": "WARNING|DANGER|...",
 "metadata": {"direction": "...", "main_net_ratio": ..., "divergence": ..., "purified_volume": ...}}

降级语义:available=false / 超时 / HTTP 非 200 / 异常 → 取数函数一律返回 Nonecontext 中该维度渲染为"未获取到(该维度当前无异常或数据未就绪)"绝不中断体检


6. Milvustrader_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_brainanns_field="vector"output_fields=[stock_code, trade_date, label_profit])。

⚠️ Miner 假设该集合已存在Collection("market_memories_v2")),不会自动建表。首次部署需手工创建集合 + 索引DDL/脚本见 DEPLOYMENT.md §5。

6.2 market_failures_v1 — 失败记忆

完整 Schema2026-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.HolographicVectorizer60 日线 + 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_position153 代理读) position_intraday_check(体检)、by_positions 告警聚合、ENTRY_GATE持仓数、watch 扫描(持仓态)
单股盘中信号 上游单股 API188: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_scorerdecision_outcome§8.3 滚动摘要、L2/L3二期

8. 153 代理侧 · 决策闭环 V7 表

一律经 PROXY_DB_URL 访问,严格单表(代理禁多表联查;判分器用"两次单表查询 + 内存比对"替代 JOIN。建表 DDL 见仓库根 ddl_decision_loop_v7.sql2026-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_triggered3→7(幂等守卫 WHERE is_active=3,同时经其 publisher 发带 entry_score/price_band/target_price 的买入信号)→ 7=已触发待我方仲裁(不进上游评估池、不产信号;但仍在 M16 风控监控池)→ 我方 APPROVE 置 6=待挂单(下游取走置 15=上游盘中拒、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)、止损位=买价×(1sl),直接供 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_REJECTprice_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_typestrategyref_id={stock_code}_{trade_date}/ ledger(账本 id/ watchcond_idhorizon ∈ 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