目录
- [一、AI 写的量化代码,行情接口全是编的](#一、AI 写的量化代码,行情接口全是编的 "#%E4%B8%80ai-%E5%86%99%E7%9A%84%E9%87%8F%E5%8C%96%E4%BB%A3%E7%A0%81%E8%A1%8C%E6%83%85%E6%8E%A5%E5%8F%A3%E5%85%A8%E6%98%AF%E7%BC%96%E7%9A%84")
- [二、MCP:给 Codex 装上真实的工具目录](#二、MCP:给 Codex 装上真实的工具目录 "#%E4%BA%8Cmcp%E7%BB%99-codex-%E8%A3%85%E4%B8%8A%E7%9C%9F%E5%AE%9E%E7%9A%84%E5%B7%A5%E5%85%B7%E7%9B%AE%E5%BD%95")
- 三、配置四步走:从零到跑通第一个查询
- 四、三个验证示例
- 五、踩坑实录
- [六、13 个 MCP 工具速查](#六、13 个 MCP 工具速查 "#%E5%85%AD13-%E4%B8%AA-mcp-%E5%B7%A5%E5%85%B7%E9%80%9F%E6%9F%A5")
- [七、进阶:让 AI 写一个双均线策略](#七、进阶:让 AI 写一个双均线策略 "#%E4%B8%83%E8%BF%9B%E9%98%B6%E8%AE%A9-ai-%E5%86%99%E4%B8%80%E4%B8%AA%E5%8F%8C%E5%9D%87%E7%BA%BF%E7%AD%96%E7%95%A5")
- [八、配置前 vs 配置后](#八、配置前 vs 配置后 "#%E5%85%AB%E9%85%8D%E7%BD%AE%E5%89%8D-vs-%E9%85%8D%E7%BD%AE%E5%90%8E")
一、AI 写的量化代码,行情接口全是编的
上周二下午 4 点,我在 Codex 里输入了这样一句话:
"写一个 A 股双均线策略,用贵州茅台 600519 的日线数据,5 日均线上穿 20 日均线买入,下穿卖出。"
Codex 秒回了 120 行 Python。逻辑非常漂亮:均线计算、交叉判断、仓位管理,甚至贴心地加了止损。
然后我点了 Run。
vbnet
ModuleNotFoundError: No module named 'stock_data_api'
翻到代码第三行:
python
from stock_data_api import get_kline_data
这个 stock_data_api 模块根本不存在。AI 编了一个。
我花了接下来的 40 分钟做一件事:手动替换所有行情调用。把 get_kline_data("600519", "daily") 替换成真实的 HTTP 请求,补上鉴权 Header,处理返回 JSON 的嵌套路径。
Codex 写量化策略最大的痛点:AI 逻辑能力够了,但它不知道真实的行情 API 长什么样。 默认工具集里只有文件读写、shell 执行这些基础能力,没有行情查询工具。所以它只能编一个函数名,期待你自己实现。
这个问题在 Codex 支持 MCP 之后有了一个确定的解法------不是让 AI 变得更聪明,而是给它装上一个真实的工具目录。
二、MCP:给 Codex 装上真实的工具目录
MCP 的全称是 Model Context Protocol,可以理解为 Codex 的"插件协议"。通过配置一个 MCP Server,你可以在 Codex 的工具列表里增加外部能力------比如行情查询、K 线拉取、估值计算。
不用 MCP 时,Codex 的工具箱大概长这样:
diff
- read_file
- write_file
- execute_command
- search_code
接入行情 MCP 后,工具箱变成:
diff
- read_file
- write_file
- execute_command
- search_code
+ get_ticker ← 查实时行情
+ get_kline ← 拉 K 线
+ get_kline_latest ← 最近一根 K 线
+ get_order_book ← 盘口深度
+ get_recent_trades ← 成交明细
+ get_market_metrics ← 估值指标
+ get_capital_flow ← 资金流向
+ get_available_symbols ← 品种列表
+ get_intraday ← 分时数据
+ get_kline_intervals ← 可用 K 线周期
+ get_stock_info ← 品种基本信息
+ get_trade_days ← 交易日历
+ get_trading_sessions ← 交易时段
这些工具不是 AI 编的,是 MCP Server 暴露的真实端点。AI 调用 get_ticker 时,背后走的是 https://api.tickdb.ai/v1/market/ticker。AI 不需要知道 URL、不需要知道鉴权方式------它只看到工具名和参数,MCP 中间层帮它完成实际的 HTTP 调用。
这就是核心区别:AI 从"编接口"变成了"调工具"。
三、配置四步走:从零到跑通第一个查询
以下步骤基于 codex-cli 0.131.0-alpha.9 实测。版本不同时字段名可能有差异,以 codex mcp add --help 输出为准。
第一步:确认 Codex CLI 已安装
bash
codex --version
# 输出版本号即表示已安装
第二步:添加 MCP Server
bash
codex mcp add tickdb --url https://mcp.tickdb.ai/
执行成功后,Codex 会在 ~/.codex/config.toml 中写入 MCP Server 条目。
确认配置文件中包含以下三项(不要直接 cat 整个文件,密钥会暴露):
bash
grep -E "\[mcp_servers.tickdb\]|url|http_headers" ~/.codex/config.toml
期望看到:
ini
[mcp_servers.tickdb]
url = "https://mcp.tickdb.ai/"
http_headers = { "X-TickDB-Key" = "***" }
第三步:配置 API Key
打开 ~/.codex/config.toml,确认 MCP 段格式如下:
toml
[mcp_servers.tickdb]
url = "https://mcp.tickdb.ai/"
http_headers = { "X-TickDB-Key" = "你的API_KEY" }
两个高频配置错误:
| 正确 | 错误 | 后果 |
|---|---|---|
文件路径:~/.codex/config.toml |
~/.codex/mcp.json(Claude Code 的路径) |
配了不生效 |
Header 字段名:X-TickDB-Key |
Authorization: Bearer |
鉴权失败,返回 1001 |
配置键名:http_headers |
headers(旧版或文档差异) |
不同版本字段名可能不同,以当前版本 --help 为准 |
关于
config.tomlvsmcp.json:Codex 的 MCP 配置存储在~/.codex/config.toml中,不是.codex/mcp.json。这是 Codex 与 Claude Code(使用.mcp.json)的关键差异。照 Claude Code 的教程配 Codex,会卡在第一步。
第四步:验证工具已加载
在 Codex 对话中输入:
请列出你当前可用的所有 MCP 工具
如果配置成功,Codex 会列出以 get_ 开头的 13 个工具。看到这个列表,说明 AI 已经"知道"这些工具的存在了。
四、三个验证示例
配置完成后,用三个最小化示例确认每个工具都能正常返回数据。
示例 1:查实时行情
在 Codex 中输入:
用 get_ticker 查询贵州茅台 600519.SH 和腾讯控股 700.HK 的实时行情
期望返回 :两个品种的 last_price、volume_24h、high_24h、low_24h、timestamp。
实测发现 :
get_ticker同时查询多个品种时可能触发 3001 限流。如果遇到限流,拆成单品种逐个查询,间隔 1 秒以上。这个坑在第五节细说。
示例 2:拉 K 线
在 Codex 中输入:
sql
用 get_kline 拉取腾讯控股 700.HK 的日线数据,最近 10 根,interval 用 1d
期望返回 :10 根 K 线的数组,每根含 time、open、high、low、close、volume。
字段提醒 :K 线用
close,ticker 用last_price,两个接口不可混用。
示例 3:估值对比
在 Codex 中输入:
用 get_market_metrics 查询 AAPL.US 和 600519.SH 的估值指标,对比 PE 和 PB
期望返回 :两个品种的 pe_ttm_ratio、pb_ratio 等字段。
字段提醒 :字段名是
pe_ttm_ratio不是pe_ttm,是pb_ratio不是pb。
五、踩坑实录
以下是我在配置和验证过程中实测遇到的问题。每个都能让新手卡住一段时间。
| 坑 | 现象 | 原因 | 正确处理 |
|---|---|---|---|
| 限流 3001 | get_ticker 查多个品种报 Rate limit |
TickDB 对 ticker 端点有频率限制 | 拆成单品种查询,间隔 ≥ 1 秒;或改用 WebSocket 订阅 |
| K 线字段错用 | 在 K 线返回里取 last_price 报 KeyError |
K 线用 close,ticker 用 last_price |
不同接口字段名不同,对照速查表使用 |
| 时间单位不一致 | recent_trades 的 timestamp 是秒,K 线的 time 是毫秒 |
不同接口返回的时间字段粒度不同 | 使用前确认单位,不要假设所有 timestamp 都是毫秒 |
| 配置文件路径错误 | 配了 mcp.json 不生效 |
Codex 用 config.toml 不是 mcp.json |
确认路径为 ~/.codex/config.toml |
| Header 键名写错 | 鉴权失败 1001 | 必须用 X-TickDB-Key,不是 Authorization: Bearer |
对照第三步配置示例 |
| 港股代码前导零 | 0700.HK 个别情况下可能查不到 |
标准格式为 700.HK,部分接口可能容错但不建议依赖 |
统一使用 700.HK 无前导零格式 |
六、13 个 MCP 工具速查
以下为 codex-cli 0.131.0-alpha.9 环境中实测可用的 13 个工具。工具名和参数以当前版本为准。
| 工具名 | 功能 | 关键参数 |
|---|---|---|
get_ticker |
实时行情快照 | symbols(逗号分隔) |
get_kline |
历史 K 线 | symbol, interval(1m/5m/15m/30m/1h/4h/1d/1w), limit |
get_kline_latest |
最近一根 K 线 | symbols |
get_intraday |
分时数据 | symbol |
get_order_book |
盘口深度 | symbol |
get_recent_trades |
成交明细 | symbol, limit |
get_market_metrics |
估值指标(PE/PB) | symbols |
get_capital_flow |
资金流向 | symbol |
get_available_symbols |
品种列表 | market(CN/HK/US/GLOBAL), type |
get_stock_info |
品种基本信息 | symbol |
get_trade_days |
交易日历 | market, start_date, end_date |
get_trading_sessions |
交易时段 | market |
get_kline_intervals |
可用 K 线周期 | 无 |
七、进阶:让 AI 写一个双均线策略
三个示例跑通后,可以回到最初的需求------让 Codex 写出能真正运行的双均线策略。
在 Codex 中输入:
diff
写一个 A 股双均线策略:
- 品种:600519.SH(贵州茅台)
- 日线数据,5 日均线上穿 20 日均线金叉买入,死叉卖出
- 用 get_kline 拉取最近 120 个交易日的日线
- 初始资金 10 万,每次满仓进出
- 输出最终收益率和最大回撤
- 注意:get_kline 返回的收盘价字段是 close 不是 last_price
- 注意:get_kline 的 time 是毫秒级,get_recent_trades 的 timestamp 是秒级,处理时区分单位
Codex 应该能做到:
- 调用
get_kline(symbol="600519.SH", interval="1d", limit=120)拉数据 - 用 pandas 计算 5 日和 20 日均线
- 判断金叉死叉,生成交易信号
- 输出收益率曲线和回撤
验证清单(逐项确认):
- 均线计算是否正确(
df['close'].rolling(5).mean()) - 字段名是否用了
close而非last_price - 时间戳单位是否处理正确
- 是否处理了空数据或限流重试
八、配置前 vs 配置后
配置 MCP 之前
| 问题 | 具体表现 |
|---|---|
| AI 虚构 API | 生成 from stock_data_api import get_kline_data 等不存在的模块 |
| 无真实行情 | 策略脚本用随机数模拟价格走势 |
| 重复劳动 | 每次让 AI 写策略,都要手动替换行情调用代码 |
| 无法验证 | 不确定 AI 写的交易逻辑在真实数据上是否成立 |
配置 MCP 之后
| 变化 | 效果 |
|---|---|
| AI 自动发现 13 个行情工具 | 不再编造函数名,直接调用 get_kline |
| 真实数据驱动 | 策略跑在贵州茅台的真实日线上 |
| 一次配置,跨会话共享 | 所有 Codex 会话共用同一 MCP 配置 |
| 跨市场覆盖 | 同一套工具查 A 股、港股、美股、加密 |
MCP 在这里提供的是一个工具目录------它让 Codex 知道"行情数据可以这样获取",并且这个获取方式是真实可执行的,不是文档里的示例 URL。接入后 AI 从"我能写策略但数据你自己搞定"变成了"我能写策略,数据也可以直接调"。
你在用 Codex 写量化代码时,AI 编过什么离谱的接口?配置 MCP 时卡在哪一步?评论区聊。
📡 行情数据由 TickDB.ai 提供
- MCP 端点:
https://mcp.tickdb.ai - 文档:
https://docs.tickdb.ai
排错清单
| 问题 | 检查项 |
|---|---|
| 配置不生效 | 确认路径为 ~/.codex/config.toml(非 mcp.json) |
| 鉴权失败 1001 | 确认 Header 名为 X-TickDB-Key(非 Authorization: Bearer) |
| 工具未加载 | 在 Codex 中执行"列出当前可用的所有 MCP 工具"确认 13 个可见 |
| 限流 3001 | 多品种查询拆成单次请求,间隔 ≥ 1 秒 |
| K 线字段报 KeyError | 用 close 而非 last_price |
| 时间戳对不上 | K 线 time 毫秒级,成交明细 timestamp 秒级,分别处理 |
修订对照表
| 问题 | 修改前 | 修改后 |
|---|---|---|
| API Key 暴露 | 让读者 cat config.toml |
改为 grep 脱敏命令 |
| 配置字段 | headers + type = "http" |
http_headers(以 Codex 0.131 实测为准) |
| 13 个工具名 | 含 get_depth/get_calc_index/search_symbols 等不存在工具 |
替换为实测工具名 |
| 踩坑表 | 3 个坑 | 新增"限流 3001""时间单位不一致"共 6 个坑 |
0700.HK 表述 |
"格式错误" | "建议无前导零,不依赖兼容行为" |
| 时间戳表述 | "所有时间字段均为毫秒 UTC" | "不同接口粒度不同,使用前确认" |
| 文末自检/验证提示 | 含营销 checklist + "贴给我"导流语 | 删除,改为排错清单 + 自主验证引导 |
| 域名露出 | 4 处 | 精简为 MCP 端点 + 文档各一次 |
文章已按 Codex 审核意见完成大修。是否 A) 继续下一篇 B) 进一步审查修正 C) 提取沸点文案?