# tradingSystem · 持仓管理系统总体设计 (PMS)

> 状态: **V0.4，设计定稿·开发启动** | 日期: 2026-07-27
> **V0.4 修订（依用户六点反馈）**：①命令目录**不再分期，一次性全部实现**——功能开发一次到位，上线按外部依赖分三步切换（§14）；②新增独立交付物 `QMT_INTERFACE_REQUIREMENTS.md`（与 QMT 侧协商的数据与接口需求清单，含资金快照与指令通道建议 DDL）；③决策系统配套修改获批，可直接开发；④行业划分接口给出具体方案（§5：`pms_industry_map` 自定义映射表 + 可插拔适配器）；⑤管理页面技术形态确认（FastAPI + 单页）。
> **V0.3 修订（依用户九点反馈）**：①术语可读性修订，清除"买腿/卖腿/回轧"等机翻词；②**重大更正——决策系统保持在线**：形态计算、每日定时分析、盘中研判等核心功能一概不动，改动仅限"执行出口改道"（与 QMT 侧的直接读写一期即切断，权限移交持仓系统），V0.2 按"决策系统整体下线"的理解作废；③上游量化系统输出不变，**持仓系统的建仓计划围绕上游输出建立**；④一期 autonomy 默认"提议待确认"获确认；⑤`trading_order`/`trading_position` 仍归下游系统维护，仅管理权限由决策系统移交持仓系统；⑥参数设置、命令下达与数据展示以**可视化后端页面**实现；⑦命令场景目录扩充（§3.1，待用户决断取舍）；⑧内置择时规则全部参数化、页面可调；⑨行业集中度改为**硬性拦截**，行业划分依据留接口。
> 沿革：V0.1 中间层/两级闸门/安全垫三义 → V0.2 命令驱动/百分比仓位 → 本版。冲突处以本版为准。
> 关联文档（bionic_trader 仓库）: `DECISION_LOOP_DESIGN.md`、`DATA_MODEL.md`、`PIPELINES.md`。写作纪律沿袭既有文档：术语先白话、阈值给硬数字且可配置、失败路径显式、未确认事项进清单。

---

## 0. 一句话目标与角色分工

**一句话**：用户通过管理页面下达大方向命令（规模、上限、升降仓、对某股做T），持仓系统把命令翻译成分股分批的行动方案并管好账本与纪律，决策系统负责研判与择时，下游系统负责挂单成交——四层各司其职，谁也不越权。

| 层 | 职责 | 频次 |
|---|---|---|
| 用户 | 中低频大方向命令：总规模 200 万、总仓上限 60%、单股上限 8%、降仓 10%、对某股做T、清仓某股 | 天/周级 |
| **持仓系统（本系统，PMS）** | 命令解析 → 方案制订（哪只股、什么动作、多少数量）→ 账本/批次/安全垫/纪律 → 指令编排与下发 | 持续 |
| 决策系统（bionic_trader） | **核心功能照旧**：每日认知闭环、形态计算、盘中研判、风控仲裁、反思闭环；对持仓系统提供研判与择时服务。**不再直接指挥下游** | 每日 + 盘中 |
| 下游系统（QMT 侧） | 挂单、成交、维护 `trading_order` / `trading_position`（两表仍归其维护） | 盘中 |

**V0.3 已定决策**：
1. **命令驱动**：用户命令是最高约束与主要驱动源；持仓系统的自主判断（如"跌到 −15% 能不能补仓"）是第二驱动源，受命令参数约束。
2. **连接关系（一期即生效）**：持仓系统 ↔ 决策系统直接交互；持仓系统 ↔ 下游系统交互；**决策系统与下游系统断开**——对下游的管理权限（下单、审批、卖出指挥）由决策系统移交持仓系统。决策系统的分析产出全部保留并成为持仓系统的输入。
3. **上游不变**：上游量化系统的输出（买入计划、告警、评分池）原样保留，持仓系统的建仓计划围绕这些输出建立。
4. **决策方式**：规则引擎为主 + 关键点研判。仓位数学全部确定性代码；定性研判（该不该补仓、回踩是洗盘还是出货、何时出手）委托决策系统——它本来就是研判系统，持仓系统不另建一套研判栈。
5. **仓位框架**：百分比制（占总规模的 %），单股分批 50/25/25，含一手可行性检查；风险敞口只做披露告警，不反推数量。
6. **事实源**：命令 = 用户；实际持仓/成交 = 下游两表（持仓系统账本定期对账）；研判 = 决策系统。

---

## 1. 总体架构与决策系统配套修改清单

```
     用户（管理页面：参数设置 / 命令下达 / 进度与账本查看 / 提议确认）
              │
    ┌─────────▼──────────────────────────────────────────────┐
    │  持仓系统 tradingSystem (PMS)                            │
    │  命令系统 → 方案生成器 → 持仓账本(批次/成本/安全垫)         │
    │  → 动作引擎(命令驱动 + 自主提议) → 规则闸 → 研判/择时       │
    └────┬────────────────────────────▲───────────────────────┘
         │ 指令(买入/卖出, 带数量限价)   │ 研判与择时答复 / 每日结论 / 盘中信号
         ▼                            │
   下游系统(QMT侧)                决策系统 bionic_trader
   挂单/成交/两表维护              (核心分析功能照旧, 与下游断开)
         │                            ▲
         └── 成交回放/对账 ──▶ PMS ────┘（上游量化输出 → 供 PMS 建仓规划 + 供决策系统分析, 均不变）
```

**三条铁律**：

1. **命令至上**：任何自动决策不得突破用户命令参数；任务命令与自主动作冲突时命令优先，在途自主指令自动撤销；命令之间冲突由用户在页面裁决，系统不代替用户仲裁。
2. **分工不越权**：持仓系统决定「做什么、多少」，决策系统决定「该不该、何时」（定性研判与择时），下游只管执行。决策系统研判服务不可用时，持仓系统降级为保守规则 + 人工确认，**不自建第二套研判**。
3. **先记账后动作 + 故障即守成**：指令先落表（幂等键）再下发；持仓系统故障 = 不产生新指令、持仓保持现状；每条降级路径显式日志；账本与下游定期对账，以下游为实际持仓事实源。

**决策系统配套修改清单**（原则：**分析核心零改动，仅执行出口改道**；在 bionic_trader 仓库实施）：

| 类别 | 内容 |
|---|---|
| 零改动（核心功能，已复查确认保留） | 每日认知闭环（22:30 扫描 → 信号/支撑压力/研报/预测曲线）、视觉形态识别、宏观水温、盘中事件研判（watcher/审计）、风控仲裁、持仓体检 HOLD_CHECK、watch_conditions、反思闭环 L1/L2/L3 与运营日报、月度记忆挖掘、对外 API |
| 出口改道 | ①ENTRY_GATE 不再回写 `trading_buy_plan`（建仓审批权移交 PMS），其仲裁能力转为**应 PMS 请求的建仓研判服务**；②风控 SELL、盘中 ENTRY/EXIT 广播照常产出，但**下游停止直接执行**，改由 PMS 订阅消化后统一决定卖出指令；③持仓体检、止盈研判结论同样以信号形式供 PMS 消费 |
| 新增（接入性） | 研判服务扩展：`process_intraday_audit` 新增 PMS 请求类 direction（建仓研判 / 补仓研判 / 择时研判），输入由 PMS 提供 context，输出结构化裁决给 PMS——复用其既有仲裁哲学与代码路径，不重写 |

---

## 2. 术语表

| 术语 | 白话解释 |
|---|---|
| 参数命令 | 改变长期约束的命令（规模/上限/持仓数/自主档位/做T授权等），立即生效并持久化，页面可随时修改 |
| 任务命令 | 有生命周期的一次性使命（降仓 10%、清仓某股、建仓某股至 6%），状态机 待处理→规划中→执行中→完成/撤销，进度可查、可撤销 |
| 方案 (plan) | 一条任务命令展开成的分股行动清单（A 减半、B 清仓、C 停止买入…），每项带数量、优先级、执行窗口 |
| 择时 | 一条指令在执行窗口内的具体出手时机，由决策系统研判；未接通或不可用时用内置保守规则 |
| 底仓 / 批次 | 单股目标仓位按 50%/25%/25% 分三批：底仓(BASE)/回踩补足(FILL)/盈利加仓(ADD)；另有补仓(DCA)/做T(T0) 批 |
| 安全垫 (cushion) | (现价 − 摊薄成本)/摊薄成本，含做T利润。≥3% 为厚垫(SOLID)，解锁加仓资格 |
| 自主提议 | 非命令触发的动作候选（规则扫描出的补足/加仓/补仓/减仓机会），按自主档位决定自动执行还是待用户确认 |
| 自主档位 (autonomy) | `full`(闸门与研判通过即执行) / `propose_only`(增持类全部待用户确认，一期默认) / `off`(只执行命令) |
| 一手检查 | A股 100 股起买。批次金额买不足一手 → 自动合并批次（50/25/25→60/40→100），仍不足则放弃该股并提示 |

代码格式：PMS 内部一律 Tushare 点式（`600000.SH`）；读决策系统结论表转前缀式。金额单位元，数量单位股（整百）。

---

## 3. 命令系统与管理页面

### 3.1 命令场景目录（已定：不分期，全部一次性实现）

**A. 资金与总体参数（参数命令）**

| 命令 | 语义与要点 |
|---|---|
| 设定总规模 | 总操作资金（如 200 万）。注资/抽资即改此值，PMS 重算所有百分比约束；抽资导致超限 → 生成降仓提议供确认 |
| 设定总仓上限 | 如 60%。调低后超限 → 生成降仓提议供确认（不自动强平） |
| 设定单股上限 / 默认目标仓位 | 如 8% / 6% |
| 设定最大持仓数 | 如 15 只 |
| 设定自主档位 | full / propose_only / off |
| 设定预留现金比例 | 总规模中永不动用的部分（如 10%），与总仓上限双重约束 |

**B. 组合级动作（任务命令）**

| 命令 | 语义与要点 |
|---|---|
| 降仓 X%（窗口 N 日） | §3.2 全流程示例。优先级：停新买 → 清弱票 → 收利润 → 最后动底仓 |
| 升仓 X%（窗口 N 日） | 加仓对象来源：①既有持仓中垫厚且决策系统看多的票补到目标 ②上游计划池 + 决策系统研判筛出的新票建仓 |
| 全局暂停买入 / 恢复 | 避险冻结：停止一切新增买入（在途买入指令撤销），卖出与止损不受影响 |
| 全局暂停执行 / 恢复 | "休假模式"：所有自动动作暂停，仅保留账本对账与日报 |
| 一键清仓（紧急） | 全部持仓按最快节奏卖出（窗口默认 1 日，不做择时优化），页面二次确认后执行 |
| 清仓某行业 / 限制某行业上限 | 依赖行业划分接口（§5），数据源未配置时此类命令置灰并提示 |

**C. 个股级动作（任务/参数命令）**

| 命令 | 语义与要点 |
|---|---|
| 建仓某股至目标 % | 围绕上游计划/用户指定，分批投放（50/25/25），决策系统研判把关 |
| 清仓某股 / 减至 X% | 窗口内分日卖出 |
| 冻结某股 / 解冻 | 停止该股一切增持（在途撤销），卖出不受影响 |
| 做T授权 / 取消（t_ratio） | 只有授权的股票才做T；T 仓 = 持仓 × t_ratio（上限 1/3） |
| 设定某股止损价 / 目标价 | 覆盖系统默认参考位，触发即生成卖出方案（止损）或止盈提议 |
| 黑名单（永不买入）/ 白名单（优先规划） | 影响建仓候选筛选 |
| 调整命令窗口 / 撤销命令 | 对在途任务命令 |

### 3.2 「降仓 10%」全流程（任务命令示例）

```
用户在页面下达: 降仓 10% (窗口 3 个交易日)
 1. 规划: 释放金额 = 规模×10% = 20 万, 按卖出优先级凑足:
    ①撤销在途买入类任务与指令（先停止继续投入）
    ②清弱票: 浮亏且安全垫为负、持续 ≥5 日的票 → 清仓（如 B 股 8 万）
    ③收利润: 浮盈票卖出加仓批/补足批与浮盈部分, 保留底仓（如 A 股减半 7 万）
    ④仍不足 → 各票按市值等比例微减（凑足 5 万）
 2. 方案落表并在页面展示（逐股动作+数量+优先级+截止日），用户可改可撤
 3. 执行: 每条卖出指令经规则闸校验 → 决策系统择时（未接通时用内置保守择时）→ 下游挂单
 4. 每日收盘更新进度（已释放 12/20 万）；窗口末日仍未完成 → 按限价兜底完成或顺延一日并告警
 5. 完成: 页面回执（实际释放额/明细/相对命令日收盘价的执行成本）
```

### 3.3 管理页面（一期最小版）

FastAPI + 单页应用（延续 bionic `dashboard.html` 的轻量风格），四块：**参数设置**（A 类命令全部可视化编辑，改动即持久化并生效）、**命令台**（B/C 类命令下达、在途命令进度与撤销）、**持仓与账本**（每票批次/成本/安全垫/冻结状态，总览仪表）、**提议确认**（propose_only 档位下的待确认队列，一键采纳/驳回）。日报在页面可查。

---

## 4. 持仓账本（基座）

**pms_position（一票一行）**：`ts_code / status(计划|建仓中|持有|退出中|已清)` / `frozen_reason(无|命令冻结|刹车|人工)` / `total_qty / avail_qty(T+1 可卖)` / 分类持仓 `base_qty/fill_qty/add_qty/dca_qty/t0_qty` / `avg_cost(摊薄, 含T利润)` / `realized_t_profit` / `cushion_pct/cushion_state/cushion_peak` / `pct_of_scale(市值占规模%)` / 参考位快照（决策系统支撑压力，或兜底自算）/ `t0_enabled` / 纪律计数器。

**pms_lot（批次）**：`lot_type(BASE|FILL|ADD|DCA|T0)` / 数量价格日期 / 已实现盈亏。卖出核销次序 **T0 → ADD(新→旧) → DCA → FILL → BASE**（保底仓纪律）；清仓命令则全量核销。

**成交回放与对账（生命线）**：每 5 分钟增量回放 `trading_order` 成交单入批次（对不上指令的外部成交并入 BASE 并告警留痕）；盘中轻对账 + 日终全量对账，**以下游为准**修正并留调整痕迹；除权检测（数量与价格反比突变 → 按比例调整批次，比例不吻合 → ERROR 待人工）；`avail_qty` 按 T+1 规则每日重置。

---

## 5. 仓位框架：百分比制

以用户参数命令为纲（默认值即初始配置）：**规模 200 万、总仓 ≤60%、单股 ≤8%、持仓 ≤15 只**。

```
单股目标仓位 = 建仓命令指定, 默认 6%（12 万）
分批投放:  底仓 50%（6 万）→ 回踩补足 25%（3 万）→ 盈利加仓 25%（3 万）
补仓 DCA ≤ 底仓的 50%（3 万），计入单股上限，终身一次
T 仓     = 持仓市值 × t_ratio（命令参数，硬上限 1/3）
一手检查: 任一批金额 < 现价×100 → 批次自动合并（50/25/25 → 60/40 → 100），仍不足一手 → 放弃并提示
```

**风险披露线（不定量，只告警）**：每笔买入指令计算敞口 = 数量 × (买价 − 止损参考)。单笔敞口 > 规模×1% 或组合累计 > 规模×6% → 告警并在研判请求中标红。止损参考 = 决策系统支撑位（主口径）/ 自算参考位（兜底，§13）。

**组合层**：总仓上限由用户命令控制（升降仓判断权在用户，PMS 在日报与页面提示大盘区制供参考，不自动联动）。**行业集中度为硬性拦截**：同行业 ≤ 4 只 且 ≤ 总仓的 40%，超限的买入指令直接拒绝。

**行业划分接口（具体方案，已定）**：抽象为 `IndustryClassifier.get(ts_code) -> 行业名 | None`，数据源经 `PMS_SECTOR_SOURCE` 切换：
- `custom_table`（**默认建议**）：自定义映射表 `pms_industry_map(ts_code 主键, industry 行业名, updated_at)`——用户后续提供何种划分（申万/中信/自定义板块）都只是往这张表灌数据，代码零改动；页面提供简单的查看与导入入口。
- `gp_stock_category`：现成适配器，接决策系统生态已有的行业表（153 侧），作为映射表就绪前的临时数据源。
- `""`（未配置）：行业约束自动停用，页面显著提示（不静默放行也不误拦），行业类命令置灰。

组合刹车：自高水位回撤 ≥5% → 自主增持停 3 个交易日（命令类不受限，执行前提示）。

---

## 6. 动作引擎（双轨：命令驱动 + 自主提议）

**命令驱动**动作由方案生成器产出，只过规则闸（上限/一手/冻结/T+1 可卖等合规校验）即入择时队列——用户意志不再送研判。**自主提议**动作由规则扫描触发，先过规则闸，再送决策系统研判（§7），最后按自主档位分流：`full` → 自动执行；`propose_only`（一期默认）→ 落提议队列待用户在页面确认；`off` → 不扫描。

**建仓来源（呼应上游不变）**：上游量化系统照常产出买入计划与评分池 → PMS 作为唯一承接方消费（原决策系统 ENTRY_GATE 的承接角色移交至此）：候选进入建仓规划 → 按百分比框架定批次数量 → 送决策系统建仓研判（复用其 gate 仲裁能力，出口改道）→ 通过则生成买入指令。用户的建仓/升仓命令同样从这个候选池 + 白名单中选股。

| 引擎 | 触发（自主提议口径） | 关键约束 |
|---|---|---|
| FILL 回踩补足 | 建仓期（≤10 交易日）内回踩支撑带不破，浮亏 < 3% | 每票 1 次；补后 ≤ 目标仓位 |
| ADD 盈利加仓 | 安全垫 ≥ +3% 且创 5 日新高或站上压力位 | 距上次 ≥2 交易日；≤ 单股上限；距 MA5 <+6%（不追高） |
| DCA 补仓 | 浮亏触及 **−8% / −15%** 评估档（各评估一次，执行终身一次） | ≤ 底仓 50%；止损参考不下移；**−15% 及更深永远需用户确认**；研判必答"下跌是杀逻辑还是杀情绪" |
| TRIM 保垫减仓 | 安全垫峰值 ≥6% 且回吐过半 → 减 1/3 锁盈 | 纯规则自动执行（减持方向不设确认门槛） |
| SWITCH 调仓 | 一期仅命令驱动；自主汰弱换强二期 | 换股成对编排：**卖出成交确认后再下达买入** |
| T0 做T | 仅命令授权股票。正T：距当日高点回落 ≥3% 且近支撑；反T：近压力位或涨 ≥5% 后滞涨 | 当日 ≤1 次；**14:50 强制平回**（当日买卖数量对齐，绝不让 T 仓过夜变成变相加减仓）；单票/全局当日T亏熔断（0.3%/1% 规模）后禁T；二期上线 |

---

## 7. 两道关口（规则闸 + 研判闸）

- **规则闸（一级，全指令必过，PMS 纯代码）**：下发前用最新数据终检——命令参数上限、一手检查、T+1 可卖、冻结状态、刹车状态、行业集中度、（买入）不追高。任一不过或必要输入缺失 → 拒绝（宁可不动），未通过项落账本。
- **研判闸（二级，仅自主提议的补足/加仓/补仓/调仓，由决策系统承担）**：PMS 备齐硬数字与账本流水作为 context → 请求决策系统研判（其 `process_intraday_audit` 新增 PMS 请求类 direction，复用既有仲裁哲学：代码算数、AI 裁定性、越界收口）→ 结构化答复 通过/驳回+理由。研判服务不可用 → 自动降级 propose_only（人工确认替位）+ ERROR 告警。命令驱动动作不过研判闸（不用 AI 审用户）。
- 两道关口的每次评审都落 `pms_action_ledger`（评审方=规则/研判/人工、当时现价、硬数字、未通过项/理由；驳回同样落）——"拒了的后来涨了多少"是后期调参的核心数据。

---

## 8. 择时执行器（双实现，接口先行）

```
输入: {指令ID, 股票, 方向, 总数量, 执行窗口, 限价提示, 优先级}
输出(逐日): {当日配额, 出手时点/价格带, 成交回执}
实现A（主）: 委托决策系统盘中择时研判（PMS_EXEC 类 direction）——执行/等待 + 建议价, PMS 只管配额与兜底
实现B（兜底, 一期先行）: 内置保守择时
```

**内置保守择时（实现B，参数全部可配置且页面可调）**：每日配额 = 剩余量 ÷ 剩余窗口天数（向上取整到一手）。卖出：避开开盘 30 分钟；现价 ≥ 当日均价（VWAP）时分笔卖出配额；14:45 未完成 → 现价×0.998 限价兜底。买入：现价 ≤ 当日均价或进入回踩带时买入配额；当日涨幅 > 5% 停止买入（不追高）；窗口末日 14:45 强制限价完成或按命令属性作废。停牌/一字板当日跳过顺延；窗口耗尽未完成 → 命令置"部分完成"并告警。每次出手记子指令，父指令聚合进度。

---

## 9. 与下游系统的通道（权限移交的落点）

`trading_order` / `trading_position` **仍归下游系统维护**；变化在于对下游的指挥权：原先由决策系统行使的部分管理权限（建仓审批、卖出指挥）移交持仓系统，下游停止直接执行决策系统的信号。通道形态（与下游对账后定稿）：

- **方案 Y（推荐，趁架构调整一步到位）**：新指令接口 `pms_order_request`（表或 Redis 流，买入卖出统一）：`指令ID(幂等) / 股票 / 方向 / 数量 / 限价 / 有效期 / 来源='pms'`，下游轮询执行并回写状态；成交仍落 `trading_order`（PMS 回放对账口径不变）。
- **方案 X（过渡兼容）**：买入沿用 `trading_buy_plan`（PMS 直接置 6 待挂单、署名 `approved_by='pms'`）；卖出扩展现有通道补数量字段。

卖出通道确认前，减持类自主动作只记账不下发（影子运行）；**命令类的降仓/清仓是用户意志，通道未通前由用户人工执行、PMS 记账跟踪**——这是一期最优先打通的环节。

---

## 10. 调度总表（Asia/Shanghai，全任务带交易日守卫 + 收尾统计摘要）

| 调度 | 时间 | 任务 |
|---|---|---|
| 盘前准备 | 交易日 08:50 | 命令收敛、当日方案与配额刷新、参考位取数（决策系统昨夜结论）、冻结与刹车结算 |
| 命令轮询 | 每 1 分钟（全天） | 新命令解析 → 方案生成 → 任务状态机推进 |
| 盘中执行 | 交易时段每 1 分钟 | 择时执行器出手 + 自主提议扫描（规则闸 → 研判闸 → 按档位分流） |
| 信号消化 | 常驻 | 订阅决策系统盘中信号（风控 SELL/止盈/反转），转化为卖出方案或提议 |
| 成交回放 | 交易时段每 5 分钟 | `trading_order` 增量回放 + 轻对账 |
| T 仓平回 | 14:50（二期） | 做T强制平回 |
| 日终结算 | 15:10 | 全量对账、除权检测、安全垫峰值、命令进度日结 |
| 运营日报 | 15:30 | 关注区（命令进度/待确认提议/对账差异/刹车/影子指令）+ 全量统计，页面可查 |

---

## 11. 数据模型（153 代理侧建表，严格单表访问；DDL 出 `ddl_pms_v1.sql`）

| 表 | 关键列 | 说明 |
|---|---|---|
| `pms_command` | command_id(uk) / cmd_type / params_json / status / progress_json / issued_at / done_at | 命令与进度（参数命令的当前值以本表最新生效记录为准） |
| `pms_plan` | plan_id / command_id idx / ts_code / action / qty_or_amount / priority / deadline / status | 方案明细 |
| `pms_position` / `pms_lot` | §4 | 账本 |
| `pms_instruction` | instruction_id(uk) / 来源(plan/proposal) / ts_code / action / qty / limit_price / status(待检→规则闸过→研判过→已下发→已成交确认 / 拒绝 / 过期 / 撤销) / dispatch_ref / 子单聚合 | 指令状态机 |
| `pms_proposal` | proposal_id / ts_code / action / qty / hard_numbers_json / status(待确认→采纳/驳回/过期) | 自主提议待确认队列 |
| `pms_action_ledger` | 评审方(rule\|judge\|user) / verdict / price_at / hard_numbers_json / failed_checks_json / reason / outcome_scored | 评审账本（调参判分锚） |
| `pms_daily_report` | ymd(uk) / report_json | 日报 |

---

## 12. 配置项（初值；**全部参数可经管理页面在线修改**，页面改动持久化后优先于文件初值）

```python
# 命令类参数初值
PMS_TOTAL_SCALE = 2_000_000; PMS_PORTFOLIO_CAP = 0.60; PMS_STOCK_CAP = 0.08
PMS_STOCK_TARGET_DEFAULT = 0.06; PMS_MAX_NAMES = 15; PMS_AUTONOMY = "propose_only"
# 批次与安全垫
PMS_BATCH_SPLIT = "0.5,0.25,0.25"; PMS_CUSHION_SOLID = 0.03
PMS_TRIM_PEAK = 0.06; PMS_TRIM_GIVEBACK = 0.5
PMS_DCA_TRIGGERS = "-0.08,-0.15"; PMS_DCA_DEEP_CONFIRM = -0.15; PMS_DCA_MAX_RATIO = 0.5
PMS_NO_CHASE_MA5 = 0.06
# 行业约束（硬拦截；划分依据接口化）
PMS_SECTOR_MAX_NAMES = 4; PMS_SECTOR_MAX_RATIO = 0.40; PMS_SECTOR_SOURCE = ""  # 空=约束停用并页面提示
# 执行与择时（实现B 全参数）
PMS_EXEC_WINDOW_TDAYS = 3; PMS_BUY_HALT_DAYUP = 0.05; PMS_SELL_AVOID_OPEN_MIN = 30
PMS_EOD_FORCE_TIME = "14:45"; PMS_EOD_FORCE_DISCOUNT = 0.998; PMS_MIN_LOT_MERGE = True
# 风险披露与刹车
PMS_RISK_WARN_ENTRY = 0.01; PMS_RISK_WARN_PORTFOLIO = 0.06
PMS_BRAKE_DRAWDOWN = 0.05; PMS_BRAKE_DAYS = 3
# 研判闸
PMS_JUDGE_ENABLED = True; PMS_JUDGE_ACTIONS = "FILL,ADD,DCA,SWITCH"; PMS_JUDGE_TIMEOUT = 90
# T0（二期）
PMS_T0_ENABLED = False; PMS_T0_RATIO_MAX = 0.333
PMS_T0_STOCK_DAY_LOSS = 0.003; PMS_T0_GLOBAL_DAY_LOSS = 0.01; PMS_T0_CLOSE_TIME = "14:50"
```

---

## 13. 降级与容错

| 场景 | 行为 |
|---|---|
| 决策系统研判/择时服务不可用 | 择时退实现B；自主增持降级 propose_only；参考位若停更（数据日龄 >3 交易日）用**自算参考位**：支撑 = max(MA20, 近20日低点×1.01)、压力 = 近60日高点、止损 = 底仓成本−2×ATR 与支撑取高（因子表由上游数据管道维护，独立可用）；全部标注"兜底口径" |
| 行业划分数据源未配置 | 行业硬拦截自动停用，页面显著提示（不静默放行也不误拦） |
| 实时价/因子缺失 | 该票该轮跳过；连续 3 日缺失 → 冻结自主动作并告警 |
| 指令下发失败/超时 | 指令置过期 + ERROR，不自动重发；命令进度受阻 → 日报与页面关注区置顶 |
| 对账不一致 | 以下游为准修正 + 调整痕迹 + 告警；连续 3 日 → ERROR 待人工 |
| 命令冲突 | 后到命令入队并在页面提示冲突，由用户裁决执行顺序 |

---

## 14. 实施方式：功能一次性开发，上线按依赖分步切换

**开发（一次到位，已定）**：全部功能一个开发周期完成——完整命令目录 + 管理页面（四块）+ 账本与对账 + 方案生成器 + 百分比仓位框架 + 规则闸 + 全部动作引擎（含 T0）+ 择时执行器（实现 A 接口 + 实现 B 内置）+ 决策系统信号订阅 + 日报。决策系统侧的配套修改（出口改道 + PMS 研判 direction）同步在 bionic_trader 仓库开发。

**上线切换（按外部依赖排序，不是功能分期）**：

| 步 | 前置依赖 | 启用内容 | 通过标准 |
|---|---|---|---|
| 1 影子运行 | 无（只读权限即可） | 账本/回放/对账、页面查看、命令与方案生成（不下发）、自主提议记录 | 账本连续 5 日对账零差异；方案与提议在页面可核 |
| 2 实盘接管 | `QMT_INTERFACE_REQUIREMENTS.md` 协商落地（指令通道 + 数据项）；下游停止直接执行决策系统信号 | 命令执行（内置择时）、自主提议 propose_only、T0（对已授权股票） | 一条降仓命令端到端走通（页面下达→方案→分日执行→回执）；一笔做T完整平回 |
| 3 研判接通 | 决策系统配套修改联调完成 | 择时切实现 A、建仓/补仓/加仓研判闸生效、自主档位可开 full | 择时 A/B 可切换；一笔 −15% 补仓走完"研判+用户确认"链 |

**判分与调参**为长期例行（评审账本与命令回执判分：降仓时机成本、提议采纳率与胜率、择时 A vs B 对比 → 阈值回调），随步骤 2 起自然积累数据，月度出校准报告。

---

## 15. 验证方案（实机，用户执行）

1. 上线前：方案生成器单测（降仓凑额排序/一手合并/上限与行业拦截各边界）；命令状态机单测；页面参数改动 → 配置生效链路。
2. 首日检查点：①命令解析与方案落表 ②每笔指令的规则闸硬数字日志 ③择时配额与出手记录 ④回放/对账计数 ⑤页面四块可用。
3. SQL 抽查：`pms_plan` 对照命令意图；`pms_action_ledger` 的 price_at 与行情对照。
4. 两周后：命令执行成本统计（相对命令日收盘价）；提议队列的反事实收益——为三期判分定口径。

## 16. 确认状态（2026-07-27 六点反馈后）

| # | 事项 | 状态 |
|---|---|---|
| 1 | 命令场景目录取舍与分期 | ✅ 已定：全部实现、不分期（§3.1、§14） |
| 2 | 与下游系统的数据与通道协商 | 🔄 进行中：需求清单已成文 → `QMT_INTERFACE_REQUIREMENTS.md`，由用户持此与 QMT 侧协商，答复回填该文档 |
| 3 | 决策系统配套修改（§1 清单） | ✅ 已批准，直接开发（bionic 仓库实施） |
| 4 | 账户资金快照 | ✅ 已并入需求清单（数据项 A3） |
| 5 | 行业划分数据源 | ✅ 接口方案已定（§5：`pms_industry_map` 自定义映射表为默认，用户后续灌数即可） |
| 6 | 管理页面技术形态 | ✅ 已定：FastAPI + 单页 |
