我做过一次实验:把量化研究拆成 5 轮对话 + 一份可自动执行的 plan.md,人只定标的、因子逻辑和验收标准,其余交给 AI 写代码、跑回测、做检查。
自动执行那一段,机器跑了大约 22 分钟(6 个阶段、6 次 git commit,中间有 7 次它自己发现并改掉的实现问题——前视偏差、止损逻辑之类,另一篇文章里按条写过)。这 22 分钟不包括你前期想清楚策略、写 CLAUDE.md / plan 的时间;我这边对话定方向大概还要 10–15 分钟。
若按我以前的节奏,从零拉数据、写因子、回测、风控、调参到能看的报告,一个人通常要 1–2 周(复杂一点才会拖到 3–4 周);这次我没有手写实现代码,但仓库里照样有成百上千行 Python,只是作者换成了 AI。回测做过一次专门挑前视偏差的内审,纸面结果、未实盘——审计前后差异详见《Sharpe 1.74 是假的:22 分钟 AI 量化》。
这套流程能重复,靠的不是运气,而是把 AI 摆在对的位置:它不是替你思考策略的”军师”,是替你写代码的”分析师”。你做决策,它做执行。
整套 SOP 的骨架长这样:
这套 SOP 由一个核心分工、三个文件、五轮对话和两道风险检查组成。
一、你是研究总监,AI 是分析师
把 AI 当军师让它帮你”找一个 Sharpe 大于 2 的策略”,结果只会是一个挖了过拟合数据的垃圾。Alpha 来自人对市场的理解,不是来自 AI 在历史数据里搜索。
更合适的比喻是:你是研究总监,AI 是分析师。
总监的活:
| 决策 | 你的输出 |
|---|---|
| 选什么标的 | 15 支美股科技股(NVDA、AMD、TSLA…) |
| 用哪些因子 | 4 层 AND 入场逻辑 |
| 怎么编排任务 | 先向量化海选,再 bar-by-bar 决赛 |
| 怎么算好策略 | Sharpe > 0.8、MaxDD < 30% |
| 达标后做什么 | 鲁棒性检验 + 仓位优化 |
分析师的活:
| 任务 | AI 的输出 |
|---|---|
| 拉数据 | 2554 bars/股的日频 OHLCV |
| 实现因子 | 8 个因子的 Python 代码 + 单元测试 |
| 跑回测 | 38 种参数组合的向量化扫描 |
| 精细验证 | bar-by-bar + 追踪止损 |
| 鲁棒性 | 仓位优化 + 5 项检验 |
总监花 10-15 分钟对话定方向,分析师花 22 分钟全自动执行,7 次自修正,0 次人工干预。这是一次完整的分工。
为什么要这么分?因为这两类工作的核心能力差太远了。
研究总监要做的,是判断”什么是好策略”——动量突破在科技股上历史有效、4 层 AND 过滤能压住假信号、追踪止损比固定止损更适合趋势策略。这套判断来自市场认知和经验,AI 没有,而且短期内也学不会。
分析师要做的,是把判断翻译成代码——拉数据、算指标、跑回测、扣成本、做参数扫描。这是确定性工作,规则清晰、有标准答案、能自动验证。AI 在这里是降维打击。
颠倒一下会怎么样?让 AI 当总监,你当分析师——AI 拍脑袋说”我建议你做截面因子策略,配 RSI 和 MACD”,你照着写代码。半个月写完跑出来,赚不赚钱看运气,因为没人为这个策略的内在逻辑负责。
我第一次让 AI 跑量化的时候,它把止损价用了”当天最低价”——而当天最低点是收盘后才能知道的,这就是经典的前视偏差。光这一个 bug 就能让 Sharpe 虚高 70%。5 轮对话不是噱头,是被这种坑教训出来的。
你不需要会写 Python,只需要知道:好策略长什么样、如何系统地找到它。
二、三个文件 = 三个角色
5 轮对话沉淀下来的不是聊天记录,是三份持久化的项目文件。它们是 AI 的外部记忆系统,下次唤醒能精确恢复上下文。
把这三个文件想成一个工地的三种文档:
- CLAUDE.md 是项目宪法——告诉所有人这个工地不许偷工减料
- plan.md 是施工图纸——告诉施工队第几天该砌墙、第几天该浇梁
- progress.md 是工地日报——记录今天砌到哪、出了什么状况、明天接着干
三个文件是整套流程的关键:角色分清后,5 轮对话就只是水到渠成的填空题。
为什么不直接靠对话历史?因为长对话会被截断,记忆会漂移。三个文件就是 AI 的外部硬盘——重启一次,加载一次,状态完全恢复。
CLAUDE.md:项目宪法
宪法定边界,不定步骤。它告诉 AI:”你能做什么、不能做什么、做到什么程度算成功”。
# CLAUDE.md - Project Constitution
## Project Overview
- Universe: 15 US tech stocks
- Strategy: CTA momentum breakout
## Tech Stack
- Python 3.12 / uv / pytest
## Acceptance Criteria
- Sharpe > 0.8 after cost
- MaxDD < 30%
## Forbidden
- 严禁使用未来数据(lookahead bias)
- 每个 Phase 必须 git commit
宪法的关键组成:项目边界(标的/数据/频率)、技术约束(Python/uv/pytest)、验收标准(Sharpe/DD/交易数)、协作规则(每 Phase commit)、禁忌事项(禁用未来数据)。
没有 CLAUDE.md,AI 会自由发挥——参数漂移、依赖混乱、跑出来的结果下次复现不了。有 CLAUDE.md,AI 每次执行前先读规范,行为一致。
plan.md:施工图纸
宪法说”不能偷工减料”,图纸说”先打地基、再砌墙、最后封顶”。plan.md 把研究拆成 6 个 Phase,每个 Phase 只做一件事,前一步是后一步的输入:
P0 数据获取 → P1 因子实现 → P2 向量化粗筛
→ P3 bar-by-bar 精细 → P4 仓位优化 → P5 鲁棒性检验
施工图纸的设计原则:
- 渐进式:每 Phase 单一职责,不混搭
- 可回溯:每 Phase 完 commit,出问题能 reset 重跑
- 自验证:AI 自动比对验收标准,不达标自动修正
- 可中断:任何 Phase 都能暂停,下次断点续传
图纸越详细,返工越少。
progress.md:工地日报
施工队边干边记。progress.md 不是 AI 写给你看的,是 AI 写给”下一次的自己”看的。
Phase 3 完成
v5: Sharpe 1.23, MaxDD 44.89%(仓位等权,未优化)
v6: Sharpe 1.04, MaxDD 27.08%(C3 波动率加权)
踩坑:止损价用了当天最低价,已修复为预设止损线
当前最优参数:MA50, ATR×3, T+15
它记录当前 Phase、踩过的坑、最优参数、中间结果。等你回头看回测演变史,progress.md 就是完整的审计日志。
这套”宪法 + 图纸 + 日报”的组合,是 Harness Engineering 的核心实践——用结构化外部文件替代会被截断的对话记忆。
三、5 轮对话拆解
知道了三个文件的角色,5 轮对话就是按顺序把它们填出来。
第 1 轮:定项目宪法(输出 CLAUDE.md)
你给一段约束,AI 写出 CLAUDE.md。
你的输入大概长这样:
项目: 一个实验性的量化项目
标的: AMD,AMZN,AVGO,GOOGL,IBM,INTC,
LSCC,MSFT,NVDA,NXPI,QCOM,TSLA,TSM,BIDU,CSCO
策略类型: CTA momentum breakout
数据源: futu-api daily OHLCV
因子逻辑: 4-layer AND entry
验收: Sharpe > 0.8, MaxDD < 30%
工具链: Python 3.12 + uv + pytest
AI 接过这些约束,扩写成完整的 CLAUDE.md,包括项目边界、验收标准、禁忌事项、协作规则。这一轮的关键是把”什么算成功”写死,后面 AI 自己评判达没达标,就靠这条标尺。
经验:验收门槛一定要写具体数字,不要写”表现要好”。我吃过一次亏——只写了”Sharpe 高一点”,AI 默认 Sharpe > 1.5 才算达标,跑出来不达标就反复加规则、套滤镜,最后做出一个明显过拟合的版本。改成 “Sharpe > 0.8” 之后,第一轮就能跑出干净的策略,其余时间都用在审计和优化上。
第 2 轮:固化因子池(输出 factors.md)
你不需要会写 Python,只要把因子讲清楚——大白话、数学公式、伪代码都行:
因子 1:收盘价连续 5 日站上 MA50,确认中期趋势
因子 2:当日 High 突破过去 63 日最高价,3 个月新高
因子 3:成交量大于 20 日均量的 1.2 倍,确认资金参与
因子 4:当日涨幅大于 ATR14 × SMA3,波动突破
描述越清晰,AI 产出质量越高。AI 接到这些描述会做三件事:判断歧义(如果有,反过来追问你)、补充工程细节(warmup、NaN 处理)、生成单元测试。
输出是一份 factors.md 注册表:
### Factor_01_MA50_Stand
desc: 收盘价连续 5 日站上 MA50
impl: factors/ma50_stand.py
test: ✓ unit_test passed
### Factor_02_3M_High
desc: 当日 High 突破 63 日最高
impl: factors/high_3m.py
test: ✓ unit_test passed
这一轮的核心理念:你提供金融逻辑,AI 负责工程实现。专业壁垒在你对市场的理解,不在你会不会写 Python。
实战提醒:因子描述里的”模糊表达”要主动消除。比如”放量”——多少倍算放?”突破”——突破谁?”持续向上”——多少天算持续?这些含糊的词在你的脑子里有默认值,但在 AI 那里没有。第二轮的输入越精确,第二轮就越短;输入糊弄过去,AI 写出来的因子和你想的就是两回事,等到 Phase 5 才发现就晚了。
第 3 轮:对齐计划(7 个决策点)
这是最关键的一轮。AI 列出它理解的执行计划,你逐项 approve 或 modify,形成”执行合同”。
| # | 决策点 | 内容 | 状态 |
|---|---|---|---|
| D1 | 数据范围 | 15 支股票 · 2016-03~2026-05 · 日频 | approved(2554 bars/股) |
| D2 | 因子组合 | 4 层 AND 入场 | approved(不做 OR / 分组) |
| D3 | 参数搜索空间 | MA:30-70 · ATR乘数:2-5 · hold:10-20 | approved(约 35 组合) |
| D4 | 回测引擎 | Phase2 向量化 → Phase3 bar-by-bar | approved(先粗后精) |
| D5 | 持仓 & 出场 | T+15 持有 + ATR×3 追踪止损 | approved |
| D6 | 仓位管理 | 等权 1/15,max_pos=15 | approved(后续可升级 C3) |
| D7 | 验收门槛 | Sharpe > 0.8 + MaxDD < 30% + Trades > 100 | modify:追加成本压力测试 |
7 项确认 ≈ 2 分钟阅读 + 一条”approved with D7 modification”消息。
为什么必须要这一轮?因为 AI 跑偏的代价是返工 22 分钟。先对齐 2 分钟,等于给后面的全自动执行上一道保险。
我自己最容易在这一轮发现 AI 理解偏差——比如它把”3 个月新高”理解成了”过去 90 自然日”,我会改成”过去 63 个交易日”。或者它默认了向量化回测就够了,我会要求加上 bar-by-bar 精细验证。这种细节对齐,越早做越省事。
D7 那个 modify 标记是个真实例子。AI 第一版给的验收门槛只有”Sharpe + MaxDD + Trades”三条,我加了一条”成本压力测试必须过基准成本一档”——后来事实证明这一条救了命,因为初版策略在零成本下 Sharpe 1.14,加完佣金滑点掉到 1.04,再往上一档就只有 0.96 了。如果验收门槛里没有这条,AI 跑完会自信地报”达标”,但实际上策略对成本相当敏感。
第 4 轮:固化 plan.md(6 阶段路线图)
7 个决策点 approve 完,AI 把它们编织成一份 plan.md——6 个 Phase 的执行路线图:
| Phase | 名称 | 内容 | 输出 | 时长 |
|---|---|---|---|---|
| P0 | 数据获取 | futu-api 拉 15 支 · OHLCV 日频 · 复权 · 缺失值检查 | 2554 bars/股 | ~3 min |
| P1 | 因子实现 | 8 个因子 + 单元测试 + 边界值验证 | factors/*.py | ~4 min |
| P2 | 向量化粗筛 | 38 种组合扫描 · 排除 Sharpe<0.5 · Top-5 进入精细 | 排名表 | ~5 min |
| P3 | 精细回测 | bar-by-bar · 追踪止损 · 佣金+滑点 · 净值曲线 | equity curve | ~5 min |
| P4 | 仓位优化 | C2→C3 升级 · 波动率加权 · A/B 对比 | 仓位配置 | ~3 min |
| P5 | 鲁棒性检验 | 参数网格 + 成本压力 + 期间拆分 + 滑点扰动 | 通过/不通过 | ~2 min |
总计 22 分钟,0 人工干预,7 次自修正。
plan.md 审批通过后,AI 不再问你”我下一步该做什么”——它有图纸了。
这一轮要看 AI 写出来的 plan.md,重点检查三件事:每个 Phase 的输出物是否具体可验收(比如”产出净值曲线 PNG”而不是”完成精细回测”)、Phase 之间的依赖是否正确(P3 必须在 P2 之后)、回退方案是否清晰(某个 Phase 失败了怎么办)。
第 5 轮:发执行 Prompt(你的最后一条消息)
最后一条消息约 500 字,规则细到 AI 想跑偏都没空间:
请按 plan.md 从 Phase 0 开始执行,规则:
1. 每个 Phase 完成后 git commit(commit message 含 Phase 编号)
2. 每个因子必须有 pytest 单元测试
3. 回测扣减佣金 5bp + 滑点 3bp
4. 不得使用未来数据(strict no-lookahead)
5. Phase 3 必须实现追踪止损:highest - 3×ATR(14)
6. Phase 5 跑 5 项鲁棒性测试:
- 参数网格(MA30-70 × ATR2-5)
- 期间拆分(3 段)
- 成本压力(0/基准/中等/高)
- 滑点敏感度(0-10bp)
- 持仓天数扰动(T+10/15/20)
最终验收:Sharpe(基准成本)> 0.8 且 MaxDD < 30%
发送出去。AI 立即开始 Phase 0,22 分钟自动执行,逐 Phase commit,遇错自动修正。你要做的,就是等 22 分钟,回来看完整的 Python 项目和 HTML 报告。
Prompt 写得越具体,AI 返工越少——这就是为什么前 4 轮要把约束写清楚。
四、避坑:两个最常见的误解
跑完几次以后我发现,新手翻车的姿势惊人地一致,永远是这两个。
误解 1:”AI 帮我找 alpha”
错误姿势:「帮我找一个 Sharpe 大于 2 的策略」。
AI 收到这个 Prompt 会怎么干?它不会拒绝,它会过度拟合历史数据,挖出一个 Sharpe 3.0 的”纸面策略”。你拿去实盘跑,第一周就爆亏。
正确姿势:你定逻辑(动量突破 + 4 层过滤),AI 负责实现 + 验证 + 优化参数。Alpha 来自你对市场的认知,不是 AI 在数据里的搜索。
把 AI 当军师,它会把你带沟里。把 AI 当分析师,它能帮你节省 99% 的实现成本。
这是一个特别反直觉的点:AI 越强,越要克制对它的”信任范围”。你越愿意让它替你想策略,它就越乐意拿历史数据反向工程一个看上去漂亮的答案给你。这不是 AI 在骗你,是它的优化目标和你的真实目标错位了——它在追求”在你给的数据上表现好”,你在追求”在未来的市场里能赚钱”。
误解 2:”回测好 = 能赚钱”
我第一版跑出来的策略,Sharpe 1.74、年化 54.66%,看上去封神。审计完之后剩多少?Sharpe 1.04,年化 31.82%——直接砍掉 40%。
| 指标 | 审计前(v1) | 审计后(v6) | 变化 |
|---|---|---|---|
| Sharpe | 1.74 | 1.04 | -40% |
| 年化收益 | 54.66% | 31.82% | -42% |
| MaxDD | 22.43% | 27.08% | +21% |
为什么差这么多?因为 v1 里藏着两个看不见的 bug:
- 未来数据泄漏:止损用了当天最低价,等同于先看了答案再答题
- 执行差异:向量化回测的”理想成交”和 bar-by-bar 的”真实成交”对不上
- 成本缺失:佣金和滑点没扣干净,高换手策略虚高严重
第一版生成完立刻审计,不要等到觉得”差不多了”再审。审计后掉到 1.04 才是真实表现,没有审计的回测等于自欺欺人。
更重要的是养成一个反射:看到漂亮的回测结果,第一反应不是”我赚了”,是”哪里出了 bug”。Sharpe 1.74 在日频策略里已经是优秀级别的数字,能轻松跑出这种结果,大概率是回测引擎里偷偷开了”上帝视角”。养成这个反射,比多写 100 行代码都管用。
黄金法则
你负责”策略逻辑是否合理”,AI 负责”代码实现是否正确”。
两者不能互相替代——即使 AI 写的代码完美,策略逻辑错了照样亏钱。
每跑完一轮,你的审查清单就 6 条:
- 策略逻辑是否符合我的市场认知?
- 入场/出场规则是否清晰无歧义?
- 参数范围是否符合常识?
- 有无使用未来数据的风险?
- 成本假设是否接近真实?
- 样本外表现是否稳定?
全过 → 讨论实盘。有疑问 → 追加对话修正。逻辑错 → 回第 3 轮重来。
这套 SOP 的核心是分工
5 轮对话 + 22 分钟,跑出 Sharpe 1.04 的策略,听上去很酷。但这套 SOP 真正的价值不是”快”,是”分工”。
你把时间花在该花的地方——想清楚要做什么、好策略长什么样、不能踩什么坑——而不是在 pandas 文档里翻 rolling().apply() 的用法。AI 把它擅长的事做好——读规范、按图纸、自我修正、commit 历史——而不是替你想策略逻辑。
这套 SOP 的可复用性也不错。换标的:把 CLAUDE.md 里的 universe 列表改一下;换策略类型:把因子描述改一下;换市场:换数据源 SDK。骨架不动,5 轮对话的节奏不变。第一次跑要 30 分钟磨合,第二次跑可能 15 分钟就能搞定。
更深一层的价值是它给”AI Agent 协作”提供了一个具体可见的范式:宪法管边界、图纸管步骤、日报管状态、对话管对齐。这套范式不止用在量化,写代码、写文章、做调研、做 RPA,都能套——你只要想清楚”什么是宪法、什么是图纸、什么是日报”,剩下的就是把对话拆成 5 轮往里填。