tradingSystem/docs/技术面接入与三源合议方案_2026-09-11.md

254 lines
21 KiB
Markdown
Raw Permalink 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
> 本文是这一阶段改进的开发方案,供拍板与实施。写法遵守 `.claude/output-styles/readable-chinese.md`。
> 第一到第八节是正文,读完就能照做;附录是实现细节,标了「可不读」。
---
## 一、这件事为最终目标买什么
我们是一套交易系统,交易要基于自己手里的数据。现在手里有两份数据没用好。
第一份是数据基座的买方评析。它已经流进持仓管理系统,但只在建议方案矩阵里粗用一次,页面上一整句挤在提议卡和持仓表里,看不清也用不上。
第二份是择时决策系统新开的技术面接口。它每晚扫全市场给每只票算布林线、多空布林线、SAR 三个指标。持仓管理系统还没接。
目标是让每只票在持仓管理系统里有三份结构化意见基本面立场、技术面立场、择时系统立场。三方多数决定方向方向进入现有的规则闸、研判闸、档位分流那条链一行不改。基本面定预算技术面定首批比例与增持节奏SAR 翻空是自动执行的离场纪律。页面把三份意见分开摆,点开能看全文。
**用户已拍板的四条。**
1. 买方评析没有读数或超过 120 天的候选不建仓。
2. 合议参与分流的开关上线即开。
3. SAR 转空的减持与清仓上线即自动执行,与保垫减仓同档。
4. 同时改选股系统的打分,让质地进入排序。那是另一个仓库,动之前单独审批。
**已查实的两个读数2026-09-11只读探测。**
一,当天计划主榜 96 只里前 50 名全部有买方评析,强传导的 43 只也全部有。所以「无评析不建仓」今天不损失任何候选。
二,主榜前 100 名有评析的 70 只里,质地差 50、中 14、好 6。选股确实偏题材传导改打分有必要。
---
## 二、设计原则
三条原则写进代码注释与台账。
1. 入场投票离场纪律。方向由三方多数决定。止损止盈不投票SAR 翻空像保垫减仓一样按规则执行。
2. 无读数等于弃权。任何一路取不到都不投票、不设门、不出退出提议,绝不折成看空。
3. 研判闸不当选票。择时系统那一票只用昨夜定性与盘中转多留痕。研判仍是合议之后的关口,不重复计数。技术面整句不送研判,因为决策系统夜里自己算过一份,两份读数可能不一致。
对照机构的做法这是一套「波动阶段加趋势过滤加跟踪止损」的标准组合布林线收口开口判变盘阶段多空布林线判中期多空SAR 做跟踪止损。基本面决定投多少,技术面决定什么时候投和什么时候撤,择时系统决定盘中怎么下单。
---
## 三、技术面意见怎么合成
三个指标各回答一个问题。布林线回答「波动处在哪个阶段」。多空布林线回答「中期多空谁占上风」。SAR 回答「趋势有没有延续、止损位在哪」。
合成分三步。
第一步判有没有读数。没有当天行、读数超过两个交易日、没做除权重锚、数据质量不是正常,四种情形一律算无读数。
第二步判是不是震荡市。数最近 20 个交易日 SAR 翻向了几次,四次以上就是震荡市。震荡市里 SAR 翻向不当信号,这是决策系统文档里明说的指标特性。
第三步判相位,第一个命中的就是结论。
| 相位 | 条件 | 立场 |
|---|---|---|
| 收口等待 | 今天布林带收口(带宽处于近 60 日最低两成) | 中性,只等开口 |
| 开口向上 | 今天不收口,近 5 日内收过口,带宽比收口时至少扩 20%价格在带内上半部SAR 为多 | 看多,强 |
| 开口向下 | 对称价格在带内下半部SAR 为空 | 看空,强 |
| 转空 | SAR 为空且翻向不超过 2 天,非震荡市 | 看空;多空布林线也在空头区或价格贴下轨为「确认」 |
| 转多 | SAR 为多且翻向不超过 2 天,多空布林线不在空头区,非震荡市 | 看多,弱 |
| 趋势多 | SAR 为多且多空布林线在多头区 | 看多,强;中性区为弱 |
| 趋势空 | SAR 为空且多空布林线不在多头区 | 看空 |
| 分歧 | SAR 与多空布林线方向相反 | 中性 |
| 震荡 | 震荡市且以上都不命中 | 中性 |
盘中另有一道确认,只用于入场。时段在 09:45 到 14:30时段折算量比不低于 1.5。昨天已开口的票要求现价不低于当日均价。还在收口的票,今天现价站上昨日上轨且放量,当天就视为开口进候选。
五个数字一次定死并记台账:读数两天内算新鲜,回看 5 日内的收口,带宽扩 20% 算开口20 日翻向 4 次算震荡,量比 1.5 算放量。量比口径与解锁重问那次同源。
---
## 四、基本面与择时系统的意见怎么读
**基本面。** 质地好为看多。质地中且三类里两好零差、十视角差不超过一个,也算看多,这就是「整体方向为好就够」。质地差或有硬疑点为看空。其余中性。缺报告或超过 120 天为无读数。十视角好达八个且估值贵时打「共识已定价」标记,不改立场,只让首批推迟。
**择时系统。** 昨夜定性 BUY 为看多WATCH 中性SELL、AVOID、DROPPED 看空,超期或缺为无读数。当天盘中转多留痕把无读数与中性升为看多,与看空相遇归中性。
**合议。** 三票多数决定方向。无读数弃权不计。平局中性。只有一方表态算弱。三方一致算强。合议之后按路由表决定放行、观察、交人或跳过,路由表在附录丙。
**仓位矩阵。** 基本面定预算,技术面定首批比例,见附录乙。两条来自你的规则:基本面好但技术面差,不放弃,进观察态,转向后分批建,已持仓只停增持不卖;基本面差但技术面好,只给试探仓一批,交人拍板,并配回撤 3%、硬目标 8% 的紧止盈与 SAR 线。
---
## 五、做哪几件事
### 工作包一:技术面取数、落表、映射与页面显示
先做它,是因为后面所有判定都依赖一份持仓管理系统自己记下的读数,先记账后动作。
1. 新表 `pms_tech_daily`,存全市场每日读数,唯一键是数据日加代码,保留 40 个交易日。存全市场而不只存持仓与候选,是因为新进榜的票需要 20 天历史判震荡。
2. 新仓库 `app/repo/tech_repo.py`,全部单表访问。
3. 新服务 `app/services/tech_service.py`。分页拉接口逐页落表,状态不是 OK 就不动表。每早对在持、计划主榜、观察档、有策略的票、等拍板的票算一份技术面判定,写运行参数 `PMS_TECH_STATE_MAP`,与逻辑状态映射同一手法。
4. 调度新增 06:30 一位 `pms.tech_pull`。决策系统夜扫 23:20 起、实测 00:38 完留足余量。08:40 拉计划之后补拉一次并重建映射,让映射覆盖当天的榜。
5. 三个接口:技术面状态、手动拉取(管理员)、单票研究面(评析全文、技术面读数、择时立场、合议,只在点击时调)。
6. 页面七处:提议卡卡面换成三枚芯片加一行合议,整句收进展开区并各带标签;我的持仓新增「研究面」列;单票抽屉顶部新增「研究面 · 三源合议」一节;管理视图持仓总览修一处显示错误并加「研究面」列与评析报告链接;候选栏每行加质地与技术芯片,新处置词「等技术面开口」;顶栏新增「技术面 MM-DD」新鲜度芯片设置卡新增「研究面与合议」一张。
### 工作包二:三源合议与仓位矩阵
1. 四个纯逻辑模块:`app/core/tech_rules.py`、`app/core/fund_rules.py`、`app/core/timing_rules.py`、`app/core/consensus.py`。零外部依赖,可单测。
2. 批量读昨夜定性的仓库函数,与装配候选和持仓行四块意见的服务 `app/services/consensus_service.py`
3. `advice_service.advise_v2()` 新函数,旧函数原样保留。
4. 候选排序:先按基本面立场分桶再按分数,在主题限额与截断之前生效。技术面不参与排序,只当门。观察档里质地看多的行进池默认关,守「宁缺毋滥」。
5. 新建仓扫描接入合议与路由。跳过与观察不占名额不占金额。硬数字新增六键,不进送研判白名单。
6. 持仓增持门:合议看空停增持侧三类;技术面看空跳过回踩补足与盈利加仓;基本面看空跳过补仓。减持侧不受门影响。
### 工作包三:离场纪律
1. 新评估器 `eval_tech_exit`。相位为转空且翻向不超过 2 天才评。确认转空清仓全部可卖量,未确认减三分之一。按你拍板默认自动执行,与保垫减仓同档。同一次翻向只处理一次。
2. 扫描里「策略票只看目标价」那条判断改成按函数判,否则策略票会被新评估器误放行。
3. 跟踪止盈策略加盘中 SAR 止损线09:45 后现价低于昨日 SAR 值千分之三即卖,当日只触发一次。每天 09:40 把映射里的 SAR 值刷进每条自动挂载的跟踪止盈。
4. 紧止盈自动挂载:基本面看空加技术面看多的试探仓,次日 09:40 自动挂回撤 3%、硬目标 8%、带 SAR 线的跟踪止盈,不占每日新挂名额。
### 工作包四:选股系统打分(另一仓库,单独审批)
**为什么动。** 主榜前 100 名里质地差占一半,好只有 6 只。质地不进排序就永远排在后面,决策系统夜间分析池按这份排名取前 50好公司也进不了分析池。
**动哪里。** `akg-factor-bridge/plan.py` 装配阶段已经读到评析字典。算质地调整分:好加 8、差减 8、其余 0在同一传导档内排序不跨档。档步长是 20组内分夹正负 9.9,加 8 后最大 17.9 仍小于 20先档后分的次序不破。主榜与观察档按调整分重排并重编名次原分数保留供档位解码接口与快照多带一个调整分字段。不动因子表不在每早 07:10 的因子构建里读数据基座库。判决收敛仍只降不升。
**怎么回退。** 环境变量把加分设为零即关,或回滚提交后重启桥容器。
**执行方式。** 代码与自测先在本地做完并提交。155 上拉代码后重启桥容器要先经你批准,避开每早 07:10。台账记到 akg-factor-bridge 第 058 条。
### 工作包五:文档、台账与登记
台账追加 006 到 011候选按质地排序基本面立场规则技术面相位与五个阈值三源合议路由表SAR 转空自动离场弱基本面入场的紧止盈。开发节点记录追加五段式节点。README 调度总表补齐 13 个调度位并加一节。接口契约文档新增技术面只读接口一节,注明研判请求体不变。
---
## 六、开关与参数
全部经参数中心读,页面可改即时生效。每个键都有真实读取处,否则死参数扫描会红。
| 键 | 默认 | 说明 |
|---|---|---|
| PMS_TECH_ENABLED | True | 总闸。关掉即不拉取、不挂读数、不设门、不出退出、策略忽略 SAR 线,行为逐字如旧 |
| PMS_TECH_API_BASE 与路径与超时 | 空、/api/v1/market/technical、20 秒 | 地址空则沿用研判接口根地址 |
| PMS_TECH_KEEP_DAYS、PMS_TECH_STALE_TDAYS | 40、2 | 保留交易日数;读数超此日龄按无读数 |
| PMS_TECH_STATE_MAP | 空 | 运行态映射,页面只读 |
| PMS_TECH_SQUEEZE_LOOKBACK、PMS_TECH_OPEN_BW_GROWTH | 5、0.20 | 开口判定回看根数;带宽至少扩多少 |
| PMS_TECH_CHOPPY_FLIPS、PMS_TECH_FLIP_FRESH_DAYS | 4、2 | 20 日翻向次数判震荡;翻向几天内算新鲜 |
| PMS_TECH_VOL_CONFIRM、PMS_TECH_INTRADAY_BREAKOUT、PMS_TECH_INTRADAY_WINDOW | 1.5、True、0945-1430 | 盘中放量确认 |
| PMS_FUND_REQUIRED、PMS_FUND_STALE_DAYS、PMS_FUND_CONSENSUS_GOOD_MIN | True、120、8 | 无评析不建仓;评析陈旧天数;共识已定价的好视角数 |
| PMS_CONSENSUS_ROUTE、PMS_CONSENSUS_WEAK_CONFIRM、PMS_TECH_GATE_INCREASE | True、True、True | 合议参与分流;单方表态交人;增持侧三道门 |
| PMS_TECH_EXIT_AUTONOMY、PMS_TECH_EXIT_TRIM_RATIO | full、三分之一 | 转空处置 off、propose_only、full未确认减持比例 |
| PMS_TECH_SAR_STOP_ON_TRAIL、PMS_TECH_SAR_STOP_BUFFER | True、0.003 | 自动跟踪止盈每日刷新 SAR 线;跌破缓冲 |
| PMS_TECH_TIGHT_TRAIL_GIVEBACK、PMS_TECH_TIGHT_TRAIL_TARGET | 0.03、0.08 | 试探仓紧止盈回撤与硬目标 |
| PMS_PLAN_RANK_BY_QUALITY、PMS_PLAN_OBSERVE_IF_FUND_BULL | True、False | 候选先按质地分桶;观察档里质地看多的行进池 |
---
## 七、验证方式
每条命令标明在哪台机器上运行,一个命令块只放一台机器。
**开发机。** 预期两道页面守卫都打 ALL OK新批次打 ALL PASS。
```bash
cd /Users/baobao/Documents/work/project/tradingSystem && python3 scripts/test_page_wiring_guard.py && python3 scripts/test_page_enum_guard.py && python3 scripts/test_batch27_units.py
```
**决策系统机 188只读探活。** 预期 status 为 OKdata_date 是最近交易日。
```bash
curl -s "http://127.0.0.1:38000/api/v1/market/technical?limit=2" | head -c 400
```
**模拟仓 155仓库根目录。** 部署要重建容器,先经你批准,收盘后执行。预期 make test 最后一行 ALL SUITES PASS建表输出多出 pms_tech_daily 一张。
```bash
cd /home/factor/project/tradingSystem && git pull --ff-only && make deploy && docker compose run --rm --no-deps pms-web python scripts/init_db.py --yes && make test
```
**模拟仓 155手动拉一次技术面并看映射。** 预期 ok 为真data_date 是最近交易日,行数五千上下,映射只数等于持仓加候选。
```bash
cd /home/factor/project/tradingSystem && docker compose run --rm --no-deps pms-web python -c "from app.services import tech_service as t; import json; print(json.dumps(t.pull_and_map(), ensure_ascii=False)[:600]); print(json.dumps(t.status(), ensure_ascii=False)[:600])"
```
**模拟仓 155全链试算不落表。** 预期每个候选带合议方向与技术立场,跳过原因里出现「等待技术面开口」或「没有买方评析」。
```bash
cd /home/factor/project/tradingSystem && docker compose run --rm --no-deps pms-web python -c "from app.services import proposal_service as p; import json; d=p.scan_and_route(dry_run=True); print(json.dumps(d, ensure_ascii=False)[:1500])"
```
**页面判收。** 顶栏出现绿色「技术面 MM-DD」芯片。我的持仓多一列研究面。点任一票抽屉第一节是三源合议四枚芯片。候选栏出现「等技术面开口」。提议卡卡面第三段是三芯片加合议行。管理视图证据列不再印两遍旁边有评析报告链接。
**第一个交易日早上 08:50 之后,模拟仓 155。** 预期映射写入时刻是当天 08:4x读数日是前一交易日错误为空。
```bash
cd /home/factor/project/tradingSystem && docker compose run --rm --no-deps pms-web python -c "import json; from app.services import param_store as ps; m=json.loads(ps.get('PMS_TECH_STATE_MAP') or '{}'); print(m.get('at'), m.get('data_date'), len(m.get('states') or {}), m.get('error'))"
```
**回退。** 参数即时生效,不重启。一键全关把 PMS_TECH_ENABLED 设为关。只关分流把 PMS_CONSENSUS_ROUTE 设为关。只关自动离场把 PMS_TECH_EXIT_AUTONOMY 改成 propose_only 或 off。
---
## 八、上线与观察
按你拍板,四个开关上线即开。观察读数按天记。技术面无读数占比应低于 3%。每天被「等待技术面开口」拦下的票应在 1 到 15 只之间,零说明太紧。技术面退出每周 0 到 3 条,误伤逐只记台账 010。三源合议方向与人的判断对不上的逐只记。选股系统打分改动单独排期批准后再动。
**不在本次。** 建议方案里赔率分支在计划路径永远不触发的既有缺陷另开一次修。数据基座只给计划前 120 只出评析全市场里质地好但没进计划的公司现在发现不了扩评析范围是数据基座的事另议。README 里影子模式的过时说法,交接文档第九节已在等你拍板。技术面整体无读数时自主新建仓不停,走旧管线。
---
## 附录甲(可不读):要改的文件与哨兵
**新增。** `app/repo/tech_repo.py`、`app/services/tech_service.py`、`app/services/consensus_service.py`、`app/core/tech_rules.py`、`app/core/fund_rules.py`、`app/core/timing_rules.py`、`app/core/consensus.py`、`scripts/test_batch27_units.py`。
**修改。** `ddl_pms_v1.sql`、`app/scheduler.py`、`app/core/tradedays.py`(加上一交易日函数)、`app/repo/downstream_repo.py`(批量读昨夜定性)、`app/services/plan_feed.py`、`app/services/advice_service.py`、`app/core/action_engine.py`、`app/services/proposal_service.py`、`app/services/judge.py`(白名单注释)、`app/services/strategy_service.py`、`app/services/strategy_runner.py`、`app/services/strategy_advisor.py`、`app/services/logic_state_service.py`、`app/services/param_store.py`、`config/settings.py`、`app/web/main.py`、`app/web/static/index.html`、`scripts/test_page_enum_guard.py`、`scripts/run_tests.py`、`README.md`、`CLAUDE.md`、`BIONIC_PMS_INTERFACE.md`、`DEVLOG.md`、`docs/复盘决定台账.md`。
**另一仓库。** `akg-factor-bridge/plan.py`、新增 `test_plan_quality_rank.py`、其台账。
**哨兵同步。** DDL 表数 19 改 20test_batch6 第 594 行)。调度位集合与任务名加 tech_pulltest_wiring 第 663 到 674 行。路由清单加三个新路由test_wiring 第 642 到 654 行)。动作求值器次序改为 TRIM、TRIM、EXIT、EXIT、ADD、FILL、DCAtest_batch12 第 372 到 373 行。run_tests 登记新批次与例数。页面文案守卫把 flags 进枚举名单、立场词进开放集。
**新批次约 50 例。** 技术面相位表逐格与盘中确认;基本面七情形;择时五情形;合议多数决与路由六格;仓位矩阵;新建仓扫描的跳过不占名额、收口观察、盘中确认进候选、弱表态交人、开关关时与旧路逐字相同;持仓三道门;技术退出五情形与同轮优先级;研判白名单不含六键;策略层 SAR 线触发、09:45 前不触发、当日一次、校验拒非法值;自动挂载刷新与紧止盈;取数服务分页、状态非 OK 不落表、页失败不推进日期、代码归一;候选分桶与观察档;参数登记与单表守卫;页面组四条。
## 附录乙(可不读):基本面与技术面的仓位矩阵
| 基本面 \ 技术面 | 看多 | 中性 | 看空 |
|---|---|---|---|
| 看多 | 标准仓 5/2.5/2.5;估值贵减半仓 5/5共识已定价减半仓且首批推迟 | 同左;收口等待已在路由层拦成观察 | 观察,等技术面转向;已持仓只停增持 |
| 中性 | 标准仓 3/3.5/3.5,后两批要求技术面看多且非高位兑现 | 同左 | 观察 |
| 看空 | 试探仓 1%,一批,交人,配紧止盈与 SAR 线 | 不建 | 不建 |
| 无读数 | 不建(没有买方评析) | 不建 | 不建 |
保留的既有调整:逻辑存疑不建;定价状态高位兑现首批推迟;研判把握度低降为试探仓并重算股数。「第二批要求技术面不看空」从文案变成可执行的门。
## 附录丙(可不读):合议路由表
| 情形 | 路由 |
|---|---|
| 基本面无读数且开关开着 | 跳过,原因「没有买方评析」 |
| 方向看空 | 跳过,原因写三方意见 |
| 中性且技术面收口等待且基本面非看空 | 观察,等开口 |
| 中性且基本面看多技术面看空 | 观察,等技术面转向 |
| 基本面看空技术面看多 | 交人,试探仓 |
| 看多但异议在择时系统 | 交人 |
| 看多但只有一方表态 | 交人 |
| 看多强或异议只在技术面 | 放行 |
| 三方都无读数 | 放行,机械方案 |
## 附录丁(可不读):数据契约
立场词与合议词一律是中文原文,取值只有看多、中性、看空、无读数。
新建仓提议的硬数字新增六键:`fund_stance`(立场、标记、一句事实)、`tech`三指标读数加派生的立场、相位、理由、SAR 止损位、读数日)、`tech_text`、`timing`(立场、昨夜定性、盘中转多时刻)、`consensus`(方向、三票、强弱、一句理由)、`consensus_text`。这六键不进 `judge.OPEN_JUDGE_KEYS`
持仓接口每行新增 `company`(评析全文与立场)、`tech`、`consensus` 三块,顶层新增 `research_feed` 记技术面读数日期、缺失名单与错误。单票研究面接口返回 `company`、`tech`、`consensus`、`timing`、`feed`、`sources` 六块,`sources` 逐路标失败。候选处置快照每行加 `fund`、`tech`、`consensus` 三小块,处置词新增 `wait_tech`
技术面映射的形状:写入时刻、读数日、日龄、算法版本、是否完整、逐票紧凑状态、各态计数、错误。超三个自然日不刷新按无读数。