Skip to content
jjMurphy1012Public

About

把你自己的交易纪律外化成可被数据检验的系统 · 美股单人自管账户 (Robinhood MCP + Claude Code) · 不提供交易策略,只提供让你的纪律被数据审计并不断修正的机制 · 不构成投资建议

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

meigu-ops

把你自己的交易纪律,外化成一个能被数据检验的系统
面向单人自管的美股账户 · Robinhood MCP + Claude Code

简体中文 | English

Python 3.11+ Zero dependencies 387 tests Built with Claude Code MIT Not investment advice

meigu-ops 演示

① 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。

自愈?准确说是"锚点存活时的 best-effort 修复"

会话级 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) ✅ ⚠️ 需 WSL 或 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 版本、仓库文件完整性、时区数据库。 有问题它会直接告诉你怎么修。

第二步 · 你自己动手连 Robinhood MCP

这一步 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.md

modes/_strategy.example.md 里全是问题、没有答案。 先只写 2–3 条你最相信的规则 —— 十条没被检验过的规则,不如两条被数据支持过的。

不想自己定策略?那也是一条正式路径

这一步会先问你走哪条:自己写,还是让 AI 按当时的分析来定、你确认。

选后者时,AI 先讲免责(它的策略同样可能是错的、它不掌握你的风险承受能力、 结果由你负责),再逐条把规则原文念给你。你确认之后才会写进 config/rules.toml,并带上 origin = "ai" 与 approved_at —— 有这两个字段,才分得清"你选择了信任 AI"和"AI 自己往文件里写了一条"。

写进去之后,它和你自己写的规则完全同权: 同样 hypothesis 起步、 同样最低仓位档、同样要台账数据 + 你的批准才能升级、同样会被数据推翻。

⚠️ 选这条路,风险由你自己承担。 其实和你自己写的规则是同一个道理: 任何规则在被你的台账检验之前都只是假设 —— 区别只在于自己写的那条, 你至少知道它从哪来。

复盘时可以按 origin 分开看一个很值得问的问题: 我自己写的规则和 AI 代拟的规则,哪一类被数据推翻得更多?

第五步 · dry-run 端到端演练

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。

License

MIT

About

把你自己的交易纪律外化成可被数据检验的系统 · 美股单人自管账户 (Robinhood MCP + Claude Code) · 不提供交易策略,只提供让你的纪律被数据审计并不断修正的机制 · 不构成投资建议

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages