你的交易流水里藏着一份体检报告
- 说得出一份普通对账单在配对成「完整回合」之后,能产出哪五类可核对的数字
- 拿到自己的持仓时长、胜率盈亏比、交易频率、下单时点时,知道该看分布而不是看平均
- 说得清这份自查报告天生有哪三处测不到的地方,尤其是「还没卖掉的那些根本不进成绩单」
年底想给自己做个总结,你去券商 App 里把交割单导出来。文件打开,几百行,每行长这样:日期时间、代码、买还是卖、多少股、什么价、扣了多少费。
然后你就卡在这儿了。
你盯着它看了十分钟,唯一能读出来的信息是「今年亏了一万二」——这个数其实不用导出来也知道,App 首页就写着。剩下那几百行,你翻着翻着开始走神,最后关掉文件,得出一个每年都会得出的结论:明年管住手。
问题不在你不够认真。问题在于这份文件是以「流水」的形式存在的,不是以「结论」的形式存在的。你的账户只给了你一个总分,没告诉你哪一科丢的分、丢分是因为不会做还是因为写错了名字。而那几百行里其实已经藏着答案——它需要的不是你更用力地看,而是先被整理成另一种形状。
这一篇讲的就是这件事:一份普通得不能再普通的对账单,整理之后到底能算出哪几类东西,以及每一个数字各自能暴露你的什么习惯。算法本身不是重点(每个指标的算法在概念库里都有专篇),重点是拿到这个数之后你该怎么读它。
先过一道工序:流水不等于交易
先打个比方
你想知道自己上个月在外面吃饭花了多少、平均一顿多少钱。你手上是一沓小票。
但小票和「一顿饭」不是一回事。一顿饭可能开了三张票:主食一张、饮料一张、后来加的一份甜品一张。你要是直接按小票数量除一除,会得出「平均每顿 28 块」这种毫无意义的结论——因为你数的根本不是「顿」,是「张」。
得先把属于同一顿饭的小票捆在一起,才谈得上算平均。
这对你的判断意味着什么
对账单记录的是成交,不是交易。
你分三次建的仓,是三行;中途减了一次,又是一行;最后清仓,还是一行。五行流水,实际上是同一个决策过程。反过来,你在同一只票上来来回回做了七八次,这些行混在一起,从外表看和「长期持有」没有任何区别。
所以任何有意义的自我诊断,第一步都不是算,而是配对:把买的和卖的按规则捆成一个个「完整回合」——一次买入、一次对应的卖出、中间隔了多久、这一趟净赚净亏多少。
配对之后你才第一次拥有「一笔交易」这个单位。在此之前,你手上只有碎片。
这一步还顺手做了一件事:它把「你以为的交易次数」变成了「实际的回合数」。很多人第一次看到这两个数并排放着会愣一下——三百多行流水,配出来一百出头个回合,意味着平均每个回合你按了将近三次按钮。这个比值本身就是一个信息:你不是在交易,你是在反复微调。
它在系统里长什么样
有个开源项目叫 Vibe-Trading,它里面有一个专门处理这件事的模块。我读了它的源码快照,配对用的是先进先出:同一个代码底下,买入的每一批排成一个队列;来一笔卖出,就从队头最早的那批开始抵扣,抵扣多少就生成一个回合,不够再往后取下一批。
每个配出来的回合,记录的字段很朴素:代码、买入时间、卖出时间、数量、买价、卖价、持有天数、这一趟净盈亏、盈亏百分比。
有两个细节值得你留意,因为它们直接决定了后面所有数字的性质。
第一,手续费是按比例摊到每个回合里的。你一次买入一千股、分两次各卖五百股,那笔买入的手续费会按数量比例劈成两半,分别算进两个回合。也就是说,这份报告里的盈亏是扣完费的净数。这一点比你想象的重要:回测报告里的费率往往是交易场所的最低那一档,而你的对账单里那一列,是你真金白银付出去的、属于你自己那一档的价格。关于这笔钱怎么把一条向上的曲线压平,手续费与印花税 讲得更细。
第二,没配上对的,直接被丢掉。你手上还扛着没卖的那些仓位,一个都不进这份成绩单。这条我放到文章后半段专门讲,因为它是这份体检报告最大的一处失真。
能算出来的第一类:持仓时长的分布
先打个比方
一个班的平均身高是一米六五。这句话听起来挺有用,直到你走进教室,发现这个班一半是篮球队、一半是体操队。
平均值把两群完全不同的人揉成了一个不存在的人。班里没有任何一个学生是一米六五。
这对你的判断意味着什么
「平均持仓 3.2 天」是所有自查报告里最容易被误读的一个数。
它听上去像一句自我描述:我是个做短线的。但你把每个回合的持有天数画成一张分布图(横轴是天数,纵轴是有多少个回合落在这个天数上),常见的结果是——它根本不是一个山包,而是两个甚至三个。
一堆挤在「当天进当天出」和「一两天」附近,另一堆散在「两三周」,中间空着一大片。
这两堆不是同一个人做的。挤在最左边的那些,多半是看到某个消息或某根 K 线临时起意的单;散在右边的那些,才是你原本计划里的持仓。它们的动机不同、依据不同、结果通常也不同。
分布形状告诉你的是「你其实有几套打法」,而平均值把这个信息彻底抹掉了。 一个人以为自己在执行一套策略,实际上在同一个账户里并行跑着两三套互不相干的打法,而且从没分开算过账——这是自查里最常见、也最容易一眼看破的情况。
拿到这张图,你该问自己的第一个问题不是「我持仓太短还是太长」,而是:这几堆,各自是怎么来的? 把它们分开算盈亏,往往会看到一堆在赚、另一堆在稳定地送钱。
顺带说一句,如果你发现右边那一堆里,有相当一部分回合的持有天数明显长得离谱——先别急着下结论。「亏了就死扛」这件事有专门的量法,交给 赚一点就跑、亏了死扛:给这些习惯量个尺寸,本篇只负责告诉你这个分布能算得出来。
它在系统里长什么样
那份源码里,持有天数是用卖出时间减买入时间、换算成天数并保留两位小数算的——所以它是连续的,日内进出会得到零点几天这样的小数,而不是粗暴地按自然日取整。
配出来的回合,除了一个平均持仓天数,还会附带一小段样本,把最早几个回合的代码、买卖时点、盈亏、持有天数原样列出来。这个设计我觉得挺讲究:它默认你会想看原始行,而不是只看汇总数。 一份只给你汇总数、不让你抽查明细的报告,本身就该被警惕。
能算出来的第二类:胜率和盈亏比,只能成对读
先打个比方
有两个学生。
甲每次考试都及格,从没挂过科,但也从没上过 70 分。 乙十次里挂三次,剩下七次里有两次接近满分。
问:谁的成绩更好?
只看「及格率」,甲完胜。只看「最高分」,乙完胜。这两个数单独拿出来,谁都不能回答这个问题。 你必须把「多久对一次」和「对一次值多少」放在一起看,才知道到底谁在往前走。
这对你的判断意味着什么
配对之后,两个数会同时出现:
胜率——赚钱的回合占全部回合的比例。 盈亏比——赚钱那些回合的平均盈利,除以亏钱那些回合的平均亏损(取绝对值)。
这两个数必须一起读,单独看任何一个都会得出反过来的结论。
- 胜率七成、盈亏比 0.4:你十次里对七次,但每次对了赚一点,错了亏一大截。这是典型的「赚一点就跑」留下的指纹。
- 胜率三成、盈亏比 3.0:你十次里错七次,心理上难受得要命,账户却在往上走。
真正决定你账户方向的不是这两个数中的任何一个,而是它们的乘积效应。 一个只盯着胜率的人,会不自觉地把系统调向「多赢小钱、少输大钱」的反面——因为提高胜率最简单的办法就是赚一点马上跑,而这恰好把盈亏比拆了。
这也解释了一个很常见的困惑:为什么有人明明「感觉最近手气不错,做十次对七八次」,账户却在缩水?因为手感的来源是胜率,而账户的来源是胜率和盈亏比一起。你的身体只能感受到前者。
所以看到这两个数的时候,正确的读法是:
- 先看盈亏比是不是明显小于 1。如果是,那么无论胜率多高,你的系统都在「用很多次小赢供养少数几次大亏」,这个结构本身是脆的——只要来一段行情让你的胜率掉下去,账户会掉得比你预期快得多。
- 再看胜率。低胜率不是问题,低胜率配低盈亏比才是问题。
- 最后看两个数在不同持仓时长的分组里是不是同一副样子。上一节说的那两三堆打法,很可能各自有完全不同的胜率盈亏比组合。
第 3 点是最值钱的一步,也是绝大多数人不会做的一步。总体的胜率盈亏比,是把你所有打法的账混在一起算出来的一个平均人。 拆开看,你常常会发现整个账户的亏损集中来自其中一堆,而另一堆其实一直在稳定地赚小钱。
它在系统里长什么样
源码里的算法很直白:把回合按净盈亏分成大于零和小于零两组,前者的数量除以总回合数得胜率;前者的平均盈亏除以后者平均盈亏的绝对值,得盈亏比。
有个边界处理我特意看了一眼——如果一个亏损回合都没有,盈亏比会被置成无穷大。这不是 bug,是它在诚实地告诉你:这个数在这份样本上没有意义。 一份跑了两个月、全是赢单的对账单,算出来的盈亏比是个漂亮的无穷大,而它唯一能说明的事情是:你的样本还没见过坏天气。
它还给了一句挺硬的提示:如果胜率低于某个水平、同时盈亏比也小于 1,那么这两头都在输——这种情况下要做的不是调参数,是先停下来。至于具体的分界线,各家系统给的不一样,也会随版本改,以你手上那份工具的口径为准;重要的是「两头都在输」这个组合本身。
能算出来的第三类:交易频率不是一个数,是一条线
先打个比方
一个人一年喝了 52 次酒,平均一周一次,听起来很节制。
把日期摊开看,其中 40 次挤在三个月里。那三个月里发生了什么,才是这份记录真正想说的事。
这对你的判断意味着什么
「平均每周交易 4.1 次」这种数,和平均持仓天数一样,是个把信息压扁的数。
真正有用的做法是把时间切片:按月,或者按周,数一数每一段里你按了多少次按钮,画成一条线。然后——这一步是关键——把这条线和同期的行情走势并排放。
你大概率会看到三种形状之一:
第一种,频率跟着涨。 行情热的时候你交易多,冷的时候你几乎不动。这看起来很自然,但它意味着你的仓位暴露和市场情绪是同向的:市场最贵、最挤的时候,你参与得最多。
第二种,频率跟着亏损涨。 一段回撤之后紧跟着一段密集交易。这条线的形状会让你很不舒服,因为它把「想赶紧扳回来」这个念头画成了一张图。
第三种,频率基本是平的。 无论行情怎么样,你每个月按按钮的次数差不多。这通常说明你真的在执行某种事先定好的节奏,而不是在对行情做应激反应。
频率这条线的价值不在数值高低,在它和什么东西同步。 高频率本身不是罪——一个真做短线的人频率当然高。有问题的是频率不受自己控制:它由行情的冷热和你账户的浮亏来驱动,那就说明按按钮的不是你的策略,是你的情绪。
至于「交易多的那些日子,赚得是不是更少」——这是另一个专门的量法,属于行为偏差那一篇的活,本篇不越界。这里只讲一件事:频率是可以随时间切开看的,而且必须切开看。
顺便一提,如果你切完发现自己的频率明显偏高,调仓频率:多久换一次仓 值得读一遍——换手这个旋钮同时压着交易成本、容量和信号新鲜度三件事,往哪边拧都要还债。
它在系统里长什么样
那份工具里,总体频率的算法是:总成交笔数除以首末两笔之间的天数,再乘七,得到每周多少次。注意分母是日历天数,不是交易日——所以这个数天生偏保守一点,读的时候心里有个数就行。
更有意思的是它提供了一个筛选参数:你可以只算某个日期区间,也可以只算某个市场。这意味着切片不是我发明的读法,是工具本身就预期你会这么用——先看全景,再挑出你想看的那几个月单独重算一遍。一份好的自查工具,应该允许你反复追问,而不是甩给你一张定稿的成绩单。
能算出来的第四类:你在什么时候按下按钮
先打个比方
有人减肥失败,把一整个月吃的东西全记下来,逐条看也看不出毛病——三餐都挺正常。
直到把记录按时间点摊开,才发现问题全在晚上十点之后。
同样的东西,在不同的时刻吃下去,说明的事情完全不同。 时点本身就是信息。
这对你的判断意味着什么
对账单里每一行都带着精确到分钟的时间戳,而这一列几乎从来没人用。
把所有成交按小时分桶数一数,你会得到一张下单时段分布图。这张图能暴露两类习惯:
第一类:开盘那一格是不是特别高。 开盘前后是一天里情绪最满、价格跳得最凶的一段。如果你的成交大量集中在这里,那么你的很多决策实际上是在信息最乱、你却最兴奋的时候做出的。这不必然是坏事——有些打法就吃这一段——但它必须是你有意选的,而不是「我每天就这个点有空看盘」。
第二类:尾盘那一格是不是特别高。 尾盘集中下单常常对应两种完全相反的心态:一种是纪律(等一天走完再动手),一种是拖延(憋了一天,收盘前不做点什么难受)。这两种你自己心里清楚是哪种。
还有一个更细的读法,需要用到配对之后的结果:在一次持仓的生命周期里,你的加仓和减仓分别落在什么位置。
先进先出配对有个副作用——它会把「分批建仓、分批卖出」拆成好几个回合。乍看有点别扭,但正是这个拆法让你能看清一件事:你后来补的那几批,买价比第一批高还是低?如果你的加仓几乎总是发生在价格已经往上走了一段之后,那你的「加仓」本质上是追买;如果几乎总是发生在浮亏之后,那是补仓摊成本。这两件事在流水里长得几乎一样,但它们背后是两种完全不同的判断,也会导向完全不同的风险。认出是后者之后,别停在「我摊低了成本」这一句上,把那几笔的价格和数量丢进 补仓成本与风险测算,看看代价那一栏被记在了哪里。
同一个动作,落在持仓生命周期的不同位置上,含义是相反的。 而这个位置,只有配对之后才看得出来。
它在系统里长什么样
时段分布在那份源码里就是一行:把成交时间取小时,做个计数,按小时排好序输出。简单到有点朴素,但它出现在返回结果的默认字段里——说明作者认为这是一个该被默认看到的东西。
至于加减仓的位置,源码里没有一个现成的字段直接给你,但它给了原料:每个回合都带着自己的买价、买入时间和所属代码。同一个代码底下把这些回合按买入时间排一排,买价的高低走向就出来了。
这里有个我很欣赏的设计取向:在那份项目的策略提炼模块里,作者把特征明确分成两类——一类只靠对账单自己就能算,另一类需要去拉行情数据。持有天数、盈亏百分比、下单小时、星期几,属于前者;入场时的技术指标状态、买入前几天的涨跌幅,属于后者。而代码注释里写得很清楚:后者拉不到就退化成缺失值,直接从特征里丢掉,前者永远可用、离线也能跑。
这个分界对你有直接的实用价值:先把「只靠对账单就能算」的那一层榨干,再考虑要不要去接行情数据。 前者不需要任何外部依赖、不会因为数据源不可用而失真,而且它诊断的恰恰是你自己的行为——这正是自查最该先看的部分。
能算出来的第五类:把你自己的成绩单画成一条曲线
先打个比方
体检报告上最有用的往往不是某一次的血压值,是那张把历次数值连起来的折线图。
单点告诉你「现在是多少」,折线告诉你「往哪个方向走、什么时候拐的弯」。
这对你的判断意味着什么
把所有回合按平仓时间排好,把每个回合的净盈亏一路累加,你就得到了一条属于你自己的曲线。
这条曲线和你在各种策略报告里见到的净值曲线长得很像,但它有一个决定性的不同:它是你真的做过的事,不是模拟出来的。 没有滑点假设、没有费率档位争议、没有成交与否的猜测——每一个点都对应着你账户里一笔真实的钱。
这条曲线上有三样东西值得看:
斜率变没变。 如果前半段一路向上、后半段横着走,那多半不是运气,是你的打法遇到了不适合它的行情,或者你自己变了。
最深的那个坑有多深。 从曲线的历史最高点往下量到后面的最低点,就是你自己的最大回撤。注意这个数和你「记忆里的难受程度」经常对不上——人对亏损的记忆会自动打折。看到真实数字的那一刻,很多人的第一反应是「有这么多吗」。这个数怎么算、为什么它比波动率更贴近真实痛感,最大回撤:从数字到体感 有完整拆解,也可以用 回撤计算器 自己试着量一量。
有没有不该出现的台阶。 曲线上一根突然的垂直跳,通常对应一笔体量远超其它的交易。找出它,问一句:那一笔为什么下得比平时重?如果答不上来,那就是一次仓位失控,而不是一次好运气或坏运气。至于一条曲线还该按什么顺序看,怎么看一条收益曲线 给了一套更系统的读法。
它在系统里长什么样
源码里的做法是:把回合按卖出时间排序,对净盈亏做累计求和,再取一路上的历史最高值,两者相减取最小,得到最大回撤。
这里必须点出一个非常重要的口径问题,它决定了你该怎么理解这个数:这条曲线是按「回合平仓时点」串起来的已实现盈亏,不是按日的账户净值。
差别在哪?举个例子。你在一只票上浮亏了 30%,扛了半年没卖。这半年里,你的账户市值实实在在地掉过一大块,但在这条曲线上——什么都没发生。因为没有平仓,就没有回合,就没有一个点被记进去。
所以这条曲线画出来的坑,通常比你实际经历过的浅。它量的是「你认过的亏」,不是「你承受过的亏」。
这份体检报告测不到什么
到这儿五类数字都齐了。但一份自查报告最该讲清楚的,恰恰是它的边界。三处,按严重程度排。
第一处,也是最严重的:没卖掉的,一个都不算。
配对规则决定了只有完整的一买一卖才生成回合,手上还扛着的仓位被直接跳过。
这条为什么严重?因为它不是随机丢样本,是系统性地丢掉某一类样本。人最不愿意卖的是哪些?是亏得最多、最不想面对的那些。于是这份报告天然把你最难看的那部分排除在外,算出来的胜率偏高、总盈亏偏好看、曲线偏平滑。
你必须默认这份体检报告是偏乐观的,并且每次看它之前先问自己一句:我现在手上扛着的那些,如果今天全部按市价了结,会在这份报告里加上多难看的一笔?
第二处:它只描述过去,不预测任何东西。
这份报告里的每一个数字,都是对一段已经发生的历史的统计。它能告诉你「你过去是这么干的」,不能告诉你「你这么干下去会怎样」,更不能告诉你「换个干法会怎样」。
「如果当初我真的止损了会怎样」是一个完全不同的问题——它需要引入没有发生过的假设,也就要背上假设带来的一整套失真。那是 如果当初真的止损了,现在会怎样 的活,那一篇会讲清楚为什么那种推演比这一篇的统计脆弱得多。
第三处:样本不够的时候,这些数字统统不作数。
十个回合算出来的胜率,和三百个回合算出来的胜率,是两种完全不同性质的东西。前者更像掷硬币的结果,后者才勉强算一个描述。
关于这一点,那份项目里有个我很喜欢的处理。它的策略提炼模块在盈利回合数少于某个门槛时,不是给你一个不太准的结果,而是直接报错拒绝往下跑。快照里那个门槛是个很小的数(具体值以你手上的版本为准),但设成多少不是重点,重点是它写在设计红线里的那句话:样本不足必须报错,不编造。
一个愿意在数据不够时说「我算不了」的系统,比一个永远能给出答案的系统可信得多。 这条标准你也可以用来衡量任何一份递到你面前的报告。
收口:这份体检报告接下来怎么用
把五类数字排在一起,你会发现它们回答的是五个不同层面的问题:
| 算出来的东西 | 它回答的问题 | 它可能暴露的习惯 |
|---|---|---|
| 持仓时长分布 | 我是一个什么节奏的人 | 同一个账户里并行跑着几套互不相干的打法 |
| 胜率与盈亏比 | 我靠什么在赚钱 | 用很多次小赢供养少数几次大亏 |
| 频率的时间切片 | 我什么时候变得活跃 | 按按钮的不是策略,是行情冷热和浮亏 |
| 下单时段与加减仓位置 | 我在什么时刻做决定 | 追买和补仓被混为一谈 |
| 累计盈亏曲线 | 我的钱是怎么走过来的 | 某一笔仓位远重于其它笔 |
它们全都只有一个共同前提:先把流水配成回合。在此之前,这五个问题一个也问不出来。
配对这道工序不用自己写脚本,站内的交易记录行为诊断就是照先进先出这套规则做的——把导出的流水原样粘进去,回合数、胜率与盈亏比、持仓时长分布会一次性列出来,还附带处置效应比值、交易集中度这几项行为画像;解析和计算都在你自己的浏览器里跑,流水不上传。
这一篇到此为止,只做了一件事——把「能算出什么」这层地基铺平。数字有了,接下来还有三步:一步是把这些数字翻译成具体的行为偏差并量出尺寸,一步是推演「如果当初换个做法」,最后一步是把结论变成一条你真能执行的规矩。它们分别是这一章后面三篇:给这些习惯量个尺寸、如果当初真的止损了、从诊断到一条真能执行的规矩。
顺带一句:这一章讲的是拿量化技术照自己,和上一章讲的回测好看实盘亏,差的到底是哪三件事正好是一对——那一章讲的是模拟出来的数字为什么会骗人,这一章讲的是你自己的真实数字能说出什么。真实数字的好处是它不需要任何假设,坏处是它只有一份、而且回不到过去。
本节讲的是如何用统计方法整理你自己的历史交易记录,全部内容是对过去的描述性统计,不构成任何投资建议、买卖信号或收益承诺。这些数字算得再干净,也不能预测你未来的表现——样本小的时候尤其不稳,几十个回合算出来的胜率可能纯属偶然。另外请注意:任何要求你上传完整对账单的第三方工具,都涉及你的持仓与资金信息,交出去之前先把对方的数据归属与用途条款看清楚。完整风险提示见 免责声明。
小结
- 对账单记录的是成交不是交易,任何自查的第一步都是把买卖配成「完整回合」,在此之前你手上只有碎片。
- 持仓时长要看分布不看平均——分布常常不是一个山包而是两三堆,那说明你同一个账户里并行跑着几套打法,从没分开算过账。
- 胜率和盈亏比只能成对读。手感来自胜率,账户来自两者一起;盈亏比明显小于 1 时,胜率再高这个结构也是脆的。
- 交易频率要按时间切开,看它和什么同步:跟着行情热度涨、跟着浮亏涨,还是基本不动。频率不受自己控制,说明按按钮的不是策略。
- 下单时段和加减仓的位置能暴露「你在什么时刻做决定」;先进先出配对的副作用,恰好让你看清后面几批是追买还是补仓。
- 把回合按平仓时间累计成曲线,能量出你自己的最大回撤——但要记住它按已实现盈亏串起来,浮亏不进曲线,坑比你实际经历的浅。
- 这份报告有三处天生测不到:没卖掉的不算数(所以它偏乐观)、只描述过去不预测未来、样本不够时数字统统不作数。
一句话说完这篇:你账户里那几百行流水,不是一堆废纸,也不是一份成绩单——它是一份体检报告,只是需要有人先把它按项目分好类,你才读得懂上面写的是你哪儿出了毛病。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- Vibe-Trading 源码快照 3a752d5(2026-08-04 读取):agent/src/tools/trade_journal_tool.py 的 pair_trades_fifo 与 _compute_profile ↗
- Vibe-Trading 源码快照 3a752d5:agent/src/skills/trade-journal/SKILL.md(支持的对账单格式与 profile 返回字段) ↗
- Vibe-Trading 源码快照 3a752d5:agent/src/skills/shadow-account/SKILL.md(样本不足必报错的红线) ↗
- Vibe-Trading 源码快照 3a752d5:agent/src/shadow_account/extractor.py(最少盈利回合数门槛与不依赖行情的特征清单) ↗