112 lines
11 KiB
Markdown
112 lines
11 KiB
Markdown
|
|
# 技术面接入与三源合议 · 进度交接(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 判收看提议真按合议分流。
|