tradingSystem/docs/技术面接入与三源合议_进度交接_2026-09-11.md

112 lines
11 KiB
Markdown
Raw 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.

# 技术面接入与三源合议 · 进度交接(2026-09-11)
> 这份文档给下一次接手(新开上下文)用。对照《技术面接入与三源合议方案_2026-09-11.md》,
> 说清做到哪、剩什么、剩下的接入怎么做、有哪些坑。配合 DEVLOG.md 最新几条节点一起读。
## 一句话现状
技术面接入(工作包一)已完成并在模拟仓 155 真机判收通过;三源合议(工作包二)的三块「大脑」——纯逻辑、装配服务、仓位矩阵——已完成、开发机全量绿、已提交;剩下的是把它们**接进下单链路**(扫描分流、增持门、候选排序、页面合议行),这是全工作包风险最高的地方,留给下一轮专注做。另有提议卡重构(用户临时要求)已完成。
## 一、对照方案的工作包进度
| 工作包 | 内容 | 状态 |
|---|---|---|
| 一 技术面取数落表映射与页面 | 新表、tech_repo、tech_service、调度位、三接口、页面四项 | **完成 + 155 真机判收**(映射覆盖 176/177) |
| 二 三源合议与仓位矩阵 | 见下方拆解 | 三块大脑完成,接入未做 |
| 三 离场纪律 | eval_tech_exit、SAR 盘中止损线、紧止盈自动挂载 | **未做** |
| 四 选股系统打分 | akg-factor-bridge 仓库改质地调整分 | **未做**(另一仓库,单独审批) |
| 五 文档台账登记 | 台账 006-011、README 调度总表、接口契约 | 部分(见下) |
| 额外 | 提议卡重构(卡面结论 + 弹窗详情 + 技术面行) | **完成**,本地冒烟过,未 155 真机判收 |
**工作包二拆解:**
- 纯逻辑三模块 `app/core/fund_rules.py`、`timing_rules.py`、`consensus.py`:**完成**(tech_rules 工作包一已做)。
- 装配服务 `app/services/consensus_service.py` + `downstream_repo.fetch_nightly_verdicts`(批量读昨夜定性):**完成**。
- `advice_service.advise_v2()` 基本面×技术面仓位矩阵:**完成**(旧 advise 原样保留)。
- 新建仓扫描接入合议路由:**未做**。
- 持仓增持门:**未做**。
- 候选按基本面立场排序:**未做**。
- 提议卡合议行(页面):**未做**(提议卡已重构成四行来源,合议行加第五行或顶部结论)。
## 二、提交与部署状态
远程(origin 在 192.168.18.24,分支 main)当前到 `0dd5b68`。八个提交:
```
0dd5b68 三源合议工作包二(三):advise_v2 基本面×技术面仓位矩阵
be7884d 三源合议工作包二(二):装配服务与批量读昨夜定性
84207d5 三源合议工作包二(一):基本面/择时/合议三个纯逻辑模块
5fa6881 修技术面分页:按 matched 拉完,不再用页大小判最后一页
a33bae5 修 batch20 提议卡守卫断言:propVerdictLine 重构后移进详情弹窗
83022e1 提议卡重构:卡面留结论、详情进弹窗、加技术面
d895802 技术面接入工作包一(页面):顶栏新鲜度芯片、持仓研究面列、单票抽屉技术面节
0d39845 技术面接入工作包一(后端):取数落表、相位合成与映射打通
```
**模拟仓 155 当前部署到 `be7884d`**(分页修复那次 git pull 拉到的)。`0dd5b68`(advise_v2)已推远程但 155 未拉——advise_v2 是新函数、还没被调用,155 缺它不影响运行,下次部署接入时一起拉即可。
**真实仓 188 未动**(本次全部在模拟仓 155)。
## 三、真机判收状态(只写「真机见过」或「未判收」)
- 工作包一技术面:**真机见过**。155 上 `make test` ALL SUITES PASS、20 张表就绪(pms_tech_daily 建出)、`pull_and_map` 分页拉全 4991、映射覆盖 176/177 只(看空 54 / 中性 111 / 看多 11)。明天 6:30 调度会自动这样拉。
- 提议卡重构:**未判收**。开发机注入假提议起本地服务,截图确认卡面四行结论、技术面弹窗三指标块、公司深度弹窗四段分组渲染正确、不白屏;155 上要等真实提议才判收。
- 工作包二三块:**未判收**(还没接入,没有运行路径;开发机全量单测 771 例绿)。
## 四、真机抓到并修掉的两个坑(脱库单测测不到,都加了哨兵)
1. **upsert 的 ON DUPLICATE 用绑定参数触发 pymysql 批量陷阱**:`ON DUPLICATE KEY UPDATE col = :col` 在 executemany 多行合并时,UPDATE 子句的占位符不展开却仍算参数,5000 行批量落表参数错位、SQL 留裸 % 报 1064。改用 `VALUES(列)` 引用插入值。哨兵在 test_batch27。
2. **分页误判最后一页**:接口每页上限 1000 < 页大小 1500,旧逻辑「返回数小于页大小」第一页就判到底,只落 1000/4991。改为优先按 `matched` 终止、空页停、页大小设 1000。哨兵在 test_batch27。
两个都是「脱库单测 mock 了落表 / 注入了 fetch,测不到真实 SQL 与真实接口分页」,靠 155 真机首验才暴露。下一轮接入后同样要 155 判收,别只信开发机单测。
## 五、剩下的接入怎么做(下一轮的活)
**核心洞察:合议接入完全复用现有「判决分流」的手法。** `action_engine.scan_open` 循环里(`app/core/action_engine.py` 约 780-800 行)已经有一套判决分流:在名额判断**之前**按 verdict 分流——仅展示不占名额、关注打 needs_user_confirm、候选放行;而且开关(`params["open_route_by_verdict"]`)关掉时那段一行不执行、旧行为逐字保留。合议路由要的是同一件事,照抄这个位置和手法。
**四处改动,每处都要守「开关关掉即逐字回旧」:**
1. **`proposal_service._scan_open`(约 289 行调 `ae.scan_open` 之前)**:`PMS_CONSENSUS_ROUTE` 开着时,对候选 `cands` 批量装配合议——一次取昨夜定性(`consensus_service.nightly_map`)和技术面映射(`consensus_service.state_map`),逐只 `consensus_service.assemble`,把 `consensus`(含 route/四块)和 `hard_keys` 的六键挂到每个 cand。开关关掉整段不做,cands 原样进 `scan_open`。
2. **`action_engine.scan_open`(约 792 行、判决分流 `VERDICT_DISPLAY` 那段之后、名额判断之前)**:加合议分流,纯逻辑读 cand 上挂好的 `consensus.route`:跳过/观察 → 写 skipped(观察的处置词 `wait_tech`)、`continue`(不占名额不占金额);交人 → 打 needs_user_confirm 与原因;放行 → 照常。开关走 `params["consensus_route"]`。
3. **`advice_service`**:候选定档改用 `advise_v2(c, params, fund=..., tech=...)`(矩阵),fund/tech 从 cand 挂的合议四块取。六键进硬数字,且**六键一个都不进 `judge.OPEN_JUDGE_KEYS`**(附录丁)。`advise_v2` 已写好、开发机验过矩阵逐格。落点在候选组装 `action_engine._open_candidate`(约 611-716 行)或 `proposal_service._make_proposal`(约 848 行,现在那里调 apply_judge/resize),要接上 advise_v2 那一档并让数量按它重算(沿用 resize_to_advice)。
4. **持仓增持门(`action_engine`)**:合议看空停增持侧三类(回踩补足 eval_fill、盈利加仓 eval_add、补仓 eval_dca);技术面看空跳过回踩补足与盈利加仓;基本面看空跳过补仓;**减持侧不受门影响**。持仓行的合议由 `consensus_service` 早上装配(类似 logic_state 的 decorate_positions),挂到持仓行给动作引擎读。
**候选排序(工作包二第 4 点)**:`plan_feed.select_candidates` 里,先按基本面立场分桶(看多桶在前)再按分数,在主题限额与截断之前生效;技术面不参与排序只当门;观察档里质地看多的行进池默认关(`PMS_PLAN_OBSERVE_IF_FUND_BULL` 默认 False)。
**页面合议行**:提议卡已重构成四行来源(选股系统/决策系统/公司深度/技术面),合议再加一行「合议」显示三方多数方向与强弱,点开看三票与路由理由;候选栏每行加质地与技术芯片、处置词 `wait_tech`(等技术面开口);管理视图持仓总览修一处证据列印两遍的显示错误并加研究面列。
**哨兵与登记**:动作求值器次序若加 eval_tech_exit(工作包三)要改哨兵;六键不进 OPEN_JUDGE_KEYS 要在 test_batch28 或新批次加断言;`PMS_CONSENSUS_WEAK_CONFIRM`(合议一方表态强制交人)目前未登记(consensus.decide 内置了「一方表态交人」,若要开关控制需 decide 加参数并登记)。
**参数**:`PMS_FUND_REQUIRED`、`PMS_FUND_STALE_DAYS`、`PMS_FUND_CONSENSUS_GOOD_MIN`、`PMS_CONSENSUS_ROUTE` 已登记进 param_store 的 RUNTIME_EXTRA。接入时若读新参数(如 `PMS_TECH_GATE_INCREASE` 增持门、`PMS_PLAN_RANK_BY_QUALITY` 排序、`PMS_TECH_VOL_CONFIRM` 盘中放量),要同步登记且保证有读取处(否则死参数扫描红)。
## 六、pending 清单
1. **155 部署 advise_v2 与后续接入**:现部署在 be7884d,缺 0dd5b68 及之后的接入。接入做完一起部署,收盘后或盘前,先经用户审批(本次曾把宿主 UTC 误当北京时间、盘中当盘前部署过,务必看容器内时间:容器 `datetime.now()` 是北京时间,宿主 `date` 是 UTC)。
2. **README 调度总表补齐**(工作包五):现描述「九个调度位」过时,实际 13 位(含 06:30 tech_pull)。
3. **台账 007-011**(工作包五):目前只补了 006(技术面相位与五阈值)。007 基本面立场规则、008 待定、009 合议路由、010 SAR 离场、011 弱基本面紧止盈随对应工作包补。
4. **工作包三(离场纪律)、工作包四(选股打分,另一仓库单独审批)** 未做。
5. **提议卡重构 155 真机判收**:等 155 有真实提议时看卡面四行、点弹窗。
## 七、验证命令
**开发机(跑全量单测,用临时 venv)。** 预期最后一行 ALL SUITES PASS。
```bash
cd /Users/baobao/Documents/work/project/tradingSystem && /private/tmp/claude-501/-Users-baobao-Documents-work-project-tradingSystem/f7c4a696-e3d8-4465-961a-04f82eb3e424/scratchpad/venv/bin/python scripts/run_tests.py
```
(venv 在会话 scratchpad 下、跨会话要重建:`python3 -m venv <venv> && <venv>/bin/pip install -r requirements.txt`。)
**模拟仓 155(部署与判收,重建容器先经用户审批,看容器内北京时间避开盘中)。** 预期 make test 见 ALL SUITES PASS,pull_and_map 行数五千上下、映射只数接近持仓加候选。
```bash
cd /home/factor/project/tradingSystem && git pull --ff-only && make deploy && make test && docker compose run --rm --no-deps pms-web python -c "from app.services import tech_service as t; import json; print(json.dumps(t.status(), ensure_ascii=False)[:400])"
```
## 八、下一轮的第一步
读这份文档 + DEVLOG 最新两条节点 + 方案第五节工作包二第 5-6 点 + 附录乙丙丁;然后从「五、剩下的接入」的第 1、2 处开始(proposal_service 装配挂候选 + action_engine.scan_open 合议分流),每处先写「开关关掉时逐字节相同」的单测再改,改完开发机全量绿、再 155 判收看提议真按合议分流。