← 返回教程库

从一个跑得通的 demo 到真能用,差的是什么

最后更新 2026-08-19
📚 量化与 AI 投研 📖 AI 交易与 Agent ⏱ 约 17 分钟 R2 · 注意风险
你将学到
  • 说清 demo 和「能持续用」之间隔着的五件事:数据持续可得、故障能恢复、结果可审计、成本可控、人能随时接管
  • 说清持续运行怎么判活:心跳时间戳的写法,以及为什么检测到进程死亡后只报告不重启、对账没做完不许拉起新进程
  • 能自己算一笔账,判断把 AI 放在投研环节还是下单环节,对个人投资者的性价比差在哪

周六晚上你花了三个小时,把一个开源的 AI 投研项目跑起来了。填好接口密钥,敲下示例命令,屏幕上一行行滚过去:它自己去拉了行情、读了几份公告、调了个回测、最后吐出一份结构完整的报告。那一刻的感觉很上头——原来这事儿这么快就能成。

三周之后你打开那个目录,发现自己已经好几天没敢碰它了。前天它跑到一半卡住,日志里有一串你看不懂的报错;昨天它给出的报告里,有个数字明显不对,但你翻不出来那个数是哪一步来的;今天你想再跑一次,发现某个数据接口改了返回格式。

中间发生了什么?什么都没发生。这就是 demo 和「能持续用」之间的全部距离。

这一节讲的就是这段距离。它不好看,没有任何一部分是「新范式」,但它决定了你三个月后手里是一个在干活的东西,还是一个荒废的文件夹。

先说人话:做一顿饭和开一家餐馆

你在家给朋友做过一顿很成功的菜。食材是下午刚买的、最新鲜的那批;灶台是干净的;你有整整两小时,不赶时间;做糊了大不了重来一次,朋友还得夸你。

现在把这件事变成开一家小馆子。

食材要天天有,而且供货商可能今天涨价、明天断货、后天送来一箱不新鲜的。你得在客人点单前就发现那箱不新鲜的,而不是在客人吃到之后。灶台会坏,坏在中午十二点。账要能查——三个月后有人问「上周三那道菜用的哪批肉」,你得答得出来。成本要算清楚,不然生意越好亏得越多。还有最要紧的一条:你得随时能喊停,火大了、菜错了、客人过敏了,得有一个立刻能按下去的开关。

做一顿饭考验的是厨艺,开馆子考验的是厨艺之外的全部东西

跑通一个 demo 和让一套 AI 流程真的融进你的投资习惯,是同一种关系。demo 考验的是模型聪不聪明,持续可用考验的是聪明之外的全部东西。

对你的投资意味着什么:demo 活在静止的一天里

具体到投资场景,这个差距有个很明确的形状。

你跑 demo 那天,世界是静止的。数据接口那天是好的,你用的那几个标的那天都在正常交易,没有停牌、没有除权、没有临时公告,你有耐心盯着它跑完,出了错你在旁边手动兜住了。

而你真要用它,用的是连续的每一天。周一有个标的停牌了,接口返回一个空表;周三你要跟踪的那家公司分红除权,历史价格整体往下平移了一截,前后的数据接不上;周五你人在开会,它自己跑,跑挂了没人知道,你以为它给你盯着,其实它三天前就已经死了。

最危险的不是它停了,是它在你不知道的情况下继续输出。 数据源挂掉之后返回一张空表,模型不会因为表是空的就闭嘴——它会用记忆里的东西把缺口补上,然后照样给你一份格式漂亮的报告。这个失败模式和 让大模型直接做交易决策,这条路现在走到哪了 里讲的幻觉是同一个根,但在持续运行的场景里它更毒:一次性使用你还会警惕,天天用你就不看了。

下面五件事,就是把「静止的一天」撑成「连续的每一天」所必须补上的。

一、数据要持续可得,而且得是干净的

先说供货。

任何一个认真做过持续运行的项目,数据这一层都不会只接一个源。Vibe-Trading 的行情加载器写成了一个注册表加回退链:几十个数据源各自注册进去,按市场组织成一条链,前一个取不到就自动往后退。这个设计不是为了炫技,是被现实逼的——免费接口会限流、会改字段、会某天早上就不响应了。

比数据取不到更麻烦的,是数据取到了但不对除权除息之后的价格要不要复权、停牌那几天的价格怎么填、财报数据在什么时点才算「当时能看见」——这些坑在传统量化里已经被反复讲过,一样原样落在 AI 流程上。你可以顺着 回测好看实盘亏,差的到底是哪三件事 里讲的那几类数据陷阱回去看,那里面没有一条会因为换成 AI 就消失。

还有一层是 demo 阶段完全感受不到的:数据的新鲜度会随时间偷偷腐烂。项目里那个负责往提示词里塞真实行情的模块自己就交代了这一点——它只在任务启动时抓一次快照,跑得久了这份快照就旧了。跑十分钟没问题,跑一整天就有问题。你的 demo 只跑了十分钟。

🚧 避坑

坑:把「接口通了」当成「数据可用了」。 接口返回 200、返回了一个表,不代表这个表里的东西是对的、是全的、是最新的。怎么避:给你自己的流程加一条最土的检查——每次拿到数据先看三样,最新一条是哪天的、总共几条、有没有空值。三样里任何一样不对,直接终止,不许往下走。这条检查写起来十分钟,能挡掉后面九成的莫名其妙。

二、故障要能恢复,但恢复绝不等于重试

程序会崩,这不新鲜。让交易场景特殊的,是崩溃之后不能想当然地重来一次——为什么「自动重连然后继续」是个足以否掉一整套方案的答案、恢复模块该被限成什么样,把下单权交给 AI 之前,先问自己这几个问题 已经整理成一份可以拿去质问方案的清单,这一节不重复态度,只补持续运行这一侧的三块机制:崩在半路会留下什么、你怎么知道它还活着、发现它死了之后该按什么顺序动。

先说崩在半路留下什么,因为后面两块都是冲着这个来的。

一次下单从你的程序发出,到你确认它落定,中间要跨过好几道你控制不了的边界:网络、券商的接单系统、交易所。如果进程正好死在这段路上,事后你打开自己的记录,看到的只会是一条有开头没结尾的痕迹,而它背后至少对应三种完全不同的现实:请求根本没发出去;发出去了、券商已经受理,但回执没能传回来;回执其实收到了,只是还没来得及写进自己的存档。

关键在于,这三种在程序自己的记录里长得一模一样。你翻遍本地文件也分不出来,因为区别不在你这边——它在券商那边。这一条直接决定了恢复流程的第一个动作是什么:不是读自己的存档接着往下跑,是去问券商现在到底是什么状况。 凡是从自己记录出发做恢复的设计,第一步就已经建在一个分不清的前提上了。

再说判活。一个只跑一次的脚本不需要这个东西——你就坐在旁边看着它跑完。一个天天跑的进程需要,而且不能靠「我想起来了就去翻翻日志」,因为你想起来的那一刻通常已经是三天以后。

项目里的做法是心跳:每个持续运行的进程按固定节拍往一个约定位置写一次当前时间戳,写的动作挂在主循环里,循环转一圈就跳一下。外面的检测方只做一件极简单的事——把文件里那个时间戳跟现在比一比,超过阈值没更新,就判定这个进程死了(阈值有默认值,可配置)。

这个设计朴素得几乎有点土,但它的好处正在土里:判定方完全不需要理解被判定方在干什么。 它不用知道进程是卡在模型没返回、还是卡在券商接口超时、还是整台机器睡过去了——这三种情况在外面看是同一个现象:那个数字不往前走了。而对「该不该叫人」这个问题来说,它们本来就该是同一个答案。反过来,如果你的检测逻辑要去理解「它现在跑到哪一步、正不正常」,那这套检测本身就成了一个会出错、会跟着一起挂掉的东西。

真正值得琢磨的是下一步:检测到死亡之后,它只报告,不重启。

这跟一般的服务运维完全相反。普通后台服务挂了,进程守护会立刻把它拉起来,拉起来就算恢复了,甚至没人会收到通知。交易场景不能这么干,理由是一条硬规则:对账没做完之前,不许拉起新进程。

这句话的分量值得展开。进程死掉那一刻,外部世界的状态是不确定的——市场上可能还挂着单,持仓可能已经跟程序记录的不一样了。这时候一个新进程被自动拉起来,它会从自己的存档里读出一个「我认为的状态」,然后基于这个状态继续做决策。如果这份存档和券商那边的实际情况对不上,新进程做的每一个决策都建在一个错的前提上。而它不会报错,它会跑得很顺,日志一片正常。

自动重启把一次干净的故障,变成了一串建立在错误前提上的正常操作。 前者你一眼能看见,后者你可能几周之后才从对不上的账里发现,而那时候中间已经堆了几十个动作,你连从哪一笔开始错的都要查半天。这就是为什么在这件事上,「它挂了没人管」反而是比「它自己好了」更安全的状态。

所以顺序被固定成这样,而且中间没有一步是程序可以自己跳过的:心跳发现死亡 → 报警给人 → 把程序侧的账和券商侧的实际持仓、挂单逐条对齐 → 对齐了、或者对不上的部分被人明确处理掉了,才允许重新拉起。

对个人用户,这一整套可以缩得非常小,但顺序不能改。你的「心跳」可以就是让流程每跑完一轮往一个文本文件里追加一行时间;你的「检测」可以就是每天早上瞟一眼那个文件最后一行是不是昨天的;你的「对账」可以就是打开券商 App 看一眼持仓和挂单,跟你记录里的对一对。工具有多简陋不重要,重要的是你有没有把「先对账、再重启」变成一个不需要犹豫的习惯——看见程序挂了顺手重跑一次,是这件事上最贵的一个手滑。

三、留痕:一本必须活得比日志久的账

该拿什么标准去验一套留痕算不算数,把下单权交给 AI 之前,先问自己这几个问题 里有现成的判据。这一节讲的是另一半:这本账在工程上是怎么存的,为什么它不能跟运行日志混在一起。

先说为什么要分开。运行日志的设计目的是排查故障,所以它天生是可以被丢弃的——写得很密、涨得很快,于是要按大小滚动、按天数清理,跑上两个月,两个月前的那一行早就被覆盖掉了。而涉及真钱的记录恰恰是越老越值钱:你要查的往往正是几个月前那一笔。两种东西对「保留多久」的要求正好相反,混在一起就意味着按前者的规矩淘汰后者。

所以认真的做法是给后者单开一本账,而且这本账是只追加、不修改的——没有任何一条路径可以改写或删除已经写下的记录。这个限制看着别扭,用意很直接:一份能被改的记录,在需要它作证的时候不作数。

Vibe-Trading 就是这么做的。哪些动作要进这本账,它列得很宽:下了单、被闸门拦下、授权被提交、触发了越界、开关被按下或解除——凡是跟真钱沾边的状态变化都算,不只是「成功下单」那一类。

具体到怎么写,有两个细节值得单独说,也是你自己留档时最容易漏的两处。

一个是授权链。每条记录里都带着两个引用:这次动作是在哪一份授权下发生的,而那份授权又来自用户在界面上的哪一次点击。两者一串,就能从「这笔操作」一路回溯到「是我本人在某个时刻亲手同意的」。这条链是整套问责机制的骨架。

另一个是脱敏。券商接口的请求和返回里会夹着令牌、账号这类东西,所以每条记录在写进任何地方之前,先过一遍清洗,把敏感字段替换掉。写完再想起来擦是来不及的——日志一旦落盘就到处都是了。

对个人用户,这一条可以做得很轻,但不能不做。 哪怕只是每次运行留一个文件夹,把当时用到的原始数据快照、提示词、模型的完整输出各存一份,就已经比绝大多数人强了。判断标准很简单:三个月后你能不能只靠这个文件夹,把当时那个决定完整重建出来。 重建不出来,那份报告就只是当时的一种情绪,不是资产。

四、成本:会自己长大的那部分开销

跑 demo 的成本感知是失真的,因为你只跑了一次。

真跑起来之后,有一笔开销会自己往上长。AI 每次思考时能看见的那段材料叫上下文——你可以理解成它的短期记忆,有容量上限,而且你放进去的东西越多,这一次调用就越贵。一个多步骤的流程里,前面每一步的输出都会累进这段记忆,然后在后面每一步被重新读一遍。步骤越多,滚得越厚,费用不是线性涨的。

所以你会看到项目里有个专门用来「压缩对话历史」的工具,让模型在觉得上下文太长时主动把前面的内容摘要掉,腾出空间。这是个很朴素但必要的设计。

除了钱,还有两笔容易被忽略的成本:时间(一个跑二十分钟的流程,你一天能跑几次?)和你自己的注意力(每份输出都需要你核对关键数字,输出越多你越核不过来,最后就变成不核了,那才是真危险)。什么活值得用最贵的模型、什么活便宜的就够,是可以逐环节拆开算的,什么活值得用最贵的模型 那一节专门讲这笔账。

这里只说一个判断:如果一套流程的运行成本高到让你不舍得重跑,它就已经不可用了。 因为投研的价值恰恰来自反复跑、反复对照,一次性的昂贵输出,你连它稳不稳定都验不了。

五、人要能随时把手伸进去

最后一条,也是唯一一条没有商量余地的。前面四节讲的都是程序侧该有什么,这一节换个视角,讲你本人这一侧:假设现在就出事了,你要怎么在三秒之内把它按停,以及停完之后手上还剩什么没收拾。

程序那一侧的急停该做成什么样——为什么它必须是一个跟模型状态无关的开关、连读坏了也得按「已停止」算——从一句话到一张委托单 里已经拆开讲过,把下单权交给 AI 之前,先问自己这几个问题 则把它整理成了质问别人方案时的判断标准。这一节不碰实现,只谈你本人这一侧,因为再好的开关也得有人按得到。

你现在打开手机,最快能在几秒内让你那套东西停下来? 请真的在脑子里走一遍,别停在「应该可以吧」。常见的答案经不起走这一遍:

  • 「我去把终端窗口关掉。」——前提是你人在那台电脑前。你在外面呢?它跑在云主机上呢?
  • 「我登上去把进程杀掉。」——你手忙脚乱的时候,记得住地址、记得住密钥放哪儿吗?中间但凡卡一步,三秒就变成三十分钟。
  • 「我给它设了阈值,到了会自己停。」——那是它替你判断,跟「你能不能叫停」是两回事。它出问题的时候,那个阈值往往就长在出问题的那套判断里。

所以正确的做法是在没出事的时候,先给自己备一条真能在三秒内按下去的路,而且它必须是不需要现场思考的:一条存在便签里可以直接粘贴的命令、一个放在桌面上双击就跑的脚本、一个手机上点一下就执行的快捷方式。判断标准只有一个——这条路能不能在你慌乱、在半夜、在你手上只有手机的情况下执行完。 任何需要你临场回忆什么的方案,都不算数。顺手再补一句:这条路你得每隔一阵子真的按一次试试,一个从没被按过的开关等于没有开关。

还有一层多数人没想过:「停」其实有三个档,你得知道自己按的是哪一档。 最轻的一档是让它别再产生新动作,程序还活着,你随时能看它的状态,代价最小;中间一档是把整个进程结束掉,好处是彻底,坏处是它手上那些没跑完的东西连同状态一起消失,你事后要靠外部记录重建;最重的一档是去券商那边把权限本身关掉或者把钱划走,这一档不需要你的程序配合任何事,也是唯一在「你的电脑压根打不开」时还能用的一档。平时把这三档按从轻到重排一遍、各写下具体怎么执行,出事那一刻你就不用一边慌一边挑了——慌乱的时候人不做选择题,只做已经排好序的动作。

然后是更容易被跳过的后半段:停完之后,你手上还剩什么没收拾?

按下停止那一刻,你停掉的只是「继续产生新动作」这一件事。别的东西一样都没消失:

  • 挂在市场上还没成交的委托。 你按下的那个停止跟它们没关系,它们照样可能在下一秒成交。
  • 已经持有的仓位。 停止不等于清仓,行情该怎么走还怎么走。
  • 一堆状态不明的中间结果。 最后那一轮跑到哪儿了?有没有哪个动作正好卡在发出去和收到回执之间?
  • 你自己的判断。 你刚刚到底是因为什么按的停?这个理由三小时之后你还说得清吗?

对个人用户,这四样各对应一个动作,值得提前写成一张纸条贴在手边。一、去券商 App 里亲眼确认挂单列表是空的——别信你自己程序的显示,它已经不可信了你才按的停。二、看一眼当前持仓,再决定留着还是手动处理——注意手动平仓本身也是一次交易决定,别在刚受惊的状态里做。三、把日志和当时的界面原样存一份,不要一边排查一边改文件,你会把现场毁掉。四、马上把「为什么停」写下来,三句话就够,这是事后你唯一靠得住的现场记录。

「能停下来」和「停完之后知道自己在哪儿」,是两种不同的能力,而多数人只准备了第一种。

⚠️ 风险提示

这几个模块的存在,本身就是一条给你的重要信息:认真做这件事的人,默认自己写的东西会失控,所以先把「怎么停下来」设计好,才去设计「怎么跑起来」。 任何一套让你没法在三秒内叫停、事后没法查清做过什么、额度没有硬上限的自动化安排,无论它平时表现多好,都不该碰真钱。本站只讲机制与风险,不提供任何自动交易方案,也不认为这条路能带来收益,边界见 免责声明

落到你自己的流程上:六件今天就能补的事

上面五件事讲的是机制该长什么样,这一节把它们翻成你这周就能动手补的东西。注意这不是一份用来审别人的问卷——要不要把权限交出去、该拿什么标准去质问一套自动交易方案,是 把下单权交给 AI 之前,先问自己这几个问题 的活儿,这里只管你自己那套已经在跑的流程怎么从 demo 变成能用的东西。

  • 给数据加三行检查。 每次拿到数据先看最新一条是哪天、总共几条、有没有空值,任一项不对就终止。写起来十分钟,能挡掉后面九成的莫名其妙。
  • 给数据备一条退路。 你现在依赖的那个接口,如果明天早上不响应了,你有没有第二个能取到同样东西的地方?没有的话,先花半小时找出来记下来,不用现在就接。
  • 让流程自己报个到。 每跑完一轮往一个文本文件追加一行时间,早上瞟一眼最后一行是不是昨天的。这是最省事的心跳。
  • 把「先对账、再重跑」变成肌肉记忆。 看见它挂了,第一个动作永远是对一遍账,不是重启。
  • 每次运行留一个文件夹。 原始数据快照、你问的问题、模型的完整输出、你最后的判断,各存一份。判断标准是三个月后能不能只靠它重建当时的决定。
  • 给自己备一条三秒能按下去的停止路径,并且真的按过一次。

这六件事有个共同的特点:它们全都不需要你写多少代码,也全都不会让你的流程变聪明一点。 它们只决定三个月后你手上是一个还在干活的东西,还是一个荒废的文件夹。

算笔账:投研和自动交易,性价比差在哪

这一节收口,说一个我认为很重要、但很少被明说的判断:对个人投资者,把 AI 用在投研上的性价比,远远高于用在自动交易上。

理由有四条,都跟聪不聪明无关。

第一,失败的代价完全不同。 读错材料你损失半小时,下错单你损失的是不可撤销的真钱——同样一个错误率,两边后果差着量级。这一条为什么足以否掉「我先小仓位试试」之类的自我说服,把下单权交给 AI 之前,先问自己这几个问题 里推得更完整。

第二,上面那五件事的负担完全不同。 用在投研上,你是坐在屏幕前主动发起的——数据错了你当场看得见,跑挂了你重跑一次就是,成本花在明处,随时可以关掉。用在自动交易上,你签下的是一份「无人值守、连续运行、涉及真钱」的责任,前面五条一条都不能省。同样一个模型,放在两个位置上,工程负担差着一整个量级。

第三,投研的产出会积累,交易的产出会归零。 这一条我觉得是四条里最被低估的,值得说到具体。

「积累」不是一句鸡汤,它有实物形态。你把 AI 用在投研上认真做三个月,手上会沉下来三样看得见的东西:

  • 一份固定动作清单。 看一家公司先看什么后看什么、财报出来先核哪三个数、管理层的承诺记在哪儿、下一期怎么回头对。这份清单一开始是 AI 帮你整理出来的,用过几轮之后它就长到你自己身上了——换个标的照样能用,哪天不用 AI,你也比三个月前强。
  • 一个留存文件夹。 每次研究把原始材料、你问的问题、模型的完整输出、你最后的判断各存一份。半年后回头翻,你能看见自己在哪些地方判断错了、错的是同一种模式还是各不相同。这东西市面上买不到,因为它只关于你一个人。
  • 一份可复用的核查表。 哪些数字模型最容易搞错、哪类说法必须回原文核、哪个数据源在什么情况下不能信。这份表是你踩过的坑结晶出来的,而且它会越用越短,因为坑会被你一个个堵掉。

这三样的共同点是:它们不依赖任何一个模型、任何一段行情、任何一套策略继续有效。 换模型它们还在,行情变了它们还在,你换个市场它们大部分还能用。

自动交易那一侧的产出是什么?一条净值曲线。策略失效那天,曲线归零,你手上什么都没留下——更麻烦的是你连它当初为什么有效、现在为什么不行都说不清,因为那部分知识从来没进过你的脑子,它在参数里。而策略会失效这件事本身没有悬念,模型衰减 那篇讲得很清楚。

第四,投研这一侧,是模型真正的优势区。 它擅长的是处理已经存在的大量文字,不擅长的是生成还不存在的未来。让它去读一百份公告帮你挑出值得细看的五份,是顺着它的能力用;让它去判断明天涨跌然后自己按按钮,是逆着它的能力用。

所以更划算的路径其实是往回走一步:与其花三个月把一个能自动下单的东西做稳,不如花三个月把自己的研究流程固定下来。做投研,别让 AI 一个提示词问到底 那一节讲的分角色办法,一分钱工程都不用做,今天就能开始用,而且用坏了最大的损失是浪费一个下午。

决定权留在你手上这件事,不是因为技术还不成熟,将来就能交出去。它本来就不该交出去。 上面那些开源项目里最讲究的那几处设计——不可重试、失败朝安全倒、授权链可回溯、急停不依赖模型配合——全都是在反复确认同一件事:机器负责把材料准备好,人负责拍板。

小结

  • demo 和「能持续用」之间隔着五件不性感的事:数据持续可得且干净、故障能恢复、结果可审计、成本可控、人能随时接管。它们和模型聪不聪明毫无关系。
  • 持续运行时最危险的不是程序停了,是它在数据已经坏掉的情况下继续输出——模型不会因为拿到空表就闭嘴。
  • 崩在半路留下的是一条有开头没结尾的痕迹,它背后至少三种现实(没发出去/已受理但回执丢了/收到了没写下),在自己的记录里长得一模一样,所以恢复的第一动作是问券商,不是读存档接着跑。
  • 持续运行要靠心跳判活:进程按节拍写时间戳,外面只比时间戳、不理解它在干什么。而发现死亡之后的正确动作是只报告、不自动重启——对账没做完就拉起新进程,等于让一串「正常操作」全建在错误的前提上,比一次干净的宕机难查得多。
  • 可审计的判断标准只有一句:三个月后你能不能只靠留存的文件,把当时那个决定完整重建出来。重建不出来,那就不是资产。
  • 你个人这一侧要提前备好一条三秒内按得下去的路,把「停」按轻重排成三档(只停新动作/结束进程/去券商关权限),并且清楚停完还剩挂单、持仓、状态不明的中间结果、以及「为什么停」这四样没收拾。
  • 对个人投资者,AI 用在投研上性价比远高于用在自动交易上:失败代价小、工程负担小、成果能积累、而且正好落在模型的优势区。

一句话记住这篇:能做出一顿好菜,和能天天开门做生意,是两码事;而对绝大多数人来说,真正划算的是把菜谱练熟,不是急着开店。

本文所述机制均来自上述源码快照的阅读,是对代码与文档的说明,不是运行结果,也不构成任何工具推荐。本文不提供自动交易方案,不评价任何方法的盈利能力。回 量化与 AI 投研概念库 看各个概念在说什么;本站内容为投资教育,不构成任何投资建议。

内容有错、看不懂、或想看下一篇?告诉我们 →

本文为投资教育整理,不构成任何投资建议;不荐个股/基金、不预测点位、不承诺收益。关键数据与结论请结合权威来源自行验证,并见风险免责声明