Console 决策台
一个本地入口,做三件事:翻报告、定计划、过门禁。
Console 将 Reader、交易计划台和买卖决策台放在同一个本地服务中,但三个页面的语义归属不同:Reader 是投研层的阅读入口;后两个工作台属于操盘层,把策略内核的判断变成 Human 可确认、可追溯的计划与动作记录。
所有产出都是纯 Markdown,写回你自己的 vault。没有数据库、没有云端、没有账号。
三个页面,一个端口
| Reader | 交易计划台 | 买卖决策台 | |
|---|---|---|---|
| 归属 | 投研层阅读入口 | 操盘层 | 操盘层 |
| 用在什么时候 | 日常阅读 | 收盘后定调,盘中记偏差 | 建档、成交前后 |
| 解决什么 | 报告聚合与检索 | 决策与执行解耦 | 冲动与流程解耦 |
| 产出 | 只读,不产出 | Brain/交易计划/ | Brain/买入卖出决策/ + Brain/决策审计/ |
| 路由 | /reader | /plan | /sop |
Reader
把散在不同目录、不同月份里的市场洞察、投资雷达、策略分析、交易记录、持仓和 BrainStorm 聚在一个页面。它只读,不修改 vault。
- 递归发现:默认目录已预先登记并使用递归模式——新增
YYYY-MM月份目录、专题目录、标的目录或更深层子目录后,刷新 Reader 就会出现,不需要为每个月修改配置;目录启动时还不存在也没关系,后续由 Agent 创建后同样会被发现 - 自定义工作区:全新的产出路径只需在
config.json的reader_custom_paths登记一条相对或绝对路径(支持~),重启后自动生成「自定义工作区」,无需复制整份页面配置 - 脱敏合成示例:公开版在市场洞察、投资雷达和策略分析目录内各放一份
_示例/产物,首次打开就能看到报告结构;示例带ymos_sample: true标记,不会被策略路由、复盘或真实统计当作运行证据
Reader 不管定时任务。任务的启停与运行状态属于 Agents 协议和你的 Agent 宿主,Reader 只负责回答「我有哪些产出、我现在想读什么」。
交易计划台
把明天要做的事,在收盘后的冷静期全部想完写完——盘前定调、审持仓、审观察、列盘中动作。第二天开盘只执行,不在盘中现想。次日盘中还能回填「实际执行了什么」,和昨晚的计划做偏差对比。
买卖决策台
承载完整的交易生命周期:
买入逻辑建档 → 建仓准备 → Human 确认成交
→ 持仓管理 / 加仓 / 减仓 / 调整退出规则
→ 平仓验证 → 归档- 单笔 Markdown 是交易事实源:买入逻辑建档后即生成决策文件;建仓准备会复现论点、失效信号和退出规则,允许你在成交前修订
- 事件只追加,不覆盖:成交、加仓、减仓、退出规则调整和平仓都以事件追加——你三个月前怎么想的,永远改不掉
- 门禁全绿才允许扣扳机:开新仓 / 加仓 / 止盈 / 止损各有一组门;每一次扣扳机、每一次被拦,都写回
Brain/决策审计/ - 账户与持仓仪表:账户支持分币种、资金期限、资金变更流水;持仓总览从活动单笔文件聚合股数和成本,并从状态机恢复最近一次行情快照。价格过期时显示旧值与更新时间,不伪装成实时行情
真实成交、已执行计划与规则批准必须由 Human 产生。服务端会强制校验身份、合法状态迁移、成交金额、部分卖出余量与全部平仓归零;Agent 可以读取快照做体检、提出建议,但不得代替用户写「已成交」「已执行」或「已验证」。
跑起来
cd Console
cp config.example.json config.json # 然后编辑它
python3 server.py浏览器打开 http://localhost:5273,三个页面共用这一个服务、这一个端口。
需要 Python 3.9+。本地后端零第三方依赖,不用装任何 pip 包。默认只绑 127.0.0.1,不对外暴露。直接打开 HTML 文件只用于界面预览,不会写入正式 Markdown。
config.json 改这几项
| 字段 | 说明 |
|---|---|
vault_root | 你的 vault 里 YMOS 所在的绝对路径。留空 = 用本仓库根目录,开箱即可跑 |
plan_dir | 交易计划归档目录,默认 Brain/交易计划 |
audit_dir | 决策留痕归档目录,默认 Brain/决策审计 |
trade_dir | 买入卖出决策的生命周期档案目录,默认 Brain/买入卖出决策;平仓后移入 已平仓/ |
reader_custom_paths | 最简单的扩展入口:登记一条路径即得一个自定义工作区 |
reader_pages | Reader 的分区、分类、目录与扫描方式;需要多页面、白名单或「仅最近月份」等高级布局时才改这里 |
port | 默认 5273 |
想改 Reader 显示什么,改配置就行,不用动代码。
三条已经内建的结构
启动 Console 就有,不用配置:
| 结构 | 拦的是什么 |
|---|---|
| 计划与执行分离 | 盘前定调、盘中只执行。防止你在盘面刺激下重新发明规则 |
| append-only 事件流 | 原始论点和每次事件只追加不覆盖。防止你事后把「我早就知道」写进历史 |
| 门禁必须显式通过 | 结构性红线由页面计算,不给你「这次算了」的入口 |
第二条特别重要:能被改写的记录,等于没有记录。你三个月前写的买入理由必须原样躺在那里,周期审计才有东西可读。
换成你自己的规则(重要)
决策台里内置的门禁条目和仓位口径是一份样例,不是标准答案。rules.example.json 只演示 UI 规则结构,公开版不提供策略阈值默认答案。长期有效规则应写入 Brain/策略配置/ 的 Strategy Profile,再投影到 Console 所需规则;投影结果不能反向改写 Profile。
cp rules.example.json rules.json # 然后改成你自己的Console/rules.json 是 Profile 在操盘层的投影,不是第二套策略真相源。改的时候记住分工:
| 页面可以决定 | 页面不能决定 |
|---|---|
| 字段布局、操作顺序 | 你属于什么策略 |
| 提示方式、哪些需要显式确认 | 什么阈值是对的 |
| 清单里问哪些问题 | 哪条论点应该成立 |
| — | 是否绕过 Human 最终确认 |
不要同时维护一套 Profile 和一套跟它矛盾的 rules.json。冲突时以 Human 确认过的 Profile 为准。这正是 V4 的核心主张:框架是共用的,策略是你自己的。
页面本身也是作者打样。字段、顺序、页面布局和提醒方式都可以让你的 Agent 按使用习惯修改;但修改操盘页面不能偷偷创造一套与 Profile 冲突的新策略。改造方法见 扩展与生态。
从你自己的错误反推该装哪道闸门
这一步 Day 0 做不了——你在这套系统里还没犯过错。跑够样本之后再回来,方法是倒推:
找出重复发生的那类偏差
→ 问:它第一次变得可见,是在哪一步?
→ 闸门装在那一步,不是装在亏损发生的那一步举例:如果你反复「计划买 10% 仓位,实际买了 20%」,闸门不该装在成交确认(太晚了),该装在建仓准备——让金额超出计划时必须写一句理由。别照抄别人的闸门。作者的闸门拦的是作者的弱点,你的弱点大概率不一样。
数据落在哪
你的 vault_root/
├── Brain/买入卖出决策/ ← trade_dir
│ ├── [标的]_[日期].md 单笔生命周期(append-only 事件流)
│ ├── 买卖决策_状态机.md 账户级快照(最近行情 + Agent 可读体检)
│ └── 已平仓/ 平仓验证后归档
├── Brain/交易计划/ ← plan_dir
│ └── YYYY-MM/YYYY-MM-DD日交易计划.md 人读的正文 + 机器读的 JSON 围栏
└── Brain/决策审计/ ← audit_dir
└── YYYY-MM/YYYY-MM-DD决策记录.md 每次扣扳机 / 被拦截的留痕计划文件里嵌了 JSON 围栏,既能被人读,也能被页面和 Agent 解析回填。这是 YMOS 一贯的做法:同一份文件,人和机器都能用。
安全边界
- 服务只绑
127.0.0.1,不监听外网 - 写入文件名与目录由服务端生成,前端不能提交任意路径——防止越权写入 vault 的任意位置
- Reader 只能读取配置里明确登记的目录;白名单模式会校验精确文件名
- 行情、账户资金变化和规则调整记录时间、来源与旧值/新值
config.json和rules.json已在.gitignore里,不会被误提交- 数据结构见仓库
Console/TRADE_DATA_CONTRACT.md;回归测试:python3 Console/tests/test_trade_api.py
Reader 页面通过 CDN 加载 marked 与 DOMPurify。断网时页面仍能打开,但 Markdown 会降级为原文显示。这是已知取舍,不影响本地后端的零依赖承诺。
它和三层的关系
| 组件 | 回答的问题 |
|---|---|
| SOP | 这件事具体怎么做 |
| Agents 协议 | 谁来做、按什么顺序、能读写什么 |
| Reader | 投研产出怎么读 |
| 两个操盘工作台 | 判断形成后,怎么定计划、过门禁、留证据 |
Console 不生成分析,也不替你做判断。它做的事只有一件:让你在最容易变形的那一刻,多经过一道物理闸门。