资讯动态

Claude Code 写量化:@文件 引用 ds_unified.py 与孤立持仓持久化实战

发布时间:2026/10/25 10:31:05 来源:尧图企业网站定制
1. 先搞清楚问题手动平仓后为什么还报孤立持仓如果你正在用 Claude Code 写量化脚本尤其是那种带套利对、带状态持久化的策略你大概率会遇到一个很别扭的现象交易所里明明已经手动全平了脚本重启后日志还是刷出「检测到孤立持仓」。这不是交易所的问题也不是你手速不够快而是脚本的状态文件在作怪。孤立持仓orphan position本身是个合理概念套利对一般要两条腿同时开、同时平如果程序崩溃、网络抖动、一边成交一边失败就会剩下一条单腿仓位这条腿不受套利逻辑保护必须单独处理。问题出在「持久化」这一步——很多脚本把孤立持仓也写进了bot_state.json下次启动时无脑state.get(orphan_positions, {})恢复回来完全不问交易所现在到底还有没有这个仓位。于是你手动平仓的事实被本地缓存覆盖了脚本活在自己的记忆里。这篇就围绕ds_unified.py这个具体文件讲清楚三件事怎么用 Claude Code 的文件能力把 3000 多行的脚本喂给模型做审查、孤立持仓的持久化该怎么改才不坑自己、以及重启后怎么验证状态真的对齐了。适合已经在写量化脚本、被状态管理折腾过的朋友也适合刚接触 Claude Code 想看看文件到底能干嘛的人。核心检索词就三个Claude Code 的 文件 引用、ds_unified.py 状态持久化、孤立持仓识别与恢复。我先把结论摆前面孤立持仓是临时状态不该持久化启动时必须以交易所实际持仓为准做一次校验文件引用要带行号范围别整文件硬塞。下面按步骤拆。2. 前置准备TaoToken 接入与 Claude Code 环境在动手改ds_unified.py之前得先把 Claude Code 跑起来并且让它能稳定读到你的项目文件。这里我用的是 TaoToken 的 Coding Plan 通道原因是长上下文审查 3000 行脚本时按量计费容易心跳包月套餐更适合这种反复文件来回问的场景。官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 两个地址别混。第一步拿 Key。进控制台创建 API Key页面在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建后立刻复制只显示一次。这个 Key 后面要同时喂给 Claude Code 和你的量化脚本环境变量别写死在代码里。第二步配置 Claude Code 的接入。Claude Code 走的是 Anthropic 兼容协议需要设置ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN两个环境变量。Base URL 指向 TaoToken 的 API 地址注意不要带 UTM 参数那是给网页用的。配置片段如下直接贴进你的 shell 配置文件~/.zshrc或~/.bashrcexport ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENsk-你的TaoToken密钥保存后source ~/.zshrc生效。如果你用的是 Claude Code 的 settings 文件方式也可以在项目根目录建.claude/settings.json内容长这样{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥 } }这里有个坑要提前说ANTHROPIC_BASE_URL末尾不要加/v1Claude Code 自己会拼路径加了会变成/v1/v1/messages直接 404。我第一次配的时候就栽在这日志里报local proxy failed排查了半天以为是网络问题。第三步确认模型 ID。Coding Plan 通道常用的模型 ID 是claude-sonnet-4-5这类具体以你套餐页面显示的为准。三件套凑齐Base URL、Key、Model ID缺一个都跑不通。验证方式很简单在项目目录下起一个会话claude进去后随便问一句「当前目录有哪些 py 文件」能正常回你就说明通道通了。如果报 401先检查 Key 有没有多余空格如果报reading choices之类的解析错误多半是 Base URL 拼错或者模型 ID 不存在。环境通了之后把ds_unified.py放到项目根目录A_log/bot_state.json也确认存在如果之前跑过。接下来才是正题用文件让 Claude Code 读脚本。3. 可复制配置文件 引用写法与持久化改造片段3.1 文件 的正确引用姿势Claude Code 的语法支持直接引用文件输入后会弹出文件补全。但 3045 行的脚本整文件塞进去token 消耗大不说模型注意力也容易散。我的做法是分两次引用先整文件扫一遍结构再针对具体方法带行号精读。整文件引用就一行ds_unified.py 请先梳理这个文件里所有涉及状态持久化的方法列出方法名和行号范围不要改代码。模型会返回类似_save_state在 434 行、_load_state在 460 行、get_unified_positions在 541 行附近这样的清单。拿到行号后第二次引用就精准了ds_unified.py:434-482 这段 _save_state 和 _load_state 里orphan_positions 的存取逻辑有什么问题手动平仓后重启为什么还会恢复出孤立持仓带行号范围的引用能显著减少无关上下文。实测下来同样的问题整文件问要 3 万 token 上下带范围问只要 4 千左右回答质量反而更高因为模型不用在 3000 行里自己找重点。如果你要一次性审查多个相关方法可以连续多个范围ds_unified.py:434-482 ds_unified.py:541-560 对比这两段状态恢复和交易所同步的先后顺序对不对3.2 持久化改造孤立持仓不落盘问题根源在_save_state里把orphan_positions也写进了 JSON。改造思路是孤立持仓是运行时临时状态每次启动从交易所重新检测不写盘。修改后的_save_state片段def _save_state(self): 保存策略状态到JSON文件机构级持久化 注意孤立持仓(orphan_positions)是临时状态不持久化。 每次启动时从交易所重新检测避免保存过期数据。 try: state { positions: self.positions, # orphan_positions: self.orphan_positions, # 不持久化 trade_history: self.trade_history, trades_today: self.trades_today, total_pnl: self.total_pnl, last_update: datetime.now().isoformat(), last_update_timestamp: time.time() } with open(self.state_file, w, encodingutf-8) as f: json.dump(state, f, indent2, ensure_asciiFalse) logging.debug(f状态已保存: {len(self.positions)}个持仓, {self.trades_today}笔交易) except Exception as e: logging.error(f保存状态失败: {e})对应的_load_state也要改恢复后立刻拿交易所实际持仓做一次校验把已经不存在的孤立持仓清掉def _load_state(self): 从JSON文件恢复策略状态并校验孤立持仓有效性 if not os.path.exists(self.state_file): return with open(self.state_file, r, encodingutf-8) as f: state json.load(f) self.positions state.get(positions, {}) self.trade_history state.get(trade_history, []) self.trades_today state.get(trades_today, 0) self.total_pnl state.get(total_pnl, 0.0) # 孤立持仓不从文件恢复启动时重新检测 self.orphan_positions {} logging.info(f状态已恢复: {len(self.positions)}个持仓)然后在启动流程里同步完交易所持仓后调用一次孤立持仓检测逻辑是「交易所有的仓位减去策略记录的仓位」差集就是孤立持仓。这样手动平仓后重启交易所返回空列表差集为空自然不会误报。3.3 自动平仓开关光检测不够还得给个处理入口。加一个handle_orphan_positions(auto_closeFalse)方法默认只告警传True时自动平掉。这样既保留了人工确认的安全边界又不用每次都手动去交易所点。配置上建议在config.json里加一个orphan_auto_close布尔项默认false跑稳定了再打开。4. 验证请求与成功结果改完代码验证分三步走每步都要看到明确的日志输出才算过。第一步清掉旧状态文件模拟干净启动rm -f A_log/bot_state.json python ds_unified.py预期日志里应该出现「状态文件不存在跳过恢复」或者「状态已恢复: 0个持仓」并且不再有「恢复孤立持仓」的字样。第二步制造一个孤立持仓场景来验证检测逻辑。最省事的办法是手动在交易所开一条单腿仓位比如只买不卖然后重启脚本。预期日志检测到 1 个孤立持仓: BTC/USDT:USDT 处理建议: 设置 orphan_auto_closetrue 自动平仓或调用 close_all_orphans()第三步验证持久化不落盘。在孤立持仓存在的情况下让脚本正常跑一轮保存然后cat A_log/bot_state.json确认 JSON 里没有orphan_positions这个键cat A_log/bot_state.json | python -m json.tool | grep orphan没有任何输出就对了。再手动平掉那条单腿仓位重启脚本日志应该显示「孤立持仓检测: 0 个」说明启动校验生效过期数据没有复活。如果你想让 Claude Code 帮你确认改动是否完整可以这样问ds_unified.py:434-500 我删掉了 orphan_positions 的持久化并在 _load_state 里重置为空。请检查还有没有其他地方读写这个字段列出所有引用位置。模型会把handle_orphan_positions、检测函数里的引用都列出来你逐个确认是运行时赋值而非从文件读取即可。5. 常见报错排查5.1 401 Unauthorized最常见。先看 Key 有没有复制全TaoToken 的 Key 是sk-开头的一长串中间不能有换行。再看ANTHROPIC_AUTH_TOKEN和ANTHROPIC_API_KEY是不是同时设了两个都设时 Claude Code 可能取错。清理掉多余的unset ANTHROPIC_API_KEY echo $ANTHROPIC_AUTH_TOKEN确认输出是你的 Key 再重试。5.2 local proxy failed这个报错通常不是代理问题而是 Base URL 拼错。检查ANTHROPIC_BASE_URL是不是https://taotoken.net/api末尾有没有多余的/或/v1。另外确认你的 shell 里没有残留的HTTP_PROXY指向一个不存在的本地端口有的话unset HTTP_PROXY HTTPS_PROXY再试。5.3 reading choices 解析失败模型返回结构不符合预期多半是 Model ID 写错了。Coding Plan 通道要用套餐里标注的模型 ID别自己拼。改完 settings 后重启 Claude Code 会话旧会话不会热加载环境变量。5.4 OAuth 相关报错Claude Code 某些版本会尝试走 OAuth 登录流程如果你用的是 API Key 方式确保没有残留的登录态。删掉~/.claude/下的凭据缓存文件再启动让它走环境变量认证。5.5 孤立持仓反复出现如果改完代码重启还是报先确认你改的是正在运行的那份ds_unified.py别是备份文件。再确认state_file路径指向的确实是A_log/bot_state.json有些脚本会按日期分文件存。最后用ds_unified.py让模型全局搜一遍orphan_positions看有没有遗漏的读取点。排查时把报错原文贴给 Claude Code配合文件定位比自己在 3000 行里翻快得多ds_unified.py 启动时报 检测到孤立持仓 但我已经在交易所全平了请定位所有可能恢复 orphan_positions 的代码路径。6. 把状态管理跑通之后量化脚本的状态管理本质就一句话本地文件是缓存交易所才是真相。孤立持仓这种临时状态尤其不能落盘一旦落盘就会和手动操作打架。文件引用配合行号范围是我目前审查这类长脚本最顺手的方式比全文粘贴省 token也比 grep 找得全。如果你也想把这套流程固定下来建议把 Claude Code 的接入配置和量化脚本放同一个项目里用 Coding Plan 通道跑长期审查地址在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 临时验证模型连通性用得上。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 环境变量和模型 ID 对不上时先翻这里。最后留一个我踩过的坑改完_save_state别忘了同步改_load_state只改一半的话保存时不写、加载时还get虽然拿到空字典不会报错但你会误以为改造生效了实际检测逻辑根本没跑。两个方法一起改再用第 4 节的grep orphan验证一遍才算真正闭环。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑