“雪球”这个基于 OpenClaw 构建的大A交易员,已经连续跑了三周实时盘。前两周账户稳步上行,最猛的时候权益直接创了新高,我一度觉得AI做交易也就那么回事——直到本周市场进入系统性退潮,雪球连续触发止损、砍仓、防守、反击,我才真正意识到:一个AI交易系统的价值,不在于风浪来的时候多能赚,而在于退潮时能不能把回撤摁住。这篇周报是第三周的完整运行记录,包括退潮行情怎么被系统识别、OpenClaw 侧 Skill 触发止损的执行链路、防守反击的操作细节,以及这周踩过的几个坑。内容全部来自真实运行日志,仅供技术交流,不构成任何投资建议。
1. 本周行情复盘与策略定性:系统性退潮是怎么被系统识别的
1.1 三个量化指标确认退潮信号
行情退潮这件事,散户靠体感,AI靠数据。我给“市场温度计”这套打分逻辑配了四个核心指标:涨停家数、连板高度、两市成交额、跌停家数。每天收盘后,OpenClaw 会自动抓取当天的行情快照,按权重算出一个 0-100 的“市场温度值”。温度高于 70 视为进攻环境,40-70 视为震荡环境,低于 40 自动进入防守状态。
本周的实际数据是这样的:周一温度还在 61 分,盘面已经有点犹豫;周二缩量阴跌,温度掉到 48;周三直接跌到 31,温度计第一次给出“系统性退潮”的提示;周四恐慌盘集中释放,跌停家数冲上两位数,温度瞬间砸到 22 分——这个分数是我回测跑完三个月历史数据都没见过的极值。雪球在周三温度跌破 35 的瞬间,就自动把所有进攻型 Skill 挂起,切到防守策略组。
这里多说一句,为什么用“温度”而不是单纯看指数涨跌:指数的绝对点位受权重股影响太大,而涨停家数、连板高度、涨跌比这些微观数据,才能反映市场真实的赚钱效应和情绪水位。退潮期最典型的特征就是“指数还撑着,个股已经跌麻了”,如果只看大盘很容易误判。
1.2 三档仓位模型的触发逻辑
雪球的仓位管理不是人来拍脑袋定的,而是写死在策略引擎里的三档模型。第一档是进攻模式,温度分 60 以上,目标仓位 80%-100%,允许持有高波动题材股;第二档是均衡模式,温度分 40-60,目标仓位 50%-70%,强制要求持仓里至少一半是绩优股;第三档是防守模式,温度分 40 以下,目标仓位 0%-30%,只允许配置高股息和现金等价物。
触发逻辑用的是双确认机制:温度计连续两天低于阈值,或者单日温度突降超过 15 分,才会触发档位切换。这么设计是为了防止单日数据噪声导致的频繁调仓,毕竟每一次调仓都是有摩擦成本的。这周触发的是第二种——周三温度单日从 48 跳水到 31,突降 17 分,雪球当天收盘后就把仓位从七成砍到了三成半。
这套三档模型的本质,是把“择时”这个模糊的主观判断,转化成一个可以用规则描述的客观流程。AI 不需要预测明天涨跌,它只需要在下跌趋势确认后,用纪律来控制损失。这也是我个人做这套系统最核心的理念:在交易里,应对永远比预测重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构复盘:OpenClaw 交易 Agent 的 Skill 化设计
2.1 感知层:定时行情抓取与数据清洗
OpenClaw 的弹性在于,它把一切能力都抽象成了 Skill——你不需要改框架源码,只需要写好 Skill 的配置和逻辑,Agent 就能按需调用。雪球的第一层 Skill 是感知层,负责定时抓行情数据、算指标、更新市场温度。我部署在本地 Docker 环境里,用一个 cron 任务每 30 分钟触发一次行情抓取,收盘后额外跑一次完整快照和温度计算。
这里我踩过的一个大坑是数据源的频率限制。第三方行情接口对请求频率卡得很死,OpenClaw 的定时任务要是写得太密,很容易触发限流,导致后续 Skill 拿到的是一堆空数据。后来我在行情抓取 Skill 里加了一层缓存和重试机制:数据能命中缓存就直接读缓存,缓存失效才去请求接口;请求失败则指数退避重试,最多重试三次。这样既保住了数据完整性,又不会把接口打挂。
数据清洗也是必须处理的环节。A股市场的行情数据经常出现停牌、ST、新股上市首日无涨跌幅限制这类特殊状态,如果不做清洗直接丢给模型分析,决策质量会大打折扣。我的做法是在抓取后加一个预处理管道:过滤掉上市不足 60 个交易日的新股、剔除停牌股、把 ST 股单独标记出来,避免模型把垃圾数据当信号。
2.2 决策层:双模型协同与提示词约束
很多人在 OpenClaw 里接 AI 模型,就是一个模型走到底。但交易决策这件事,我强烈建议用双模型互审:主决策模型负责生成操作建议,风控模型负责挑刺。雪球的主决策模型用的 DeepSeek-V3,负责综合行情数据、市场温度、持仓情况,输出结构化的交易指令;风控模型则是本地部署的 Qwen 系列,专门对主模型的建议做二次评审,标记潜在风险项。
为什么要双模型?因为单一模型的输出可能存在系统性偏差——比如在退潮期,主模型可能会因为读取了太多悲观数据,给出过度保守的建议;或者反过来,被个别逆势上涨的个股带偏,忽略了整体环境。两个不同架构的模型互相独立评分,能明显降低这种单点偏差。实测下来,双模型的决策稳定性比单模型高了不止一个档次,输出的交易指令格式也更规范。
模型输出的规范性也很关键。我给雪球写了一个严格的 system prompt,要求所有交易建议必须输出为固定 JSON 格式,包含 operation(买入/卖出/持有)、ticker、position_ratio、reason、risk_level 五个字段。这样后续的执行层就可以直接解析 JSON,不需要再让另一个模型去解读文本,减少了一步出错的可能性。你可以看一下这个 JSON 的结构示例:
json复制{
"operation": "sell",
"ticker": "示例标的",
"position_ratio": 0.15,
"reason": "跌破5日均线,市场温度低于35,触发防守策略",
"risk_level": "high"
}
2.3 执行层:指令生成与人工确认的边界
雪球的最终下单不是全自动的,而是保留了一个人工确认环节。OpenClaw 生成交易指令后,会通过消息通道推送到我的手机,我确认后才会执行。这么做不是不信任 AI,而是在实盘环境里,有些特殊情况——比如盘中临时停牌、突发公告——AI 无法像人一样快速理解上下文,保留人工闸门是必要的风控手段。
人工确认也有个度的问题。如果每笔买卖都要人手动操作,那 AI 交易员的效率优势就没了。我的处理方式是按风险等级分级:单笔仓位变动小于 5% 的低风险交易,Agent 确认后可以直接走自动执行;单笔超过 5% 或者涉及清仓、满仓这类极端操作,必须人工确认。这周几次止损砍仓的仓位都比较大,全部走的是人工确认通道。
执行层还有一个隐藏需求,就是操作留痕。每条交易指令从生成、评审、人工确认到最终执行,全链路都会写进本地日志和 Active Memory。这样后续回测、复盘、追责,都有据可查。OpenClaw 的 Active Memory 模块在这周派上了大用场,它帮我保存了每一天的决策理由和市场快照,周三复盘的时候,我直接让 Agent 对比了上周的持仓逻辑和本周的市场变化,很快就定位到了需要调整的策略点。
3. 断臂求生:本周三次止损的完整执行记录
3.1 第一笔止损:跌破止损线的机械执行
周三上午,雪球的持仓监控 Skill 发现一只重仓股跌破了成本价 8% 的止损线。这只票是前两周盈利的主要来源之一,从最高点回撤已经接近 12%。如果是我自己手动操作,大概率会有“再等等反弹”的侥幸心理,但雪球没有任何情绪,直接触发了止损评估流程。
评估流程是这样的:先调取该股票最近 5 日的价格走势和成交量数据,再检查当前市场温度,然后由主模型生成操作建议,最后由风控模型复核。两个模型的结论高度一致:当前股价已经有效跌破 30 分钟级别支撑位,成交量缩量说明没有承接盘,叠加市场温度只有 28 分,建议清仓离场。
我在手机端收到推送后,花了大概三分钟确认了这条指令。执行完这笔止损,该标的的仓位从 25% 降到了 2%。说实话,执行的那一刻我的心态是有点挣扎的——毕竟这只票曾经赚过钱,但看着雪球冷静地列出的那几条理由,反而比我自己操作的时候更果断。止损完成后当天下午,该股又跌了 4 个点,算是验证了决策的正确性。
3.2 第二笔止损:反弹失败后的第二次减仓
周四的交易更考验系统。早盘市场出现了一波微弱的反弹,我一度以为雪球会改变防守策略,结果它的决策层很冷静:市场温度依旧低于 30,反弹量能不足,且涨停家数没有同步放大,这只是下跌中继,不构成趋势反转。
雪球在当天 10 点半左右生成了一条减仓指令——把剩下一只题材股的仓位从 15% 降到 5%。理由是:该股周三跟随大盘反弹了 2.8%,但周四高开低走,短线动能已经衰竭,属于典型的反弹失败形态。风控模型也提示这只票的波动率仍然处于高位,继续持有的风险收益比不佳。
这笔操作帮我躲过了午后的二次跳水。收盘时该股跌了 5.2%,如果没减仓,持仓损失会多出将近一个点。这两天连续砍仓之后,总仓位已经从周二的七成降到了不到三成,账户权益虽然回撤,但躲过了最猛的一段下跌。说实话,这两笔止损执行完,我自己反而松了一口气——把风险敞口降下来,后面才有反击的资本。
3.3 关于 AI 止损的三点体会
第一,止损纪律一定要写死,不能给模型留“自由发挥”的空间。雪球的止损规则是硬编码在 Skill 配置里的,不是靠提示词让模型自觉遵守——提示词是软约束,模型在上下文压力下可能会偏离,但代码逻辑是硬约束,没有讨价还价的余地。
第二,AI 止损最怕的其实是数据延迟。如果行情数据更新不及时,止损指令生成时股价可能已经跌得更深了。所以我把行情抓取频率在止损触发期间自动调高到每分钟一次,确保 Agent 拿到的是最新的成交价。
第三,止损后的资金管理比止损本身更重要。清仓出来的现金不要立刻重新买入,至少要等市场温度企稳。很多人在止损后急着回本,结果从坑里爬出来又掉进另一个坑。这笔钱要先躺在现金仓位里,等防守反击的信号明确出现再动手。
4. 极限防守反击:空仓与试错的博弈
4.1 防守期的仓位结构
周四周五,雪球的仓位已经压缩到了防守模型的极限:总仓位 28%,其中高股息标的占比 20%,现金占比 8%。这个结构是我和策略引擎磨合了很久才定下来的——高股息标的不是用来赚钱的,而是用来对冲净值波动的;现金则是防守反击的弹药,没有现金,后面所有反击都是空谈。
防守期最忌讳的是“手痒”。很多交易者的焦虑不是因为亏钱,而是因为空仓,总觉得不持仓就错过了什么。雪球没有这个心理负担,它的策略引擎里写了一条规则:温度低于 35 时,禁止新建任何进攻型仓位。这条规则帮我挡住了好几个盘中异动的诱惑——比如周四下午有一只电力股突然拉升,要放在我手动操作的时候,可能真的会忍不住追进去。
防守期的另一个重点是持仓跟踪。虽然仓位降下来了,但雪球仍然在对之前关注的自选股做日频跟踪,更新它们的技术形态和基本面变化。这些数据会写入 Active Memory,作为后续情况反转时的决策参考。防守不是躺平,而是降低风险暴露的同时,保持对市场的感知。
4.2 反击条件与风险控制
防守反击听起来很诱人,但执行起来需要极其严格的条件约束。我给雪球定义了两个反击触发条件:一是市场温度快速从极值回升,比如单日从 25 分以下回到 40 分以上;二是出现极端恐慌信号,比如单日跌停家数超过 80 家,同时次日的跌停家数大幅减少——这种情况说明恐慌盘已经出清,存在超跌反弹的交易性机会。
周四全市场跌停家数接近 30 家,加上周三的积累,恐慌情绪已经释放得比较充分。雪球在周四收盘后生成了“超跌反弹关注”清单,从跌幅超过 8% 且基本面没有恶化的标的中筛选出了几只备选,同时给出了明确的试错仓位限制:总试错仓位不超过 10%,单标的不超过 5%,且全部要求快进快出,持有周期不超过 3 个交易日。
这里说一下为什么敢在退潮期做反击:不是因为预判到反弹,而是因为“涨停家数/跌停家数”这个比值已经到了历史极低区域,统计学上未来 1-2 天出现修复的概率较大。这是概率的玩法,不是预测的玩法——用可控的亏损去博弈一个相对有优势的概率事件,错了就认赔出局,对了就吃一段修复行情。
4.3 周五反击的操作复盘
周五早盘,雪球按计划执行了防守反击:用 5% 的仓位买入了备选个股中超跌最明显的标的,又用 3% 的仓位试了一次 ETF 的短线反弹。买入逻辑很简单,该股在周四恐慌性下跌中跌幅超过 11%,但公司基本面没有变化,盘后公告也没有利空,属于典型的错杀。
这次反击的结果比较理想:该股周五盘中一度冲高到 6%,收盘时涨幅收窄到 3.8%,ETF 大概涨了 1.2%。雪球在尾盘自动执行了减仓,把反击仓位从 8% 降到了 4%,锁定了大部分利润。整个防守反击战役从触发到结束,持仓时间不到 8 个小时。
这笔交易的意义不在于赚了多少,而在于验证了“极限防守-信号识别-风险可控的进攻”这套完整链路是能跑通的。这也让雪球的策略引擎多了一条重要的实战记录:在极端恐慌后的反击阶段,仓位不能超过 10%,持仓必须控制在 3 个交易日内,触及止损线无条件离场。
5. 踩坑实录:OpenClaw 运行第三周的问题清单
5.1 问题速查表
实盘跑到第三周,OpenClaw 侧的问题也开始暴露。我把这周遇到的主要问题整理成了表格,后面详细讲几个典型场景的排查过程。
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Control UI 启动失败 | 端口被占用或依赖缺失 | 检查 8080 端口,清理残留进程后重启 |
| Agent 运行失败,无有效回复 | 模型 API 配置错误 | 检查模型名是否与服务商命名一致 |
| 多模型切换后上下文丢失 | 模型路由配置未同步 | 切换模型时同步更新 system prompt |
| Skill 调用行情接口限流 | 请求频率超过接口阈值 | 加缓存与指数退避重试机制 |
| 读取本地文档失败 | 文档格式不受支持 | 先转成 txt 或 md 再交给 Agent |
| Active Memory 写入冲突 | 多进程同时写同一份记忆文件 | 加文件锁,或拆分为独立记忆文件 |
5.2 三个典型问题的详细排查过程
最让我头疼的是周二的“Agent 运行失败,无有效回复”问题。当时雪球刚刚切换了一次模型配置,重新启动后所有 Skill 都调用失败,日志里只显示“the agent run failed before producing a reply”。排查了一圈才发现,问题出在模型名称上:我在配置里写的是“deepseek-v3”,但服务商的定义是“DeepSeek-V3”,大小写和连字符的差异导致 API 直接拒绝调用。这个问题看起来低级,但如果你用 OpenClaw 做多模型接入,几乎一定会遇到——改配置的时候务必核对模型名称的准确性。
第二个问题是 Control UI 无法启动。我部署的 OpenClaw 版本自带的控制面板,某次重启之后一直报错,后来发现是端口被另一个测试服务占用了。解决方式是直接改 OpenClaw 的端口配置,然后清理掉占用端口的残留进程。这个问题的排查思路很简单:先看日志,确认是哪一步启动失败,再用系统命令检查端口占用和进程状态。
第三个问题的价值最大——Active Memory 写入冲突。我原本给每个交易日配置了一份记忆文件,但有时多个 Skill 会并发写入同一个文件,导致内容互相覆盖。后来我加了一个文件锁机制,并且按 Skill 维度拆分了记忆文件,比如行情感知写一个文件、交易决策写另一个文件、复盘记录再写一个文件。这样不仅解决了冲突,还让记忆模块的结构清晰了很多,Agent 在复盘时能更快地找到需要的历史记录。
5.3 稳定性经验总结
这周跑下来,我对 OpenClaw 的稳定性有了更深的理解。首先,生产级别的 Agent 一定要用 Docker 等容器方式隔离部署,避免本地环境变更导致系统异常;其次,核心 Skill 要写单元测试,尤其是数据抓取和指令生成这两个环节,每次改动后都要跑一遍测试确认没有引入回归问题;最后,Agent 的运行状态要接入类似健康检查的机制,哪怕只是每天发一条“系统正常运行”的消息到手机上,也比突然挂掉才发现要好得多。
还有一个容易被忽略的点:OpenClaw 的模型调用是有 token 成本上限的。交易时段的分析比较密集,如果对话上下文不断累积,token 消耗会涨得很快。我的做法是在每次决策完成后,主动清理中间过程的对话历史,只保留结构化结果写入 Active Memory,这样既控制了成本,又避免了上下文太长导致模型注意力分散。
6. 下周计划与迭代方向
6.1 盘后复盘自动化
这周的行情让雪球积累了大量的防守案例,下周我打算重点做一件事:把盘后复盘流程完全交给 OpenClaw。之前复盘还是我手动写,下周一我会写一个 review_skill,让 Agent 在每天收盘后自动生成复盘报告——对比当天的实际走势与前一天策略预期,标记哪些决策是对的、哪些是错的,并输出下一天的风险提示。
这个 Skill 的难点在于“怎么判断决策对错”。最简单的做法是看 outcome 是否符合预期——比如卖出的股票次日跌了,说明卖出决策是对的。但这样太机械,我打算引入另一个维度:决策当时的条件是否成立。只要执行时市场环境与策略预设一致,即使结果亏了,决策也算合规;反过来,如果执行时已经偏离策略条件还硬做,那就属于违规交易,要在复盘报告中专门标记。
6.2 接入历史回测框架
下一步比较大的动作是把回测框架接进 OpenClaw。我在本地已经有了一套基于历史行情数据的回测脚本,但目前在 OpenClaw 里运行还比较割裂——需要先把历史数据导出来,用脚本跑完回测,再手动把结果贴给 Agent 分析。下周我准备把回测脚本也改造成 Skill,这样 Agent 就能自己跑回测、读结果、调整策略参数。
回测的好处不用多说,尤其是对防御策略而言。像这周的防守反击逻辑,我需要验证它在过去两到三年的极端退潮行情中,同样的触发条件是否都能跑出正收益,触发后的最优持有周期到底是 1 天还是 3 天。这些参数不能靠猜,必须用历史数据说话。
6.3 记忆模块的进一步优化
最后是 Active Memory 的迭代方向。现在的记忆文件是按天和按 Skill 拆分的,但跨天的关联性还比较弱。比如雪球只记得“周三清仓了某只股票”,但更关键的是要记住“为什么清仓”和“后续该标的是否出现了新的交易信号”。我准备在记忆结构里增加一个“投资事件链”的概念,把同一只股票或同一个板块的所有决策、执行、结果,串成一条完整的事件链,方便 Agent 在后续决策时快速调用。
这个迭代如果做成了,雪球的“记忆力”会有一个质的提升——它不再是每天独立做判断的机器人,而是一个能积累经验、持续进化的交易系统。
跑了一个月的实盘,我最大的感受是:AI 交易系统最大的价值,不是帮你抓住每一次机会,而是帮你在该收手的时候收手。毕竟在这个市场里,活得久比赚得快重要得多。
