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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 生成Model ID 按你选的模型填。如果你用的是 Claude Code 这类工具配置方式类似文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有说明。Python 环境这边akshare 负责拉 A 股日线行情tushare 拉财务数据需要 token海外数据可以用 yfinance。装依赖pip install akshare tushare pandas numpy pyarrow vectorbtakshare 的好处是免费、接口全A 股日线、指数成分、财务指标都能拿。缺点是部分接口偶尔抽风所以取数一定要落本地缓存别每次回测都重新拉。我习惯用 parquet 存读取快、体积小。目录结构建议这样project/ AGENTS.md data/ calendar.csv cache/ factors/ momentum.py research/ run_backtest.pydata/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 日收盘后生成T1 日开盘价成交禁止用 T 日收盘价成交 - 手续费双边万3卖出额外加千1印花税 - 滑点按当日振幅的 10% 计算 - 每个分组样本数不得少于 40 只不足则跳过该期 - 回测必须输出净值曲线、IC 序列、换手率、扣费后多空年化 ## 代码红线 - 禁止使用 .shift(-n) 等任何前视操作 - 每个新因子必须配一个未来函数检查用例 - 因子计算与决策逻辑分离factors/ 下只算因子不做买卖判断 - 所有涉及日期的逻辑必须引用 data/calendar.csv ## 合规 - 只输出研究结论不构成投资建议 - 禁止输出具体买卖点位、仓位建议、收益承诺这份配置里数据口径和回测口径是防回测作弊的关键。前复权保证价格序列连续公告日保证财报信息不提前泄露T1 开盘成交保证信号和成交不在同一时点。代码红线里的 .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(pathdata/calendar.csv): return pd.read_csv(path, parse_dates[trade_date]) def run(cache_pathdata/cache/close.parquet): close pd.read_parquet(cache_path) factor momentum_20d(close) # 信号 T 日生成T1 开盘成交此处按规范实现 signal factor.rank(axis1, pctTrue) 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_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 新生成的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 Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先验证模型效果的用模型对话https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。最后提醒一句AGENTS.md 是活的每踩一个坑就加一条。回测口径定得越死Codex 产出的代码越可信。漂亮曲线大概率是过拟合敏感度扫描和样本外测试不能省。所有数字标注出处拿不准标未核实人工抽查不能停。这套流程的价值不在于让 AI 替你决策而在于把重复的取数、算指标、跑回测标准化让你把精力放在逻辑判断上。