把你自己的交易纪律,外化成一个能被数据检验的系统
面向单人自管的美股账户 · Robinhood MCP + Claude Code
简体中文 | English
① clone 之后只需记住 make setup —— 它会告诉你现在在第几步、下一步做什么
② AI 到点自己分析、自己决定,但下单前必须过闸门 —— 这次它拦下了:
意图是「部分减仓」,而这个仓位已缩水到只剩一个标准尺寸,实际会卖掉 90.9%
演示里的每一个数字、每一个标签、连账户号都是虚构占位
(examples/ 与 demo/ 固件;测试强制录制脚本不得读真实配置)。
一个 AI 自动炒股的辅助系统。
它为每个交易日设计了 五个默认检查时点,由 AI CLI 的会话级 scheduler 在首次运行时创建(仓库本身不含持久调度器 —— 细节见「它是怎么"自动"的」)。 到点后 AI 自己醒来,读实时行情与持仓、比对你的规则、给出买/卖/不动的结论, 够格就下单,并把当天发生的一切写进台账:
9:12 /meigu-ops premarket 盘前 → 候选清单 + 触发位 + 防守预案 + 今日不做什么
10:33 /meigu-ops check 盘中 → 三问过滤 → 买 / 卖 / 不动
13:03 /meigu-ops check
15:37 /meigu-ops check
16:06 /meigu-ops journal 尾盘 → 交易日志 + 台账 + 分层压缩 + 证据累积
"辅助"两个字是认真的: 它不替你决定该信什么,它替你保证—— 你信的东西每天都被执行、每笔执行都被检查、每条规则最后都要拿数据说话。
| 你得到的 | 靠什么实现 |
|---|---|
| 盯盘不再消耗你 | 五个检查时点自动触发,给的是完整判断(行情 + 持仓 + 当日催化 + 规则比对 + 明确结论),不是"XX 涨了 3%"的推送。而且它不会疲劳 —— 人连续盯盘多天会把"再等等"当成决策 |
| 每笔单必过闸门 | preflight.py 二十多道程序化检查,返回 ALLOW / DRY_RUN / DENY。DENY 就是不许下,AI 不能"人工判断通过" |
| 纪律有了对错判据 | 规则被引用、被台账数据审计、被升降级。样本不足时审计器拒绝下结论 |
| 仓位按证据缩放 | 未验证假设 40%,弱支持 70%,已支持满额。证据决定尺寸而非能否交易 —— 否则第一天就死锁 |
| 遗忘不再有代价 | 尾盘自动写日志并分层压缩。半年后"当时为什么卖",答案在台账里 |
| 数据不跟仓库跑 | 策略、账户、台账全部 gitignore + 扫描器 + CI,扫描器自己也有测试 |
| 全部可审计 | 387 个测试,只用标准库。每一道闸门都有测试证明它真的拦得住 |
| 闸门 | 挡住什么 |
|---|---|
| 减仓占比 | 意图"减一点",但仓位早已缩水 —— 实际会卖掉 90% |
| 报价时间戳熔断 | 分析与下单之间机器睡过去了,拿旧价格下单 |
| 意图时效 | 会话卡住半小时后解冻,执行的是半小时前的判断 |
| 持仓股数 / 清仓数量 | 持 1 股却下 2 股;声明清仓却只卖一部分 |
| 单笔 / 单日 / 笔数上限 | 情绪上头连续加仓 |
ref_id 去重 |
同一笔单被重复提交 |
| 账户身份 | 下到了错误的子账户 |
这些不是文档里的提醒,是程序。提醒会被忽略,程序不会。
你写下规则 ──► 每日决策时被引用 ──► 交易进台账 ──► 复盘时被数据审计
▲ │
└────────── 升级 / 降级 / 退役(需你批准)◄───────────┘
一般的交易机器人执行策略,但从不告诉你策略对不对。这里 make stats 会回答:
哪条纪律其实一直在帮你,哪条只是让你心安、实际在拖后腿。
"这周赚钱了所以规则对"是错的 —— 运气、市场环境、样本太少, 任何一个都能造出那个结论。所以一条规则要改变状态(从而改变它能调动多少真钱), 必须同时过四关:
| 问题 | 不过会怎样 | |
|---|---|---|
| ① | 样本够不够多(≥ 10 谈方向,≥ 20 谈改状态) | 「数据不足」 |
| ② | 前后两段结论一致吗 | 「环境可能变了」,禁止改状态 |
| ③ | 差异超过组内波动吗(信噪比 ≥ 1.0 / ≥ 2.0) | 「差异在噪音范围内」 |
| ④ | 最近 2 次审计同向吗 | 「判定在翻转,翻转期不要改状态」 |
② 是关键的一关。 一条只在下跌趋势里成立的规则,在市场转多后必然连续"失效"。 只有「支持 / 不支持」两个出口时,它会被判成规则错了 —— 然后你在市场即将回到它擅长的环境时,亲手把它退役。
所以审计有第三个出口 🔀「环境可能变了」:前后两段结论相反就禁止改状态, 提示你补一个适用环境的条件、分环境重新计数。 判"规则错了"的门槛因此高于判"没用":必须前后两段都不支持,一次反转只回观察期。
四关全过,审计也只产出建议 —— --set-status 不带 --approved 直接退出。
状态变更改变的是这条规则能否指导真钱下单,那是你的决定,不是 AI 的。
每天积累经验的系统最容易死于自己的记忆:日志长到没人再读、也塞不进上下文。 所以历史按时间尺度分三处存放,没有任何一份会被整体拼进提示词 —— mode 按需加载,盘中检查点不会把三个月的日志一起端上来。
| 存放处 | 内容 | 尺度 |
|---|---|---|
data/journal.md |
每日尾盘:做了什么、为什么、当时怎么想 | 天 ~ 周 |
config/rules.toml 的 evidence |
某条规则被哪次交易验证 / 证伪 | 月 ~ 永久 |
data/lessons.md |
周期复盘的结论档案 | 月 ~ 永久 |
日志按交易日年龄分层压缩(默认值,[journal] 可调):
≤ 3 个交易日 全细节:操作、理由、当时的判断
3 ~ 14 个交易日 单行摘要:日期 + 做了什么 + 一句结论
> 14 个交易日 并入按周摘要
全文上限 150 行 超限时一次性合并最老的多条,而不是只压一条
为什么是 3 和 14: 3 天是盘中决策真会回头看的窗口("昨天那笔减仓的理由还成立吗" 需要当时的完整叙述);14 天约等于一轮行情,超过它单日细节没有边际价值。 早期用过单一的"7 天"阈值 —— 问题是它把决策窗口和归档窗口混成了一件事。
脚本只规划"哪条该压、压到几行"(
make journal-check),摘要文字由人/AI 写 —— 它不臆造语义。
真正的长期记忆不是日志,是规则。 日志会被压缩变模糊(有意的);
一次交易教会你的事应该落到某条规则的 evidence 上。一年后你不必读一年日志,
只读几十条规则和它们的证据 —— 那才是经验被整理之后该有的样子:
能被检验、能被推翻、而且读得完。
2026 年 6 月,我在一次财报爆表的次日开盘一次性满仓追进当时最热的主线。 接下来两周,市场把那一轮涨幅原样还了回来。
有意思的是后面:靠几条很朴素的纪律——在反弹里减而不是在下跌里割、先砍最弱的一环、 在已知的二元事件前把现金提上来——我把损失控制在个位数百分比, 同期我持仓所在的板块指数跌了 7% 以上。
问题是那几条纪律只存在于我脑子里。 脑子会忘、会侥幸、会在连续多天盯盘后懈怠。 更糟的是一个月后我发现了相反的毛病:同一套"谨慎"让我在该出手时反复等待, 现金长期空转——那笔亏损同样真实,只是它不出现在盈亏表里。
两个方向的失败让我确认了一件事:问题不在于我的规则对不对, 而在于我没有任何机制去知道它们对不对。
于是有了这个项目:把纪律从脑子里搬进文件,把机械的检查从自觉搬进程序, 最后——也是最花时间的一部分——把"这条规则到底成不成立" 变成一个能被台账数据回答的问题。跑到现在,最明显的变化不是某一笔赚得多, 而是账目变稳了: 收益的波动明显收窄,目前稳定在 5% 左右。"稳定"比"更高"更有意义—— 前者说明机制在起作用,后者可能只是运气。
你在这个仓库里找不到我的那几条纪律。它们对你没有意义,我自己也在不断修正它们。 留下的是那套让纪律能被检验、能被推翻的机制。
上面那个数字是我自己账户的经历,不是系统的承诺,也不构成收益预期—— 同一套机制配上不同的规则,结果可能完全相反。
载体是 Claude Code 的会话级定时任务:到点触发 /meigu-ops <mode>,
AI 读实时行情与持仓、跑完分析、过闸门,够格就下单,不够格就明确说"今天不动"。
这是 token 预算问题,不是能力问题。 每个检查点都是一次完整分析 (行情 + 持仓 + 新闻 + 规则比对 + 结论)。按"每 15 分钟看一眼"来排, 前几天就能把一个月的额度烧光,剩下三周一个都跑不了。
五个节点覆盖一天里信息密度最高的时点:开盘一小时后(波动消化完)、午盘、 尾盘前,加上盘前定方案与收盘写日志 —— 而不是把算力平摊在噪音上。
初始化后可自建节点(财报、FOMC、CPI)。加之前先想清楚它花的 token 值不值那次判断。
| 前提 | 为什么 |
|---|---|
| 会话窗口保持打开 | 定时任务是会话级的,CLI 退出即丢 |
| 电脑接着电源 | 电池模式下系统更激进地休眠 |
| 电脑不进入休眠 | 睡着了就不会醒来 —— 同一笔减仓曾连续两天在 review 与 place 之间被休眠截杀 |
macOS 上 make doctor 会替你查这三项。caffeinate 挡不住物理合盖 ——
交易时段要么保持开盖,要么 sudo pmset -a disablesleep 1。
会话级 cron 会随 CLI 退出而丢、且 7 天过期。9:12 的 premarket 每天第一件事,
是核对另外四个节点、掉了就重建 —— 但 9:12 自己掉了,没有任何任务能唤醒它;
五个同时过期同理。
真正的自愈需要仓库之外的持久调度锚点(launchd / 计划任务 / 服务器), 这一块目前还没有。
三平台 × Python 3.11/3.13 共 6 个 CI job,每次提交都跑一遍 —— 下面这张表是实测结果,不是代码审查的结论。
| macOS | Windows | Linux | |
|---|---|---|---|
| 全部脚本与闸门(387 个测试) | ✅ CI | ✅ CI | ✅ CI |
仪表盘 TUI(make dashboard) |
✅ | windows-curses |
✅ |
仪表盘静态渲染(--render) |
✅ | ✅ | ✅ |
防休眠自检(make doctor) |
✅ | ➖ 自动跳过,需自己在电源选项里关休眠 | ➖ 自动跳过 |
| 时区数据库 | 系统自带 | 需 pip install tzdata |
系统自带 |
make 命令 |
自带 | 需 WSL / Git Bash,或直接 python scripts/xxx.py |
自带 |
**权限方面没有特殊要求:**不需要管理员权限,不写系统目录,不装后台服务
(macOS 上的 caffeinate 是可选的防休眠措施,不是运行前提)。
所有文件都在仓库目录内。唯一会写到仓库之外的是你自己配置的 Claude Code 设置。
加 Windows runner 的第一次运行就抓到两个真问题(控制台编码编不出 ✅ 导致每条命令都崩、一处写死
/的路径断言)。在那之前"Windows ✅" 只是读代码读出来的结论。
| 特性 | 说明 |
|---|---|
| 审计拒绝草率结论 | 结论方向与证据强度分离:< 10 个决策事件不下结论,10–19 只给"弱支持/弱反驳",≥ 20 才可建议改状态 —— 而任何状态变更都需要你批准 |
| 样本单位是决策事件 | 一笔卖单匹配三个历史买入批次,仍然只算一次退出决策 —— 不是三个样本 |
| 接入状态机是闸门 | 六步没走完,每一笔真单都会被 preflight DENY —— 不是提示,是拦截 |
| 平台机制知识库 | modes/_mechanics.md 汇总券商 MCP + Claude Code 会以什么方式把正确决策变成失败执行:结算、时间戳熔断、休眠截杀、时区漂移、权限弹窗冻结会话 |
| 只读仪表盘 TUI | 组合 / 台账 / 规则审计三页。整个 UI 是纯函数,因此被测试完整覆盖 |
| 日报骨架 config 驱动 | 指数、板块、主题、风险维度全部来自你的配置。模板里没有任何行业或个股名 |
| 零依赖 | Python 3.11+ 标准库(Windows 需 pip install tzdata) |
你不会在这里找到"什么时候买"、"现金留多少"的答案 —— 那些答案对你没有意义: 账户规模、风险承受度、标的池、能投入的盯盘时间,每个人都不同。 照抄一套不属于你的规则比没有规则更危险:你会在不理解它为什么成立的情况下执行它, 然后在它失效时既发现不了、也无法修正。
仓库提供的是让你自己的纪律能被数据检验的机制。你也可以让 AI 代拟策略再由你确认 (见第四步)。
| 不碰 | 原因 |
|---|---|
| 期权 | 时间价值衰减 + 杠杆,单次失误的代价与正股不是一个量级 |
| 杠杆 / 融资 | 强平会把"判断错了"变成"退不出来了" |
| 裸空 | 亏损理论上无上限 |
只做正股买卖,所有闸门默认取值偏保守。默认不做冒险动作 —— 宁可错过,不可失控。 你当然可以写一套激进的规则:系统不阻止你冒险,只保证你冒的险是被记录、 被检验、能被数据推翻的。
别信"四条无条件"这种省略说法 —— 买入和卖出是不对称的:
| 约束 | 买入 | 卖出 |
|---|---|---|
| kill switch / 账户身份 | 无条件 | 无条件 |
| 单笔金额上限 | 无条件 | 由持仓市值封顶(+2%) |
| 单日累计金额 | 无条件 | 不适用 |
| 单日笔数 / 同标的当日重复 | 无条件 | intent=close 的清仓可豁免,但须提供持仓证据 |
卖出的豁免是刻意的:风控如果能阻止你降低风险,它就不是风控。 但每条豁免都要求拿出持仓数据 —— 豁免有代价,才不会变成后门。
❌ 五个检查点没有持久调度:会话级 cron,CLI 退出即丢
❌ 仓库无法从代码层面阻止 agent 绕过 preflight 直接调用券商 MCP ——
只能靠 .claude/settings.local.json 的权限白名单
❌ 成交结果不会自动回写台账 —— 记台账仍是 journal mode 的动作
所以现阶段准确的说法是**「有人在场的自动化」**。 真正的无人值守还需要持久调度器与唯一下单网关,那是下一阶段的工作。
git clone https://github.com/jjMurphy1012/meigu-ops.git
cd meigu-ops
make setup # ★ 唯一需要记住的命令:它会告诉你现在在第几步make setup 是一个状态机。下面六步就是它的六个状态 ——
你不需要背,它每次都会告诉你下一步做什么:
1. UNINITIALIZED 环境与仓库完整性
2. MCP_CONNECTED_READONLY 券商只读验证 —— 连得上、连对账户、能拿到时间戳
3. PROFILE_READY 账户号与四条硬上限
4. STRATEGY_READY 你自己的标签词表与规则 ← 最花时间的一步
5. AUTOMATION_READY dry-run 端到端演练
6. LIVE_AUTHORIZED 单独授权真钱执行
顺序是刻意的:连接要早、只读;授权要晚、单独。
make setup 自己完成:Python 版本、仓库文件完整性、时区数据库。
有问题它会直接告诉你怎么修。
这一步 AI 替你做不了,也不该替你做 —— 它需要你的券商账号登录, 把登录凭据交给任何自动化流程都是错的,包括这个项目。
在 Claude Code 里按 Robinhood MCP server 的官方说明手动完成连接与登录,
然后回到会话里说一句"我连好了"。AI 接下来做的是只读验证:
读账户列表、在其中定位你的子账户、读持仓、读买力、取一条带时间戳的报价、
确认 review_equity_order 可调用 —— 全程不会调用 place_equity_order。
九项逐条核对,缺一不可;读到的账户号与 config/profile.toml 不一致会直接拒绝,
不会替你猜一个。验收标准是真的读到数据,不是"检测到 MCP 配置文件"。
为什么连券商排在第二步而不是最后一步:把它放到最后,你会先配半天, 才发现账户或权限根本不可用 —— 而那时 MCP 的问题和项目配置的问题已经混在一起, 分不清是谁的错。但连接成功不等于获得下单权限,那是第六步。
cp config/profile.example.toml config/profile.toml填入刚刚验证过的子账户号,并定四个数:单笔上限、单日买入累计、 单日笔数、紧急停止开关的文件路径。按"单日全损也能承受"的量级来定。
执行开关此时仍全部关闭 —— 这一步只是配置,不是授权。
cp config/reason-tags.example.toml config/reason-tags.toml
cp config/rules.example.toml config/rules.toml
cp modes/_strategy.example.md modes/_strategy.mdmodes/_strategy.example.md 里全是问题、没有答案。
先只写 2–3 条你最相信的规则 —— 十条没被检验过的规则,不如两条被数据支持过的。
这一步会先问你走哪条:自己写,还是让 AI 按当时的分析来定、你确认。
选后者时,AI 先讲免责(它的策略同样可能是错的、它不掌握你的风险承受能力、
结果由你负责),再逐条把规则原文念给你。你确认之后才会写进
config/rules.toml,并带上 origin = "ai" 与 approved_at ——
有这两个字段,才分得清"你选择了信任 AI"和"AI 自己往文件里写了一条"。
写进去之后,它和你自己写的规则完全同权: 同样 hypothesis 起步、
同样最低仓位档、同样要台账数据 + 你的批准才能升级、同样会被数据推翻。
复盘时可以按
origin分开看一个很值得问的问题: 我自己写的规则和 AI 代拟的规则,哪一类被数据推翻得更多?
make start-drill # 拿一个 run id确认 dry_run = true,然后完整跑一遍:盘前 → 盘中 → preflight → 模拟下单
(走完 review,不 place)→ 尾盘日志 → 复盘。
其中 preflight / journal / review 三个环节会留下机器证据,
--record-drill 只认这些证据,不认自报的布尔值;某个环节跑了但没通过,
也不算通过。
演练的意义是把"配置对不对"和"链路通不通"分开验证 —— 链路没跑通就开真钱,出问题时你分不清是策略错了还是管道漏了。
# 先用 guarded:仓位统一压到最低档,不管规则状态多好
python3 scripts/setup.py --authorize-live guarded --approved前五步没全过会被拒绝;写入后会回读校验,值没真的落盘就不会报成功。
而且这不是一次性检查:每一笔真单进 preflight 时都会重新验一遍六步状态。
跑一段确认健康之后,才考虑 --authorize-live autonomous --approved
(仓位按规则状态缩放)。"开真钱"和"放开仓位"是两个独立决定。
只想看看效果、不连券商?
make setup-demo # 接入状态机长什么样,用虚构固件
make dashboard-demo # 全套工作流,不需要任何账户
python3 scripts/stats.py --demo完整配置见 docs/SETUP.md。
| 命令 | 作用 | 为什么不让 LLM 做 |
|---|---|---|
make doctor |
配置 / 时钟漂移 / 防休眠 / 权限白名单 / 台账 / 日志 | 每一项都对应一次真实故障 |
make preflight |
下单前置检查 → ALLOW/DRY_RUN/DENY |
最有后果的检查最不该靠自觉 |
make rules-check |
规则格式、标签引用、闸门引用、散文同步 | 写错闸门名会让规则显示「程序强制」但其实无人把守 |
rules.py --record-evidence / --set-status |
机械化地写回规则(改状态需 --approved) |
让 agent 手改 TOML 会静默破坏审计 |
make stats |
FIFO 实现盈亏 / 标签绩效 / 规则审计 | 复盘最大的陷阱是凭印象 |
make dashboard |
只读仪表盘 TUI | 每天要看的三张表,一屏看完 |
make trading-day |
交易日 / 半日市 / 上下一交易日 | 观察日顺延、耶稣受难日人算会错,错一次毁一天 |
make journal-check |
日志结构:标题 / 倒序 / 孤儿段落 / 行数 | Edit 返回成功 ≠ 文档结构对了 |
make setup |
接入状态机:当前哪一步、下一步做什么 | 连券商与授权真钱必须分开,顺序错了会把两类问题混在一起 |
make check-privacy |
提交前隐私检查 | 人会忘,而这个错误不可逆 |
┌───────── ✅ 系统层(可开源)─────────┐ ┌──── ❌ 用户层(永不进仓)────┐
AGENTS.md modes/_mechanics.md config/profile.toml 账户与授权
modes/{premarket,check,trade,...}.md config/reason-tags.toml 你的标签词表
templates/ scripts/ tests/ docs/ config/rules.toml 你的规则
config/*.example.* modes/_strategy.md 你的策略
modes/_strategy.example.md data/ reports/ 台账/日志/日报
└─────────────────┬───────────────────┘ └──────────┬────────────┘
│ │
.gitignore 强制 make check-privacy + CI no-user-data
判断标准是一个问题:这是"怎么做"还是"做了什么"? "怎么细分交易理由、相信哪些规则"属于后者。完整契约见 docs/DATA_CONTRACT.md。
- 券商:只对接 Robinhood MCP,不做多券商抽象。
- 市场:美股。交易日历按 NYSE/Nasdaq 规则计算(不含临时休市)。
- 风格无关:日报骨架、标签词表、规则全部由你的配置驱动 —— 仓库不预设任何研究方向。
- 规模:为单人自管的小额账户设计(分数股、市价单滑点、现金账户 T+1 都在考虑之内)。
| 文件 | 内容 |
|---|---|
| AGENTS.md | 唯一共享上下文:铁律 / 数据契约 / 不可信内容 / 活文档维护 |
| docs/SETUP.md | 安装、配置、AI CLI 接入、券商权限与防休眠 |
| docs/ARCHITECTURE.md | 设计原则、数据流、关键技术决策 |
| docs/DATA_CONTRACT.md | 开源边界 + 台账 / 日志 / 快照 / 规则的格式规范 |
| CHANGELOG.md | 系统层演进(策略变更不进这里) |
| DISCLAIMER.md | 免责声明 |
- 纪律可以被删除。 定期审计;从未被数据支持的规则是包袱。
- "不动"必须是结论,不是回避。 决定不操作时要逐个点名每个候选被什么理由挡住。
- 闲置也是成本。 它只是不出现在盈亏表里,所以复盘要对称地审计"漏掉的机会"。
- 绝不编造数据。 取不到就写"暂无可靠数据"。留白永远优于编造。
- 判断错 ≠ 规则错。 依据充分但市场走反不该改规则 —— 那是过拟合到噪音。
本项目不构成投资建议。 它是个人研究与流程工具,不预测市场,
不推荐任何证券的买卖或持有。仓库内出现的所有代码、价位、标签均为结构示例或占位,examples/ 与
demo/ 中的全部数字为虚构。
本项目可以自动向券商提交真实订单。 启用前请自行确认 API 权限、订单类型、 金额上限、账户结算规则,以及自动化失败时的兜底。由此产生的任何盈亏均由使用者自行承担。
完整声明见 DISCLAIMER.md。
