从一句话到一张委托单,中间隔着多少步
- 把「让 AI 帮我交易」拆成七个必须真实发生的步骤,听到别人说这句话时能立刻追问「你说的是哪一步」
- 说清每一步各自的失效方式,知道哪几步的错会当场被发现、哪几步的错会一直藏着
- 理解为什么授权边界、额度上限、可中断、可审计这四件事必须做在代码结构里,而不是写在给模型的话里
你八成动过这个念头:要是能直接跟 AI 说一句「帮我把那只票买点」,剩下的它自己搞定,多省事。
这句话听起来是一件事。但只要你真的把它按发生顺序摊开,会发现它至少是七件事,而且这七件事分别可能出错,出错的方式还完全不一样。
这一节不教你怎么搭一个会下单的机器人——恰恰相反。读完你应该更清楚这条链子有多长、每一节有多脆,而不是更想去试。 至于「大模型做交易决策」这条路本身的范式与边界,让大模型直接做交易决策,这条路现在走到哪了 那篇已经讲透了,这里不重讲,只做一件事:把中间的步骤一节一节掰开。
生活层:帮我买杯咖啡,中间发生了什么
先把钱和市场都放一边。
你跟同事说:「下楼帮我带杯咖啡。」
这句话说完,你觉得事情就结束了。但在他那边,事情才刚开始,而且他必须自己补上你没说的所有东西:
哪家店?你没说。他得先确认楼下有几家、今天开没开门——这是取数。「咖啡」指什么?拿铁还是美式,热的冰的,大杯小杯——这是把一句模糊的话理解成一个具体的东西。他心里定下来「就买中杯热拿铁」——这是形成意图。到了柜台,他得把这个意图说成店员能录进系统的一句话:「中杯、热、拿铁、加一份糖浆」——这是转成明确指令。掏钱之前他会犹豫一下:你给他的钱够不够、你有没有说过不喝加糖的——这是校验。然后付款——这是执行。最后他把杯子递给你,你打开盖看一眼是不是拿铁——这是回报确认。
七步。买杯咖啡都要七步。
而这七步里,只有第六步是「真的发生了」的那一步,其余六步都是在为它做准备或者收尾。 如果第一步他记错了店,第三步他自作主张换成了冰的,第五步他没数够钱,最后你手里那杯东西照样是错的——但你只会在第七步才发现。
投资层:为什么这七步在投资里格外要命
买错咖啡的代价是二十块钱和一点不爽。买错票的代价是什么,取决于错在哪一步。
错在前面几步,钱还没动,但你不知道自己错了。 比如取数那一步拿到的是昨天的价、理解那一步认错了标的,链条会带着这个错误一路往下走,走到最后变成一笔真金白银的委托。这类错的可怕之处不是它错,是它看起来一切正常——每一步都规规矩矩执行了,只是第一块砖歪了。
错在中间那步,钱动了但动错了量。 你心里想的是「买点」,落到指令上变成了一个具体数字。这个数字是谁定的?如果没人明确规定,那就是那台机器替你定的。它定得保守你不知道,定得激进你也不知道——直到对账单出来。
错在后面几步,钱动了你却以为没动,或者反过来。 下单指令发出去了,网络断了;你没收到回报,于是又发了一次。市场上现在有两笔单子,你以为只有一笔。这一类错在人工交易里也存在,只是当链条里多了一台会自己决定要不要重试的程序之后,它出现的概率变了个量级。
所以「让 AI 帮我交易」这句话,真正该问的不是「它行不行」,而是:这七步分别由谁负责,谁在每一步之后核对过一遍。
机制层:一步一步拆
下面按发生顺序走一遍。为了不空谈,我会拿开源项目 Vibe-Trading 的实盘模块作参照——注意,我读的是它的代码和文档注释,讲的是它的设计思路,不是它的运行效果,更不是说照着做就能怎么样。 它之所以值得看,是因为它把这条链子上的每一道闸门都单独写成了文件,等于替我们把「有哪些坑」列了个清单。
第一步 · 取数:它默认是瞎的
先说一件反直觉的事:大语言模型(就是那种你打字它接话的 AI)本身不知道今天的价格。它的知识停在训练结束那一天,而且它意识不到这件事。你问它某个东西现在多少钱,它会给你一个数,语气笃定,那个数来自它的记忆。
所以任何一条真实的链路,第一步必须是从外部把真实数据取回来塞给它。这个动作在工程上叫工具调用——就是让 AI 不靠自己回忆,而是去调一个真实的接口把数据拿回来。这件事本身够单独讲一整节,本卷里讲「AI 怎么拿到实时行情和财报」的那一节是正主。
这一步的错法:取到的是延迟数据、取到的是复权口径不一致的数据、取到了但只取了一次而后面跑了很久。最隐蔽的一种是根本没取——模型在某一步偷懒直接用了记忆里的数,而它输出的格式跟真取了数一模一样,你看不出区别。
这就是为什么严肃的实现会加一条硬规则:输出里每一个具体数字都必须能指出来自哪一次工具调用,指不出来就必须删掉并注明未经核验。这条规则怎么落到具体的问法上,本卷里讲「怎么逼它把出处交出来」的那一节会展开。
第二步 · 理解:「那只票」到底是哪只
你说「那只票」,它得变成一个唯一确定的标的。
听起来是小事,实际是这条链上最容易出低级错误的一环。同一家公司在不同市场有不同代码;一个全大写的普通英文单词可能正好撞上某个真实上市产品的代码;同名同姓的公司不止一家。人在这一步靠常识兜底,程序没有常识。
这一步的错法:认错标的。而这个错在后面六步里没有任何一步会拦住它——因为后面所有的检查都是围绕「这笔单子合不合规」,没有一步是「你确定这是他想买的那个吗」。
第三步 · 形成意图:从一段话到一个决定
模型读完材料,得出一个倾向:偏多、偏空、还是不动。
这一步是整条链上唯一一处「思考」,也是唯一一处你没法验证的地方。前面取的数你能核对,后面的指令你能检查,但「它为什么觉得该买」这件事,事后你只能看到它当时写的理由,没法把这个理由再往下拆。传统量化在这个位置输出的是一个可排序的分数,分数能拿历史去验;语言推理输出的是一段话,话没法这么验。这两种输出形态的差别,是 从预测分数到持仓 和上面那篇范式篇反复在说的同一件事。
这一步的错法:说服力和正确性脱钩。它能把任何一个方向论证得头头是道,而它讲得越顺,你越容易放行。
第四步 · 转成明确指令:模糊的话必须变成有边有角的东西
这一步是整条链上最被低估的一步,也是最值得单独讲的一步。
「买点」不是指令。真正能被券商系统接受的东西,得把每一项都填死:买哪个标的、买还是卖、买多少钱还是买多少股、这是什么品种(股票、ETF、期权、外汇……)、在哪个市场。少填一项,或者填得含糊,这条指令就没法执行。
Vibe-Trading 里有一个结构专门干这件事,它把各家券商五花八门的下单参数统一映射成一个规范化的订单意图,字段就是上面这几项。而它的文档注释里有一句话我觉得应该刻在墙上:任何必需字段缺失、有歧义、或者校验不过,它就返回「没有」,从不猜。 返回「没有」的后果是这笔单子被直接拒掉。
为什么要写得这么绝?因为在这一步猜,是这条链上最危险的行为。它可以猜得很合理——你说「买点」,它猜五千块,听起来不离谱。但「合理的猜测」和「你的本意」之间那道缝,只有在钱出去之后你才看得见。
顺带说一句,这一步还得决定订单类型:是按当前市场价立刻成交,还是挂一个价等着。这两种选择在成本和成交确定性上是完全不同的取舍,展开见 订单类型。一台机器如果没被明确告知选哪种,它会替你选一种。
这一步的错法:单位错(把「五千块」执行成「五千股」)、方向错、品种识别错、订单类型被默认选择。这几种错的共同点是——它们全都是「合法的指令」,风控系统看不出异常,因为语法上完全正确。
第五步 · 风控校验:这才是真正的那道门
前四步都在准备,这一步是唯一一处「有权说不」的地方。
Vibe-Trading 把这道门做成一个独立的闸门模块,所有会改变账户状态的操作都必须从它过。读它的注释能看到,闸门上的检查是排好顺序、逐条过、任何一条不过就整笔拒绝的:
先看有没有一份有效的授权书,没有就拒;再看这份授权书过期没有,过期就拒并要求重新授权;然后看有没有人按下急停开关,按下了就拒、而且连券商接口都不碰;接着才是把指令解析出来,解析不出来就拒;最后才去读账户持仓和余额,逐条比对额度。
额度这一组也是排好顺序的:先看这个标的是不是在你允许的范围里、品种是不是在你允许的清单里,然后才是单笔金额上限、总持仓上限、杠杆倍数上限、当天笔数上限、账户资金上限。前两类叫结构性违规,直接拒;后面这类量的违规,走的是暂停并要求你重新确认的路。
我把这里的两个设计取向单独挑出来说,因为它们比任何具体数字都重要:
一是「不确定就拒绝」。 拿不到报价、解析不出字段、授权书读不出来——这些情况一律按拒绝处理,而不是按「先放行再说」。这跟人的直觉是反的:人遇到信息不全倾向于先做了再说,而这类系统被刻意设计成相反的方向。
二是所有额度都是你事先设定的,不是它自己算的。 单笔上限、总敞口、杠杆、每天多少笔——这些是一份写在外面的、启动时读一次、之后不再改动的契约。它写成不可变的结构,就是为了让那台机器连改的入口都找不到。
这一步的存在本身就是一条信息:做这类系统的人,默认前面四步会出错。 一道要写这么多条、每条都往「拒绝」倾斜的闸门,挡的不是偶然事故,是必然会发生的事。你如果打算把任何形式的自动执行接进自己的账户,先问自己:我这边的闸门在哪、它拦得住哪几类错、我怎么知道它今天还在工作。这些问题在 把下单权交给 AI 之前,先问自己这几个问题 里有一份更完整的清单。
第六步 · 下单:不能重试的那一步
闸门放行之后,指令才真正发出去。
这一步有个特别的性质:它不可以自动重试。 别的调用失败了重来一次没关系,下单失败了重来一次,可能就变成了两笔单。Vibe-Trading 里那个闸门被显式标成「不可重复执行」,就是这个道理。
还有一层更隐蔽的问题:怎么知道一个工具是「读」还是「写」?券商提供的接口名字五花八门,你不能靠名字猜。那个项目的做法是三层判定:先看接口自己声明的只读标记,再看维护者手工整理的名单,两边都对不上的一律当成「写」处理。它的注释里点破了关键——接口自己声明「我只读」是不可信的,一个撒谎的声明不能把一个已被人工标记为「写」的接口降级。 声明只能用来多抓几个漏网的写操作,不能用来给写操作开脱。
这个思路可以直接搬到你自己身上:别人说自己安全,不算数;只有你这边独立判定过的,才算数。
这一步的错法:重复下单、部分成交被当成全部成交、发出去了但回报丢了。
第七步 · 回报确认:事情还没完
单子发出去不等于成交,成交也不等于按你想的价格成交。
真实市场里,你看到的价和最后成交的价通常不是一个价——这个差额叫滑点,它和手续费一起构成了「想法」和「结果」之间那道恒定的损耗,展开见 滑点。一笔委托可能全部成交、部分成交、被撤、被拒。这些状态必须被回读、被对账,否则你手里的账本和券商手里的账本从这一刻起就开始分叉了。
Vibe-Trading 在这一层做的事是审计:每一次实盘动作——下单成功、被闸门拒掉、授权书生效、触发违规、急停被按下或解除——都往一个只追加不修改的账本里写一条记录,而且这个账本和普通的运行日志分开存放,因为它是那种「必须活得比日志久」的东西。它的注释里把这个账本的用途说得很直白:当有人问「把这个程序用真钱做过的所有事都给我看看」,答案就是这个文件。 每条记录还带着它当时依据的那份授权书和那次用户确认的引用,把每一笔单子一路追溯回「用户到底在什么时候点了哪个确认」。
写之前还有一道脱敏,把令牌、账号这类东西先抹掉再落盘。
这一步的错法:只看下单成功没成功,不看最终成交状态;不对账;或者对了账但没有留下任何可回溯的记录——等到你想搞清楚「上周三那笔到底是怎么发生的」,已经什么都查不到了。
一个必须单独说的东西:急停
上面第五步里提到的急停开关,我想单独拎出来,因为它体现的原则是这整篇里最重要的一条。
那个开关的实现方式是:在磁盘上放一个文件。文件存在,就是停。
为什么用这么原始的方式?读它的注释就明白了——这个开关必须在「模型不配合」的情况下依然有效。如果急停是靠告诉模型「收到这个信号就停下」,那么在模型陷入循环、上下文错乱、或者消息通道本身挂掉的时候,这个开关就失效了;而恰恰是这些时候你最需要它。放一个文件在那儿,闸门每次执行前先看一眼这个文件在不在,任何人、任何外部看门程序都能直接创建它,跟模型的状态完全无关。文件内容读不出来也照样算「停」——存在本身就是停的信号,里面写了什么只是用来记录是谁停的。
把这条抽象出来,就是这篇最该记住的一句话:
真正的边界必须做在代码结构上,不能做在给模型的话里。 你在提示词里写「不许自己下单」,那是一句建议,可以被后续文本影响、可以在状态混乱时失效。而把授权路径做成模型根本发现不了的东西、把额度做成启动时读一次的不可变契约、把急停做成一个跟模型无关的文件——这些是想犯错都找不到入口。
同一个项目里还有一处印证:写入授权这个动作被刻意做成不是一个工具——它不继承工具基类,因此工具清单里根本找不到它,模型的执行流程里也没有任何地方能引用它。唯一的写入路径要求一个由用户界面产生的确认凭证,而这个凭证模型永远造不出来。
数一数:链子有多长
回头数一遍。七步,每一步至少两三种错法,其中好几种是「语法完全正确的错」——就是那种系统看不出异常、只有你自己对着结果才能发现的错。
而且这七步之间是串联的:任何一步出错,后面的步骤会带着这个错误继续正常运转,直到最后一步才暴露。这跟并联完全不同——并联的系统里坏一个还有别的顶着,串联的系统里坏一个就全废。
更麻烦的是,链条一长,责任就模糊了。取数的模块说「我按接口给的数取的」,理解的环节说「我按取来的数判断的」,闸门说「我按规则放行的」,券商说「我按指令执行的」。每一环都尽到了自己的责任,合起来还是错的。这不是谁的失职,这是长链条系统的固有性质——而这恰恰是把决策链条自动化最该被警惕的地方。
关于 Agent 这个循环本身每一轮会怎么出错,Agent 循环:感知、决策、执行,每一步都会出错 那篇讲的是另一个切面,可以对照着看。
坑:把「跑通了一次」当成「可以用了」。 七步链条跑通一次,只证明这七步在那一次的那组输入下都没出错。它没有证明的东西包括:换个标的会不会认错、数据源延迟的时候会怎样、网络断在第六步会怎样、连着跑三十天之后额度还对不对得上。怎么避:把「跑通」和「可用」当成两个词,中间隔着的东西,本卷里讲「从一个跑得通的 demo 到真能用」的那一节专门在拆。
失效边界与常见误用
把七步当成一步说。 「AI 自动交易」这个词把七个环节压成了四个字,压缩过程中丢掉的全是风险信息。以后再听到这句话,你可以追问:你说的是哪一步?谁在校验?
只关心第三步,不关心其余六步。 大多数讨论都在争「模型判断准不准」,可真正出事的地方,历史上更多在取数、单位、重试、对账这些「不聪明」的环节。低级错误的杀伤力,从来不比高级错误小。
把闸门当成保险箱。 闸门只能挡它检查的那几类错。认错标的、方向弄反、订单类型选错——这些在闸门眼里都是合法指令。有闸门不等于安全,只等于挡住了列举出来的那些。
因为看懂了流程就想去搭一个。 这篇拆得越细,你越可能产生「原来也不复杂」的感觉。请注意这个感觉的来源:我拆的是已经被人做出来的成品的骨架,而不是做出它所需要的工程量、也不是它在真实市场里的表现。把下单权交出去这件事的取舍,跟看不看得懂流程图完全是两回事。
忘了这是教育内容。 本文所有对开源项目的描述都来自读代码与文档注释,不是运行结果,也不代表这些设计能带来任何收益或安全保证。本站不提供任何交易系统、不推荐任何标的、不评价任何做法的盈利能力。
小结
- 「让 AI 帮我交易」不是一件事,是七件事:取数、理解、形成意图、转成明确指令、风控校验、下单、回报确认。只有第六步真的动了钱,其余六步决定第六步动得对不对。
- 每一步的错法都不同,而最难防的是「语法正确的错」——认错标的、单位搞混、订单类型被默认选择,这些错在系统看来完全合法。
- 「转成明确指令」这一步的最高原则是不猜:字段缺失、有歧义、校验不过,就拒掉,而不是补一个看起来合理的值。
- 风控闸门的两个取向值得记住:不确定就拒绝,以及所有额度由你事先设定、程序改不动。
- 真正的边界必须在代码结构里,不能在给模型的话里。 急停做成一个跟模型无关的文件、授权做成模型发现不了的路径——想犯错都找不到入口,才叫边界。
- 事情不在下单那一刻结束:回报确认、对账、可追溯的审计记录,是把「我以为发生了什么」和「实际发生了什么」对齐的唯一办法。
- 串联的长链条有个固有性质:每一环都尽到了责任,合起来还是可能错,而且错误会被一路带到最后才暴露。
一句话总结:一句话交给别人去办,中间要补的空白比你说出口的内容多得多;而那些空白,全是钱可能溜走的地方。
回 量化与 AI 投研概念库 看各个概念分别在说什么。本站内容为投资教育,不构成任何投资建议,也不提供任何交易执行工具,完整边界见 免责声明。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- 开源 AI 投研智能体项目 Vibe-Trading 源码快照 3a752d5(2026-08-04 读取):agent/src/live/ 目录下的 order_guard.py、enforcement.py、classification.py、extractors/__init__.py、halt.py、audit.py、mandate/model.py,均为阅读代码与文档注释得出的机制说明,非运行结果 ↗
- 开源量化框架 freqtrade 源码快照 b3404c9(2026-08-18 读取):作为「订单从信号到交易所」这段常规链路的对照 ↗
- 开源量化平台 qlib 源码快照 79633dd(2026-07-23 读取):作为「分数到持仓」这段常规链路的对照 ↗