news 2026/10/22 10:53:16

Codex 股票分析与研究:用 AGENTS.md 规范 akshare 量化回测流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Codex 股票分析与研究:用 AGENTS.md 规范 akshare 量化回测流程

1. 为什么用 Codex 做股票研究总在“回测作弊”上翻车

先说清楚 Codex 在这件事里的定位:它是研究助理加代码工人,负责取数、算指标、跑回测、写报告、盯监控。买卖决策、仓位、止损这些永远是你自己拍板。AI 荐股本身不合规也不可靠,代客荐股、承诺收益在没有牌照的情况下就是违法。这条红线先钉死,后面所有流程都围绕“只做研究、不做决策”展开。

我见过太多人用 Codex 写量化策略,第一版回测曲线漂亮得不像话,年化 80%、最大回撤 5%,结果一上模拟盘就原形毕露。问题几乎都出在同一件事上:回测口径没定死,代码里悄悄用了未来信息。比如财报数据用了 report_date 而不是公告日 announce_date,等于你提前知道了还没公布的业绩;比如信号在 T 日收盘生成,成交价却用了 T 日收盘价,等于用同一根 K 线既看信号又成交;再比如交易日历直接用 pandas 的 bdate_range,把停牌日、节假日全算进去了。

这些坑单靠人眼 review 代码很难全堵住,因为 Codex 每次生成的实现细节都不一样。解决办法不是每次重新叮嘱,而是把口径写进一个 Codex 每次都会读的文件——AGENTS.md。这个文件相当于给 Codex 立的“项目宪法”,它定义了数据怎么取、指标怎么算、回测怎么成交、代码有哪些红线。每踩一个坑就往里加一条,时间长了这套体系就是你量化研究的根基。

这篇要讲的就是怎么用 AGENTS.md 把 akshare 拉行情、算因子、跑回测这条链路规范住,让 Codex 产出的代码可复现、可核对、不掺未来函数。适合已经会用 Python 做数据分析、想用 Codex 提效但被回测结果反复打脸的人。全文不构成任何投资建议,只讲工程流程。

2. 前置准备:TaoToken 接入 Codex 与 akshare 环境搭建

要让 Codex 稳定读 AGENTS.md 并按规范干活,得先把它接到一个可靠的模型服务上。我用的是 TaoToken 的 Coding Plan,它兼容 Anthropic 的接口协议,Codex 这类工具配置起来比较顺。官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数。

接入需要三件套:Base URL、API Key、Model ID。Base URL 填 https://taotoken.net/api ,API Key 去控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 生成,Model ID 按你选的模型填。如果你用的是 Claude Code 这类工具,配置方式类似,文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 有说明。

Python 环境这边,akshare 负责拉 A 股日线行情,tushare 拉财务数据(需要 token),海外数据可以用 yfinance。装依赖:

pip install akshare tushare pandas numpy pyarrow vectorbt

akshare 的好处是免费、接口全,A 股日线、指数成分、财务指标都能拿。缺点是部分接口偶尔抽风,所以取数一定要落本地缓存,别每次回测都重新拉。我习惯用 parquet 存,读取快、体积小。目录结构建议这样:

project/ AGENTS.md data/ calendar.csv cache/ factors/ momentum.py research/ run_backtest.py

data/calendar.csv 是交易日历,从 akshare 的 tool_trade_date_hist_sina 拉一次存下来,后面所有日期判断都以它为准,禁用 pandas 的 bdate_range。这一步看着小,但能挡掉一大批“把非交易日算进持仓天数”的隐性错误。

环境搭好后,先跑一个最小取数验证,确认 akshare 能正常返回数据,再让 Codex 按 AGENTS.md 生成正式代码。顺序别反,否则报错时你分不清是环境问题还是代码问题。

3. 可复制配置:AGENTS.md 规范 akshare 取数与回测口径

AGENTS.md 是整个流程的核心,Codex 每次开工前都会读它。下面这份可以直接复制,路径放在项目根目录,和 data/、factors/ 同级。内容分四块:数据口径、回测口径、代码红线、合规声明。

# AGENTS.md — 股票量化研究项目规范 ## 数据口径 - A股价格一律使用前复权(qfq),禁止混用后复权(hfq)或不复权 - 交易日历以 data/calendar.csv 为准,禁用 pandas bdate_range - 财报数据使用公告日 announce_date,禁止使用报告期 report_date - 所有行情数据落 parquet 缓存到 data/cache/,禁止每次回测重新拉取 - akshare 接口调用失败时重试 3 次,仍失败则报错退出,禁止静默跳过 ## 回测口径 - 信号在 T 日收盘后生成,T+1 日开盘价成交,禁止用 T 日收盘价成交 - 手续费双边万3,卖出额外加千1印花税 - 滑点按当日振幅的 10% 计算 - 每个分组样本数不得少于 40 只,不足则跳过该期 - 回测必须输出净值曲线、IC 序列、换手率、扣费后多空年化 ## 代码红线 - 禁止使用 .shift(-n) 等任何前视操作 - 每个新因子必须配一个未来函数检查用例 - 因子计算与决策逻辑分离,factors/ 下只算因子不做买卖判断 - 所有涉及日期的逻辑必须引用 data/calendar.csv ## 合规 - 只输出研究结论,不构成投资建议 - 禁止输出具体买卖点位、仓位建议、收益承诺

这份配置里,数据口径和回测口径是防回测作弊的关键。前复权保证价格序列连续,公告日保证财报信息不提前泄露,T+1 开盘成交保证信号和成交不在同一时点。代码红线里的 .shift(-n) 是未来函数最常见的来源,一个负向 shift 就能让因子“看到”未来价格。

因子文件按规范只算因子,比如动量因子:

# factors/momentum.py import pandas as pd def momentum_20d(close: pd.DataFrame) -> pd.DataFrame: """20日收益率因子,只计算不决策""" return close.pct_change(20)

回测脚本引用因子和缓存数据,按 AGENTS.md 的口径成交:

# research/run_backtest.py import pandas as pd from factors.momentum import momentum_20d def load_calendar(path="data/calendar.csv"): return pd.read_csv(path, parse_dates=["trade_date"]) def run(cache_path="data/cache/close.parquet"): close = pd.read_parquet(cache_path) factor = momentum_20d(close) # 信号 T 日生成,T+1 开盘成交,此处按规范实现 signal = factor.rank(axis=1, pct=True) > 0.9 return signal

配置写好后,Codex 生成代码时会自动对齐这些口径。你不需要每次重复叮嘱,只要在提问时让它“读 AGENTS.md”即可。这一步做完,回测结果的可信度会明显上一个台阶。

4. 验证请求:跑一次完整回测并核对结果

配置就位后,用三段式提问让 Codex 生成完整回测。提问模板:

【背景与口径】读取 AGENTS.md。检验假设:中证500成分股中,过去20日收益率排名前10%的股票,未来5日是否有超额收益。 【交付物】三个文件:data/loader.py 取数落缓存 / factors/momentum.py 只算因子 / research/run_backtest.py 用 vectorbt 跑十分组回测,输出净值曲线和 IC。 【验收】自查:a) 因子是否用到 T 日后信息 b) 每组样本是否稳定 40 只以上 c) 换手率多少,扣手续费后多空年化还剩多少。

Codex 生成后,先跑取数脚本验证 akshare 接口:

python data/loader.py

正常会看到类似输出,确认数据落到了 data/cache/:

拉取中证500成分股... 500 只 拉取日线行情 2020-01-01 至 2024-12-31 缓存写入 data/cache/close.parquet,共 500 列

然后跑回测:

python research/run_backtest.py

输出应该包含净值曲线数据、IC 序列、换手率和扣费后收益。核对时重点看三个数:IC 均值是否显著大于 0、换手率是否高得离谱、扣费后多空年化相比扣费前缩水多少。如果扣费前年化 30%、扣费后只剩 5%,说明策略换手太高,实盘基本没法用。

敏感度扫描是防过拟合的必修课。让 Codex 测几组参数:

权重组合测 50/25/25、30/30/40、等权;持股数测前10/20/30,每组真实回测,输出年化、回撤、索提诺对比表。不要帮我挑“最好”参数,我要看结论对参数敏不敏感。

如果参数一换结果天翻地覆,说明是拟合出来的,不能用。稳定的策略应该在合理参数范围内表现接近。这一步做完,你手里才有一个能拿去做模拟盘的候选策略。模拟盘跑 1 到 3 个月再考虑实盘,实盘代码还要让 Codex 做安全审计,检查重复下单、风控缺失、网络异常处理。

5. 常见报错排查:401、local proxy failed 与 reading choices

接入和回测过程中有几类报错特别常见,逐个说清楚。

401 未授权,通常是 API Key 没配对或过期。检查三件套:Base URL 是不是 https://taotoken.net/api ,API Key 是不是从控制台 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 新生成的,Model ID 有没有填错。三者任一不对都会 401。如果用的是 Claude Code,配置里 Base URL 和 Key 要对应同一套。

local proxy failed,这个报错一般出现在本地网络环境有额外转发设置时。先确认你的请求地址是直连 https://taotoken.net/api ,没有经过其他中间层。如果工具配置里填了额外的代理地址,去掉再试。这个报错和账号权限无关,纯粹是请求路径问题。

reading choices 报错,多出现在模型返回格式和工具预期不一致时。常见原因是 Model ID 填了一个不支持当前接口协议的模型。换一个兼容的 Model ID 重试,或者检查请求体里 stream 参数是否和工具预期匹配。Codex 这类工具对返回结构比较敏感,Model ID 选错就会在读 choices 字段时崩。

OAuth 相关报错,出现在用账号授权登录而非 API Key 的场景。如果你走的是 API Key 方式,不该触发 OAuth 流程。检查配置里是不是混用了两种认证方式,统一成 API Key 即可。

akshare 取数报错,常见的是接口超时或返回空。按 AGENTS.md 的规范重试 3 次,仍失败就报错退出,别静默跳过,否则回测样本会悄悄变少。另外注意 akshare 部分接口有频率限制,批量拉取时加个 sleep。

未来函数自查报错,如果你按规范写了检查用例,跑出来发现因子用了 T 日后信息,先看是不是用了 .shift(-n),再看财报数据是不是误用了 report_date。这两个是最高频的来源。

排查顺序建议:先确认三件套配置,再确认网络路径,最后看代码逻辑。大部分报错在前两步就能定位。

6. 把研究流程日常化:从周检到策略体检

流程跑通后,可以把它日常化。持仓周检对照监控清单输出逻辑变强还是变弱,附上证据;财报季扫雷把新公告按重要度排序;估值跟踪看 PE、PB 分位数标出低估区间;策略体检跑未来函数用例,全过才更新信号。这些都可以挂定时任务,让 Codex 按 AGENTS.md 的口径自动产出。

需要长期跑编码和 Agent 任务的,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。想先验证模型效果的,用模型对话:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,API Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。

最后提醒一句:AGENTS.md 是活的,每踩一个坑就加一条。回测口径定得越死,Codex 产出的代码越可信。漂亮曲线大概率是过拟合,敏感度扫描和样本外测试不能省。所有数字标注出处,拿不准标未核实,人工抽查不能停。这套流程的价值不在于让 AI 替你决策,而在于把重复的取数、算指标、跑回测标准化,让你把精力放在逻辑判断上。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 13:36:36

ADO封装库实战:从Connection到Recordset的核心用法与避坑指南

简介:面向商业开发场景的 ADO 源代码示例包 Ado_Aok_demo.zip,聚焦微软 ActiveX Data Objects 在 C 工程中的实际应用,适合需要在财务、库存、客户关系管理等业务系统中完成数据库连接的开发者参考学习。压缩包共收录 26 个文件,以…

作者头像 李华
网站建设 2026/10/15 18:52:18

Flask+LayUI+MySQL全栈模板实战:从跑通到避坑的完整指南

简介:这是一套基于 Python、Flask、LayUI 与 MySQL 搭建的网站模板,面向具备一定 Python 基础、希望快速构建后台管理或中小型 Web 项目的开发者,尤其适合课程设计、毕业设计与练手项目。资源包共 233 个文件,约 1.29MB&#xff0…

作者头像 李华
网站建设 2026/10/17 13:33:50

pstack-claude:用AI实时解析Linux进程调用栈的调试范式

1. 项目概述:pstack-claude 是什么,它解决的是哪类真实开发痛点?pstack-claude 这个名字乍看像一个工具组合词,但拆开来看,“pstack”是 Linux 系统中一个真实存在的诊断命令,用于打印指定进程的调用栈&…

作者头像 李华
网站建设 2026/10/16 12:31:56

Nexus 3.30 Windows免安装包部署指南:从解压到Maven私服搭建与避坑

简介:Nexus 3.30.0-01 是 Sonatype 官方推出的 Maven 仓库管理器 Windows 64 位安装包,面向 Java 开发者、DevOps 工程师及需要搭建企业级私有仓库的团队,用于代理中央仓库、聚合多类型存储库并统一管理组件发布。压缩包为 zip 格式&#xff…

作者头像 李华
网站建设 2026/10/13 8:42:03

Claude Code 实战指南:终端编程搭子的安装、配置与避坑

简介:这份资源是面向开发者与运维人员的 Claude Code CLI 使用手册源码包,适合刚接触该工具的新手快速入门,也适合有经验的用户深入掌握高级用法。手册系统梳理了安装启动、文件与代码操作、终端命令执行等基础流程,并重点讲解 Sk…

作者头像 李华