AI炒股项目进化太快了:TaoToken 统一 Key 接入 AI-Trader 支持上证50 的 config.toml 骨架

发布时间:2026/9/29 2:23:09
AI炒股项目进化太快了:TaoToken 统一 Key 接入 AI-Trader 支持上证50 的 config.toml 骨架
1. AI-Trader 支持上证50 后模型调用配置成了新门槛AI-Trader 是香港大学团队开源的一套自主交易实验框架核心玩法是让 DeepSeek、Claude、GPT、Qwen 这类大模型各自带着一笔虚拟资金在真实市场数据里独立完成分析、决策、下单全程没有人工干预。它最近一次更新把 A 股市场从原来的通用池子细化到了上证50 成分股初始资金 10 万人民币交易规则按 T1 和一手 100 股来走中文提示词也做了适配。对想研究 AI 选股链路的人来说这个更新把「能不能跑通 A 股」的问题解决了一大半。但真正动手的人很快会撞上第二道墙模型调用。AI-Trader 的 agent 层依赖 OpenAI 兼容接口配置里要填OPENAI_API_BASE和OPENAI_API_KEY而多数人手里同时有 Claude、Qwen、DeepSeek 的 key每个模型一套地址、一套鉴权、一套限流写进config.toml和.env后互相打架。更麻烦的是 MCP 工具链启动时价格查询、交易执行、信息搜索这几个服务各自要读环境变量key 一多就容易串。这篇就聚焦这个环节用 TaoToken 的统一 Key 和 API 通道把 AI-Trader 的模型调用配置收敛成一份可复制的config.toml骨架再给出上证50 行情拉取、模型响应、报错回退三步验证动作。目标很直接让你一次把 AI 选股链路跑通而不是卡在环境变量上。2. TaoToken 前置统一 Key 与 API 通道怎么接TaoToken 在这里扮演的角色是模型调用的统一入口。你不需要为每个模型单独维护 base_url 和 key而是把 OpenAI 兼容格式的请求都指向同一个 API 地址由它按模型名路由。对 AI-Trader 这种「一个 config 里挂多个模型」的项目来说这能省掉大量重复配置。先拿 Key。打开 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 登录后创建一个 API Key复制保存。这个 Key 会同时用于对话模型和后续可能的 coding 场景。API 基础地址是https://taotoken.net/api注意这个地址不带任何查询参数。在 OpenAI 兼容的客户端里通常填到/v1这一层也就是https://taotoken.net/api/v1。AI-Trader 的.env里OPENAI_API_BASE就填这个值。模型名怎么填TaoToken 的模型列表可以在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 查到。AI-Trader 的 config 里basemodel字段直接写模型标识即可比如claude-3-7-sonnet-20250219、qwen3-max、deepseek-chat这类。如果你不确定某个模型是否可用可以先用模型对话页面发一条测试消息https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。注意TaoToken 是模型调用的统一通道不是交易通道。AI-Trader 的行情数据仍然走 Tushare交易执行仍然走它自己的 MCP 工具两者不要混在一起配。如果你后续要长期跑编码类 agent或者把 AI-Trader 的决策逻辑接到自己的 IDE 里调试可以看一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它和本篇的 config 骨架是互补的一个管运行时模型调用一个管开发时的编码辅助。3. 可复制配置config.toml 骨架与 MCP 接入片段AI-Trader 原项目用的是 JSON 配置但社区里不少人习惯 TOML因为注释友好、层级清晰。下面这份骨架把模型调用、上证50 股票池、MCP 服务端口、回退策略都收在一起你可以直接存成configs/astock_config.toml。# configs/astock_config.toml # AI-Trader 上证50 配置骨架模型调用统一走 TaoToken [agent] type BaseAgentAStock market cn stock_pool sse_50 initial_cash 100000.0 max_steps 30 max_retries 3 base_delay 1.0 [date_range] init_date 2025-10-01 end_date 2025-10-29 [model_provider] # 统一 API 通道所有模型共用这一组 base_url https://taotoken.net/api/v1 api_key_env TAOTOKEN_API_KEY timeout 60 max_retries 2 [[models]] name claude-3.7-sonnet basemodel claude-3-7-sonnet-20250219 signature claude-3.7-sonnet enabled true temperature 0.3 [[models]] name qwen3-max basemodel qwen3-max signature qwen3-max enabled true temperature 0.4 [[models]] name deepseek-chat basemodel deepseek-chat signature deepseek-chat enabled false temperature 0.5 [mcp_services] math_port 8000 search_port 8001 trade_port 8002 getprice_port 8003 [data_source] tushare_token_env TUSHARE_TOKEN jina_api_key_env JINA_API_KEY [log] log_path ./data/agent_data_astock level INFO [fallback] # 模型调用失败时的回退顺序 order [claude-3.7-sonnet, qwen3-max] on_all_fail skip_trade对应的.env文件收敛成下面这样注意OPENAI_API_BASE和OPENAI_API_KEY仍然保留因为 AI-Trader 的 langchain-openai 适配层读的是这两个变量# .env TAOTOKEN_API_KEY你的_taotoken_key OPENAI_API_BASEhttps://taotoken.net/api/v1 OPENAI_API_KEY${TAOTOKEN_API_KEY} TUSHARE_TOKEN你的_tushare_token JINA_API_KEY你的_jina_key RUNTIME_ENV_PATH./runtime_env.json AGENT_MAX_STEP30MCP 接入片段方面AI-Trader 的agent_tools/start_mcp_services.py会拉起四个服务。如果你要手动确认每个服务的模型调用都走 TaoToken可以在启动前检查环境变量是否被正确继承# agent_tools/start_mcp_services.py 片段 import os from dotenv import load_dotenv load_dotenv() # 确认统一通道已注入 assert os.getenv(OPENAI_API_BASE) https://taotoken.net/api/v1, \ OPENAI_API_BASE 未指向 TaoToken 统一通道 assert os.getenv(OPENAI_API_KEY), OPENAI_API_KEY 未设置 # 四个 MCP 服务端口 SERVICES { math: 8000, search: 8001, trade: 8002, getprice: 8003, }价格查询工具里A 股代码后缀是.SH或.SZ上证50 成分股基本以.SH结尾。工具内部会根据后缀自动选数据源你不需要额外改# agent_tools/tool_get_price_local.py 片段 async def get_price_local(symbol: str, date: str None) - dict: if symbol.endswith(.SH) or symbol.endswith(.SZ): market cn elif symbol in CRYPTO_SYMBOLS: market crypto else: market us price_data await get_price_from_database(symbol, date, market) return { symbol: symbol, market: market, price: price_data.get(close), open: price_data.get(open), high: price_data.get(high), low: price_data.get(low), volume: price_data.get(volume), date: date, }4. 三步验证上证50 行情、模型响应、报错回退配置写完不代表链路通了。下面三步按顺序做每步都有明确的成功标志。4.1 第一步上证50 行情拉取进入 A 股数据目录先拉指数成分股再拉日线。Tushare 的index_weight接口拿上证50 权重daily接口拿个股日线。cd data/A_stock python get_daily_price_tushare.py python merge_jsonl_tushare.pyget_daily_price_tushare.py里关键参数是index_code000016.SH这就是上证50 的指数代码。拉取时注意 Tushare 单次请求 6000 条记录的限制脚本里用calculate_batch_days做了分批def calculate_batch_days(num_stocks: int, max_records: int 6000) - int: return max(1, max_records // num_stocks)成功标志data/A_stock下生成 JSONL 文件打开能看到类似下面的结构Meta Data里有股票代码和名称Time Series (Daily)里按日期排列 OHLCV。{ Meta Data: { 2. Symbol: 600036.SH, 2.1. Name: 招商银行, 3. Last Refreshed: 2025-10-29, 5. Time Zone: Asia/Shanghai }, Time Series (Daily): { 2025-10-29: { 1. buy price: 35.20, 2. high: 35.80, 3. low: 34.90, 4. sell price: 35.60, 5. volume: 1234500 } } }如果这一步报tushare.exception或返回空 DataFrame先检查TUSHARE_TOKEN是否有效以及账号积分是否够调index_weight。积分不够的话上证50 成分股列表可以先用静态文件兜底。4.2 第二步模型响应验证行情有了接下来确认模型能通过 TaoToken 正常返回。不要直接跑完整交易先用一个最小脚本打一次请求# test_model_response.py import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( base_urlos.getenv(OPENAI_API_BASE), api_keyos.getenv(OPENAI_API_KEY), ) resp client.chat.completions.create( modelqwen3-max, messages[ {role: system, content: 你是 A 股交易助手只输出 JSON。}, {role: user, content: 上证50 里 600036.SH 当前持仓 100 股现金 96480 元是否加仓输出 {action, reason}。}, ], temperature0.3, ) print(resp.choices[0].message.content)成功标志终端打印出包含action和reason的 JSON 文本。如果返回 401检查TAOTOKEN_API_KEY是否复制完整如果返回 404 或模型不存在去文档页核对模型标识拼写。这一步过了再把config.toml里enabled true的模型逐个测一遍。多模型竞技是 AI-Trader 的核心玩法别只测一个就开跑。4.3 第三步报错回退验证真实运行时模型可能超时、限流、返回格式错误。回退策略要在配置里显式声明并且手动触发一次验证。在config.toml的[fallback]段里order定义了回退顺序on_all_fail skip_trade表示全部失败时跳过当日交易而不是崩溃。验证方法是把主模型的basemodel故意改成一个不存在的名字然后跑一次python main.py configs/astock_config.toml预期行为日志里出现主模型调用失败自动切到qwen3-max交易继续。如果直接抛异常退出说明回退逻辑没生效检查agent/base_agent_astock/base_agent_astock.py里trade方法的异常捕获是否覆盖了模型调用层。成功标志日志中能看到fallback to qwen3-max之类的记录且当日交易记录正常写入./data/agent_data_astock。5. 本篇常见错排查报错一OPENAI_API_BASE被覆盖成默认值。AI-Trader 某些脚本里会硬编码https://api.openai.com/v1如果你在.env里改了但没生效全局搜一下代码里有没有直接赋值。统一通道的地址必须以环境变量为准。报错二MCP 服务启动后模型调用不走 TaoToken。四个 MCP 服务是独立进程load_dotenv()要在每个服务入口都调用一次。如果只在主进程加载子进程读不到OPENAI_API_BASE。检查start_mcp_services.py是否用subprocess启动且传了envos.environ。报错三上证50 数据拉取返回空。最常见的是index_code写成了000016.SZ上证50 是000016.SH。另外start_date和end_date格式必须是YYYYMMDD不能带横线。报错四模型返回内容不是 JSON交易解析失败。在 system prompt 里明确要求「只输出 JSON不要 markdown 代码块」。如果模型仍然包了 json在解析前做一次字符串清洗去掉首尾的代码块标记。报错五T1 规则导致当日买入无法卖出。这是 A 股代理的正常行为不是 bug。BaseAgentAStock里会检查持仓日期当日买入的股票在positions里标记为不可卖。如果你在回测里看到「卖出失败」先确认日期是否跨了交易日。报错六多模型并发时 key 限流。TaoToken 统一通道下多个模型共享同一个 key 的配额。如果并发跑 3 个以上模型建议在[model_provider]里把max_retries调到 3base_delay调到 1.5给限流留出退避空间。6. 把链路跑通之后配置和验证都过了AI-Trader 的上证50 链路就算通了。接下来你可以做两件事一是把enabled打开多个模型观察同一交易日不同模型的决策差异这是这个项目最有意思的部分二是把交易记录导出来用tools/result_tools.py里的指标算一下累计收益、最大回撤、胜率看看模型在真实历史数据上的表现。如果你在接入过程中遇到模型调用层面的问题比如某个模型标识不可用、返回格式异常可以去模型对话页面直接发一条消息确认https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。需要重新生成或管理 Key 的话入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。完整的接口说明和模型列表在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后提醒一句AI-Trader 是实验框架回测和模拟盘跑通不等于实盘可用。先把链路跑顺再谈策略。