@tom_doerr: 使用Claude生成并严格验证算法交易策略 https://github.com/zostaff/ai-quant-rese…

X AI KOLs Timeline 工具

摘要

ai-quant-lab是一个开源的Python框架,它利用Claude生成算法交易策略,并通过统计测试严格验证以避免过拟合。

使用Claude生成并严格验证算法交易策略 https://t.co/40sYnVGPwi https://t.co/AaPpgQwpXS
查看原文
查看缓存全文

缓存时间: 2026/06/02 19:37

使用Claude生成并严格验证算法交易策略 https://t.co/40sYnVGPwi https://t.co/AaPpgQwpXS — # zostaff/ai-quant-researcher 来源:https://github.com/zostaff/ai-quant-researcher # ai-quant-lab Python (https://www.python.org/downloads/) 许可证 测试 Claude (https://docs.anthropic.com) > AI驱动的量化研究引擎。Claude生成策略;系统验证并淘汰不良策略。 — ## 快速开始 bash git clone https://github.com/yourname/ai-quant-lab cd ai-quant-lab python3 -m venv .venv && source .venv/bin/activate pip install -e ".[dev]" cp .env.example .env # 填写 ANTHROPIC_API_KEY(示例1-5可选) python examples/05_deflated_sharpe_demo.py # 查看多重检验杀伤效果 python -m ai_quant_lab.run --iterations 10 --target 2 # 完整研究循环 就是这样。示例1-5无需API密钥,使用合成数据运行。示例6-8需要密钥,并运行Claude驱动的循环。 — ## 架构 代理循环 整个系统由六个模块和一个CLI组成。参见 docs/ARCHITECTURE.md。 — ## 核心循环 python from ai_quant_lab.agents.memory import ResearchMemory from ai_quant_lab.backtest import BacktestConfig from ai_quant_lab.orchestrator.loop import LoopConfig, run_research_loop with ResearchMemory("./memory.db") as memory: artifacts, survivors = run_research_loop( price_data, LoopConfig( market_description="Daily bars on a single liquid US equity, 10 years.", iterations=50, target_survivors=3, backtest_config=BacktestConfig(cost_bps=8.0), ), memory=memory, ) 这就是完整的用户端API。所有可调参数通过环境变量或LoopConfig设置。完整实现位于 ai_quant_lab/orchestrator/loop.py —— 不到200行。 — ## 为何存在 大多数LLM交易代理框架专注于演示:一个端到端运行,产生一个看似合理的回测。他们跳过了不那么光鲜的部分:知道回测是否有意义。对于大多数策略,诚实的答案是“不,它没有意义”。当让Claude提出、编写和回测一千个变种时,选择最佳的一个正是经典的多重检验陷阱的配方。报告的夏普比率毫无意义。该策略在生产中不会有效。这就是ai-quant-lab所围绕解决的问题。解决方法是将统计严谨性作为硬性门控:每个被接受的策略都通过对抗性评判、以诚实试验次数为参数的通缩夏普检验,以及与现有幸存者集合的相关性检查。没有覆盖选项。生成是廉价的;验证是昂贵的;架构将昂贵的部分放在它应该在的地方。 — ## 不同之处 | 特性 | ai-quant-lab | TradingAgents | AgentQuant | QuantEvolve | |————————————|———————–|—————|————|———––| | 通缩夏普门控 | ✅ 硬门控,经验试验方差 | ❌ | ❌ | ❌ | | 清洗交叉验证 | ✅ 组合式 | ❌ | ❌ | ❌ | | 泄漏检测器 | ✅ 相关性 + 结构性(截断) | ❌ | ❌ | ❌ | | 滚动前进 | ✅ 带清洗 | ❌ | ❌ | ✅ 基础 | | 截面组合引擎 | ✅ 多空、美元中性 | ❌ | ❌ | ❌ | | 截面特征 | ✅ 排名、z-score、因子/行业中性化 | ❌ | ❌ | ❌ | | 元标签 | ✅ 逻辑分类器,操作/跳过过滤器 | ❌ | ❌ | ❌ | | 因子归因 | ✅ PCA + Fama-French OLS | ❌ | ❌ | ❌ | | PCA集中度门控 | ✅ 捕获隐蔽重复 | ❌ | ❌ | ❌ | | 真实执行 | ✅ 滑点、部分成交、参与率上限 | ❌ | ❌ | ❌ | | TCA框架 | ✅ 从成交校准成本 | ❌ | ❌ | ❌ | | 盘内感知K线引擎 | ✅ BarSchedule自动年化 | ❌ | ❌ | ❌ | | OHLCV特征 | ✅ Parkinson、Garman-Klass、VWAP偏差 | ❌ | ❌ | ❌ | | 对抗性评判 | ✅ 每个市场的模板(股票/加密/期货/期权/外汇) | ❌ | ✅ Reflect | ❌ | | 记忆/试验计数 | ✅ SQLite,持久化收益 | ❌ | ✅ SQLite | ✅ 特征映射 | | Claude原生 | ✅ Anthropic SDK + 提示缓存 | 通用 | Gemini | Gemini | | 生产终止开关 | ✅ 回撤/亏损/夏普崩溃 | ❌ | ❌ | ❌ | | 模拟交易诊断 | ✅ | ❌ | ❌ | ❌ | | 代码行数 | ~5000 | ~5000+ | ~3000+ | ~2000+ | | 依赖项 | 5 | 15+ | 10+ | 10+ | | 无需API密钥即可运行 | ✅ (示例1-5,7-9) | ❌ | ❌ | ❌ | | 持续集成 | ✅ (Python 3.11+3.12, ruff) | ❌ | ❌ | ❌ | — ## 量化研究的三个时代 三个时代 量化研究经历了三大转变。 古典时代 (1980-2005) 依赖于人类直觉和缓慢的手写回测;一个研究员每周可能测试大约十个策略。 因子/ML时代 (2000-2020) 通过库、云和计算成本下降将其工业化;吞吐量上升,但随着明显因子被套利,每个策略的边际收益缩小。 AI辅助时代 将吞吐量方程再提升两个数量级。一个拥有Anthropic密钥的人可以让Claude每周提出、编写和回测一千个策略。这意味着约束条件不再是想法。而是验证门控。 — ## 时间压缩 时间压缩 经典研究循环的瓶颈是编码。一个有效的回测需要一周;对规格进行迭代需要另一周。现在两者都缩减到几分钟。瓶颈转移到了唯一需要人类诚实的步骤:知道结果是否有意义。 — ## 多重检验的代价 多重检验 在无边缘的随机数据上运行一千个随机策略。期望的最大年化夏普比率大约为1.5。这就是一个“好”策略的夏普比率。这就是为什么“我们测试了一千个东西,最好的一个夏普比率为1.4”的天真报告是噪声报告。通缩夏普比率惩罚了这一点。参见 examples/05_deflated_sharpe_demo.py 的现场演示:从GBM的1000个随机策略中挑选最佳,通过 deflated_sharpe(returns, n_trials=1000) 运行,看p值变为0.62。该策略未通过门控。它不应该通过。 — ## 泄漏隐藏在哪里 泄漏示例 最常见的泄漏形式并不奇特: 1. 居中的滚动窗口。 series.rolling(21, center=True).mean() 在时间t的值中包含了未来十个K线。任何基于此构建的特征都会窥探未来。 2. 忘记移位。 momentum(price, 21) 没有 .shift(1) 会使用今天的收盘价生成今天的信号。该策略实际上无法在今天收盘时交易,只能等到明天开盘。 3. 将前瞻性标签用作特征。 三柱标签本身就是前瞻性的——这是它们作为目标的工作。将它们用作特征是最干净的泄漏。 泄漏检测器(features/leakage_detector.py)通过比较每个特征与目标的未来和过去相关性来捕获所有三种形态。参见 examples/03_leakage_demo.py。 — ## 滚动前进,正确的方式 滚动前进 打乱的k折交叉验证对于独立同分布数据是好的。时间序列不是独立同分布的。运行滚动前进(validation/walk_forward.py)并在标签前瞻超过一个K线时设置一个purge间隔。只有样本外曲线才重要。 python out = walk_forward_evaluate( price_data, strategy, train_size=504, test_size=126, purge=5, mode="rolling", ) print(out["metrics"]["sharpe_ratio"]) 为了在重叠分割上进行稳健性检查,使用 combinatorial_purged_cv —— 每个数据点出现在多个测试集中,这给你一个样本外夏普比率的分布而不是单个点。 — ## 三个门控 一个策略必须通过所有三个: 1. 评判。 回测之前的对抗性LLM审查。捕获明显有问题的想法。一次LLM调用。 2. 通缩夏普。 p值低于 settings.dsr_pvalue_max(默认5%)。参数由来自 ResearchMemory 的诚实 n_trials 设置。无覆盖。 3. 相关性。 与已接受策略的最大|相关性|低于 settings.max_correlation(默认0.6)。保持幸存者集合多样化。 实现位于 orchestrator/gates.py。完整的统计文档见 docs/VALIDATION.md。 — ## 文章中的章节 为什么生成廉价而验证昂贵 这种不对称性正是关键所在。Claude一天可以提出一千个策略,成本约10美元。每个策略需要数百根K线数据和数秒计算来验证。吞吐量方程说:在验证上花费周期,而不是生成。具体来说,ai-quant-lab的结构使得廉价步骤(LLM调用)门控昂贵步骤(完整验证)。评判是一次廉价调用。沙盒很快。通缩夏普检验是一个封闭形式的公式。昂贵的部分——跨多个折叠的清洗交叉验证——只在已经通过更便宜检查的策略上运行。 诚实的试验次数问题 每次参数扫描都算。每个变种都算。每个“让我再多试一次”都算。通缩夏普门控的诚实性仅取决于输入它的试验计数器。 ResearchMemory 的存在是为了使这个计数器防篡改。每个曾经提出的假设——接受的、拒绝的、被评判杀死的——都在SQLite中得到一行。门控读取 memory.n_trials(),并且没有API可以将其清零。 为什么提示缓存重要 HypothesisAgent、CriticAgent和CodeAgent的系统提示在循环的每次迭代中是不变的。用 cache_control: ephemeral 标记它们意味着第一次调用之后的所有调用都命中5分钟缓存。在50次迭代的循环中,这大约相当于10倍的成本降低,而不改变任何行为。参见 agents/base.py。 沙盒:捕获事故,而非对手 沙盒通过AST遍历生成的代码,并拒绝任何超出 numpy、pandas、math 和 ai_quant_lab.features.library 的内容。运行时命名空间有一个内置函数白名单——没有 open、没有 __import__、没有 eval。一个SIGALRM强制一个挂钟超时。这并非安全边界;在你的机器上运行的LLM可以编写你的shell能运行的任何代码。沙盒阻止Claude因为幻觉而编写一个意外 import os; os.system("rm -rf ~") 的策略。它不会阻止一个决心坚定的对手。 实时诊断和终止开关 一旦策略通过门控,它会获得一个模拟交易槽。 LiveDiagnostic 将实时收益的滚动窗口与回测分布进行比较。 KillSwitch 在硬性规则(回撤、每日亏损、滚动夏普崩溃)上触发,并保持触发状态直到手动重置。没有“策略即将恢复”的覆盖选项。这就是爆仓发生的方式。 python from ai_quant_lab.production import KillSwitch, LiveDiagnostic from ai_quant_lab.production.kill_switch import drawdown_trigger, sharpe_collapse_trigger diag = LiveDiagnostic(backtest_returns=accepted.returns, window_days=60) kill = KillSwitch(triggers=[drawdown_trigger(0.10), sharpe_collapse_trigger(-0.5, 60)]) — ## 示例 | 文件 | 展示内容 | 需要API密钥? | |——|—————|––––––––| | 01_backtest_basics.py | 在合成GBM上的向量化回测,关键指标。 | 否 | | 02_feature_pipeline.py | 通过FeaturePipeline构建防泄漏特征。 | 否 | | 03_leakage_demo.py | 对比:前向引用、居中滚动、干净版本。 | 否 | | 04_walk_forward.py | 动量策略的滚动前进及诊断。 | 否 | | 05_deflated_sharpe_demo.py | 1000个随机策略,DSR杀死幸运的最佳。 | 否 | | 06_full_research_loop.py | 端到端循环:Claude提出→验证→接受/拒绝。 | 是 | | 07_cross_sectional_momentum.py | 三轮截面动量,每一步带DSR。 | 否 | | 08_paper_trading_sim.py | 模拟的模拟交易,带每日诊断和终止开关。 | 否 | | 09_cross_sectional_portfolio.py | 多空篮子 + PCA门控捕获成对相关性遗漏的隐蔽重复。 | 否 | — ## AI仍然失败的地方 1. 幸存者偏差。 Claude在你提供的股票池上提出策略。如果你的股票池是“今天的标普500”,每个策略都偏向于幸存者。在数据层修复,而不是代码层。 2. 成本冲击。 现实摩擦杀死80%的纸上边缘。默认 cost_bps=8 是慷慨的基线;小盘股和流动性差的市场需要更多。根据你的交易所调整。 3. 体制转换。 滚动前进在数据中存在的体制内是诚实的。如果2020年不在你的样本中,你对策略如何处理2020年没有任何说法。 4. 试验计数器。 它只计数 ResearchMemory 中的内容。你在笔记本中测试过但没有保存的策略也算——但没有人记录这些。对你自己的脚手架保持偏执,而不仅仅是对Claude的。 5. 实现缺口。 回测假设你可以以收盘价交易你的目标头寸。现实有订单簿、队列、成交概率、部分成交。诊断层捕获实时漂移,但它不能替代实际执行场所的集成。这不在当前范围内。 — ## 缓慢构建。严格验证。小额交易。 如果门控杀死了你最喜欢的策略,那是策略的问题,不是门控的问题。添加更多数据。诚实地计数你的试验。或者接受边缘可能不存在。 — ## 文档 - docs/ARCHITECTURE.md — 系统设计。 - docs/AGENTS.md — 代理提示和行为。 - docs/VALIDATION.md — 统计方法。 - docs/CONTRIBUTING.md — 如何扩展系统。 ## 许可证 MIT。参见 LICENSE。非投资建议。交易可能导致亏损。

相似文章

如果你曾好奇在AI辅助下严谨的数据分析和社会科学研究会是什么样子,我刚刚为我的开源Claude Code研究员工具包推出了一个漂亮的网站:数据分析增强框架(Data Analyst Augmentation Framework)!它既是关于智能体编排的互动讲解器,也是一款免费工具。

Reddit r/artificial

数据分析增强框架(DAAF)是一个免费、开源的工具包,它将Claude Code转变为严谨的定量研究引擎,确保在人类监督下实现可审计和可重复的分析。