Excel 统计交易的公式怎么写:可直接粘贴的十四条,含用滚动最大值算的真回撤
统计交易这件事,卡住绝大多数人的不是不会写公式,是表格的列位没定死,写一半发现要插一列,前面的公式全乱。所以这篇先把列位固定下来,再给公式。另外要先说一个网上流传最广的错误:最大回撤不能用最高权益减最低权益。只要最低点出现在最高点之前,这个算法算出来的数字会比真实回撤大一倍以上,文末的验算里有一个具体例子,真值 5%,错误算法给出 10.38%。
一、先把列位定死
新建一个工作表,第 1 行写表头,数据从第 2 行开始。下面所有公式都按数据填到第 201 行(也就是 200 笔)来写,笔数更多就把 201 改成更大的数字。
手工录入区(A 到 H 列):
| 列 | 表头 | 填什么 |
|---|---|---|
| A | 日期 | 平仓日期 |
| B | 品种 | 代码或名称 |
| C | 方向 | 多 或 空 |
| D | 开仓价 | 实际成交价 |
| E | 平仓价 | 实际成交价 |
| F | 数量 | 股数、手数或张数 |
| G | 盈亏金额 | 净额,已经扣掉手续费和税 |
| H | 计划风险金额 | 开仓时算的(开仓价 − 止损价)× 数量 |
G 列是整张表的地基,两个细节必须做对。
G 列填净额。 手续费、过户费、印花税全部先扣掉再填。A股印花税自 2023 年 8 月 28 日起按 0.05% 单边收取(卖出时收),此前是 0.1%。填毛利的人算出来的期望值一定是正的,因为交易成本刚好被藏在了小数点后面,而它恰恰是大部分人由盈转亏的那部分。
H 列是「计划的」风险,不是实际亏损。 它在开仓那一刻就确定了,之后不管止损有没有守住都不改。这一列的价值在下一节。
公式区(I 到 O 列),统计区(P 到 Q 列):
Q1 这个单元格填初始资金(比如 100000),P1 写上「初始资金」四个字做标签。Q1 必须先填,不填后面一半公式会报 #DIV/0!。
二、七条辅助列公式,写在第 2 行然后下拉
这一组每条都写在对应列的第 2 行,写完选中单元格,鼠标移到右下角小方块,双击或者往下拖到第 201 行。
I2(R 倍数):
=IFERROR(G2/H2,"")
算出来是这笔赚了或亏了几倍的计划风险。凡是这一列小于 −1 的行,都是止损没守住,是执行问题不是行情问题。 这是整张表里诊断价值最高的一列。
J2(累计权益):
=$Q$1+SUM($G$2:G2)
注意 $G$2:G2 这个写法,起点锚死、终点不锚,下拉之后会变成 $G$2:G3、$G$2:G4,这样才是累计。两个都锚死或者都不锚,结果就全错了。
K2(历史最高权益,滚动最大值):
=MAX($Q$1,$J$2:J2)
这条是全文最关键的一行。 它算的是「截至这一笔为止,权益曾经到过的最高点」,而不是整段历史的最高点。写法和上一条一样,起点锚死、终点跟着往下走。
公式里为什么要带上 $Q$1:如果第一笔就亏钱,权益从 100000 掉到 97000,此时曾经的最高点是 100000(开始交易之前的初始资金),不是 97000。漏掉 $Q$1 的话,第一笔亏损的回撤会被算成 0。
L2(回撤金额):
=K2-J2
M2(回撤比例):
=IFERROR(L2/K2,0)
M 列要设成百分比格式,否则显示成 0.05 而不是 5%。
N2 和 N3(连亏计数器):
第 2 行单独写一条,因为它上面是表头没法引用:
=IF(G2<0,1,0)
第 3 行写下面这条,然后从 N3 往下拉:
=IF(G3<0,N2+1,0)
这一列的含义是「截至这一笔,已经连亏了几笔」,赢一笔就归零。
O2 和 O3(连赢计数器): 同样的写法,把符号反过来。O2 填 =IF(G2>0,1,0),O3 填 =IF(G3>0,O2+1,0) 然后下拉。
关于空行:公式可以放心拖到第 201 行,没有记录的行不会污染统计。原因是空单元格在 SUM 里按 0 算,而 空<0 在 Excel 里判定为 FALSE,所以连亏计数器不会被空行往上加。唯一的副作用是权益列在空行上显示成初始资金,看着别扭但不影响任何统计值。
三、七条统计区公式
P 列写标签,Q 列放公式。
| 单元格 | 标签(写在 P 列) | 公式(写在 Q 列) | 算出来是什么 |
|---|---|---|---|
| Q3 | 交易笔数 | =COUNT(G2:G201) | 有记录的笔数 |
| Q4 | 盈利笔数 | =COUNTIF(G2:G201,">0") | 赚钱的笔数 |
| Q5 | 亏损笔数 | =COUNTIF(G2:G201,"<0") | 亏钱的笔数 |
| Q6 | 胜率 | =IFERROR(Q4/(Q4+Q5),0) | 设百分比格式 |
| Q7 | 平均盈利 | =IFERROR(AVERAGEIF(G2:G201,">0"),0) | 赚的那些笔平均赚多少 |
| Q8 | 平均亏损 | =IFERROR(ABS(AVERAGEIF(G2:G201,"<0")),0) | 取正数 |
| Q9 | 盈亏比 | =IFERROR(Q7/Q8,"") | 平均盈利是平均亏损的几倍 |
| Q10 | 期望值(元/笔) | =IFERROR(AVERAGE(G2:G201),0) | 每做一笔平均赚多少钱 |
| Q11 | 期望值验算 | =Q6*Q7-(1-Q6)*Q8 | 应该和 Q10 完全相等 |
| Q12 | 利润因子 | =IFERROR(SUMIF(G2:G201,">0")/ABS(SUMIF(G2:G201,"<0")),"") | 总盈利除以总亏损 |
| Q13 | 最大回撤金额 | =MAX(L2:L201) | 从峰值往下最多亏了多少钱 |
| Q14 | 最大回撤比例 | =MAX(M2:M201) | 设百分比格式 |
| Q15 | 最长连亏 | =MAX(N2:N201) | 历史上连亏最多几笔 |
| Q16 | 当前连亏 | =IFERROR(INDEX(N2:N201,COUNT(G2:G201)),0) | 眼下已经连亏几笔 |
Q6 的胜率分母用的是「盈利笔数加亏损笔数」,不是 COUNT(G2:G201)。区别在于打平的那些笔(盈亏正好为 0)被排除掉了。用 COUNT 做分母会把打平的笔算进分母却不算进分子,胜率被系统性地压低。
Q11 存在的意义是验算。期望值有两种算法,一种是直接对 G 列取平均,一种是用「胜率乘平均盈利减去败率乘平均亏损」。在没有打平交易的情况下,这两个数字必须完全相等。 如果 Q10 和 Q11 不一样,说明你有打平的笔,或者某一列的范围写错了。这是一条免费的自检。
Q16 的写法值得解释一下:COUNT(G2:G201) 数出你实际填了几笔,INDEX 取出连亏计数列里对应那一行的值。这样不管你填了 5 笔还是 150 笔,它永远指向最后一笔。
这些数字满 50 笔之前不要看。 20 笔算出来的胜率和盈亏比波动极大,本批统一口径是 50 笔为统计下限,样本量为什么是这个数,回测样本量要多少笔那篇有推导。

四、用五笔假数据验算一遍
光给公式不验算,等于把风险丢给读者。下面用 5 笔数据把每一条都算一遍。
初始资金 Q1 填 100000,每笔的计划风险 H 列都填 3000。
| 行 | G 盈亏 | I 倍数 | J 累计权益 | K 历史最高 | L 回撤金额 | M 回撤比例 | N 连亏 | O 连赢 |
|---|---|---|---|---|---|---|---|---|
| 2 | −3000 | −1.00 | 97000 | 100000 | 3000 | 3.00% | 1 | 0 |
| 3 | −2000 | −0.67 | 95000 | 100000 | 5000 | 5.00% | 2 | 0 |
| 4 | +6000 | 2.00 | 101000 | 101000 | 0 | 0.00% | 0 | 1 |
| 5 | +5000 | 1.67 | 106000 | 106000 | 0 | 0.00% | 0 | 2 |
| 6 | −4000 | −1.33 | 102000 | 106000 | 4000 | 3.77% | 1 | 0 |
逐格核对 K 列。K2 取 100000 和 97000 里的大者,得 100000。K3 取 100000、97000、95000 里的大者,还是 100000。K4 加进 101000,最大值变成 101000。K5 加进 106000,最大值变成 106000。K6 加进 102000,最大值仍是 106000。峰值只升不降,这就是「滚动最大值」四个字的含义。
统计区的结果:
| 项目 | 值 | 手算过程 |
|---|---|---|
| 交易笔数 | 5 | |
| 盈利 / 亏损笔数 | 2 / 3 | |
| 胜率 | 40% | 2 ÷ 5 |
| 平均盈利 | 5500 | (6000 + 5000) ÷ 2 |
| 平均亏损 | 3000 | (3000 + 2000 + 4000) ÷ 3 |
| 盈亏比 | 1.83 | 5500 ÷ 3000 |
| 期望值 | 400 元 | (−3000 − 2000 + 6000 + 5000 − 4000) ÷ 5 |
| 期望值验算 | 400 元 | 0.4 × 5500 − 0.6 × 3000 = 2200 − 1800 |
| 利润因子 | 1.22 | 11000 ÷ 9000 |
| 最大回撤金额 | 5000 元 | L 列的最大值,出现在第 3 行 |
| 最大回撤比例 | 5.00% | M 列的最大值,5000 ÷ 100000 |
| 最长连亏 | 2 笔 | N 列的最大值 |
| 当前连亏 | 1 笔 | N6 的值 |
| 期望 R | 0.13R | 400 ÷ 3000,也等于 I 列的平均值 |
两条验算都对上了:期望值的两种算法都是 400,期望 R 用「期望金额除以单笔风险」和「直接对 I 列取平均」也都是 0.1333。
现在看错误算法。 用最高权益减最低权益:106000 − 95000 = 11000,除以 106000 得 10.38%。真值是 5.00%。
差了一倍多,原因很清楚:最低点 95000 出现在第 3 笔,最高点 106000 出现在第 5 笔,最低点在最高点之前。你根本没有从 106000 跌到 95000 过,这段「回撤」是凭空拼出来的。滚动最大值的作用就是保证每个回撤都只和它之前的峰值比。
顺带看一眼 I 列:第 6 行是 −1.33R,说明这笔的止损被击穿了 33%,可能是跳空也可能是没按纪律砍。这一行会在复盘里被单独拎出来,收盘后复盘看哪七个数据里它是第四个数据。

五、旧版 Excel 和 WPS 的替代写法
本文十四条公式全部只用了 SUM、MAX、COUNT、COUNTIF、SUMIF、AVERAGEIF、ABS、IF、IFERROR、INDEX 这十个函数。这么克制是刻意的,下面这些函数一个都没用:
| 没用的函数 | 最低版本要求 | 用了会怎样 |
|---|---|---|
| MAXIFS / MINIFS | Excel 2019 或 M365 | Excel 2016 和较老的 WPS 报 #NAME? |
| FILTER / SORT / UNIQUE / SEQUENCE | Excel 2021 或 M365 | 旧版报 #NAME?,WPS 部分版本不支持 |
| LET / LAMBDA | 仅 M365 | 除 M365 外全部报 #NAME? |
| TEXTJOIN | Excel 2019 | 旧版报 #NAME? |
还需要替换的只有两个:
IFERROR 在 Excel 2003 里不存在。 把 =IFERROR(A,0) 改写成 =IF(ISERROR(A),0,A),代价是括号里的表达式要写两遍。
AVERAGEIF 在 Excel 2003 里不存在。 Q7 改成 =SUMIF(G2:G201,">0")/COUNTIF(G2:G201,">0"),Q8 改成 =ABS(SUMIF(G2:G201,"<0")/COUNTIF(G2:G201,"<0"))。
另外给一个「一个公式算最长连亏」的写法,供不想加辅助列的人用:
=MAX(FREQUENCY(IF(G2:G201<0,ROW(G2:G201)),IF(G2:G201>=0,ROW(G2:G201))))
这是数组公式,在 Excel 2019 及更早版本和多数 WPS 版本里,输入完必须按 Ctrl + Shift + Enter 而不是 Enter,否则结果是错的(而且不报错,这是它最危险的地方)。 按对了,编辑栏里公式两端会自动出现大括号。M365 和 Excel 2021 直接按 Enter 即可。用上面那五笔数据验证,这条公式返回 2,和辅助列的结果一致。
除非你有非去掉辅助列不可的理由,否则建议用 N 列的笨办法。辅助列的好处是出错时你能一行一行看出是哪笔算错了,一行式公式错了只能重写。
六、粘贴之后报错,先查这五样
| 现象 | 原因 | 怎么修 |
|---|---|---|
| #NAME? | 从网页复制时英文双引号被转成了中文引号 | 在编辑栏里把 " 手工重打一遍,这是最常见的一种 |
| #DIV/0! | Q1 初始资金没填,或者还没有任何亏损笔数 | 先填 Q1;亏损笔数为 0 时套 IFERROR 即可 |
| #VALUE! | G 列里混进了文本,比如填成了「+3000元」 | G 列只填纯数字,亏损用负号不用括号 |
| 显示 0.4 不是 40% | 单元格格式还是常规 | 选中 Q6、Q14、M 列,设成百分比 |
| 整列结果都一样 | $G$2:G2 的锚定写错了 | 检查是不是把终点也锚成了 $G$201 |
还有一个和版本无关的坑:部分系统区域设置下,函数的参数分隔符是分号而不是逗号。 如果你把 =COUNTIF(G2:G201,">0") 粘进去提示公式有误,试着把逗号换成分号。判断方法是随便点开一个自带函数看它用的是哪个符号。
写在最后
这张表算完之后,真正要看的只有三个数:期望值、最大回撤比例、最长连亏。
期望值告诉你这套方法值不值得继续做,最大回撤告诉你在它开始赚钱之前你要承受多少,最长连亏告诉你需要多强的心理准备。很多人只看胜率,而胜率是这三个数里信息量最低的一个,胜率 70% 照样能亏钱,原因在胜率很高为什么还是亏钱里。
表格搭好之后不要再改列位。你会想加列,忍住,加到 R 列往后去加。 一旦在中间插列,前面所有的绝对引用都会错位,而这种错位不报错,它只是安静地给你一个错的数字。
3秒免费测一下你的”管不住手指数”:journal.xtradingtime.com(记住 3316,就能找到我们)
本文内容仅供教育和参考用途,不构成任何投资建议。公式在 Excel 2016 及以上和 WPS 个人版环境下验证通过,旧版请按第五节替换。交易有风险,入市须谨慎。
在微信里搜「Tom讲交易」即可关注,每周更新交易教学
配套免费工具
交易规则卡片
把你的进场、止损、出场规则写成卡片,下单前过一遍,防止临盘改主意
打开就能用,不用注册也不用付费
配套复盘工具
交易复盘日记
道理看懂了,手还是不听话。把每一笔的理由和情绪记下来,一周之后你自己就能看出问题出在哪。
免费注册即可开始记录
推荐课程
合约陪跑实战训练营
不只教方法,更带你实盘执行。从仓位管理到止损止盈,手把手纠正你的交易习惯,建立可复制的盈利系统。
相关文章
Excel 做资金曲线:四步公式链,以及中途入金会把回撤算小多少
资金曲线的公式链只有四步:逐笔盈亏、累计权益、滚动峰值、回撤,其中最大回撤必须用滚动最大值算,用最高权益减最低权益会把回撤算大好几倍。但只做到这一步还不够:中途入金出金会人为抬高峰值,让后面的回撤被系统性低估。这篇给出四步公式链、画曲线和水下图的设置、单位净值法的六列公式,以及一份六笔数据的完整验算,三种算法算出 15.42%、13.59%、54.82% 三个数。
交易系统期望值怎么算:三步公式加一次成本修正,算出你每笔平均赚多少
期望值不是一个玄学指标,它是一个三步就能算完的算术题:把每笔盈亏换成 R 倍数、代进公式、再扣掉成本。多数人只做了前两步,于是算出来的数字偏高,止损越紧偏得越多。这篇给出完整算法、六档止损幅度下的成本侵蚀表、从 R 换算成人民币的对照表,以及四个会让期望值算虚的统计错误。A股往返成本按 0.102% 计入。
交易系统券商交割单导出到能用,中间有五步:字段对照表和三类必须自己补的数据
交割单导出来只是流水,不是交易记录。它按成交笔数记账,一笔分三次成交就是三行;它没有开仓平仓的配对关系,也没有你当初打算止损在哪。这篇给出导出时的三条限制、一张交割单字段对照表、手续费列怎么拆成佣金印花税过户费、用先进先出把流水配成交易的方法,以及导入统计表之前必须剔除的六类非交易行。
交易系统交易记录用什么工具:三类工具的能力边界,加五个选型维度
Excel、Notion、专用 APP 这三类工具不是替代关系,是能力边界不同。表格类算得动但导不进来,笔记数据库类字段灵活但统计要绕路,专用工具统计现成但数据主权不在你手上。这篇给出三类工具的能力边界对照、五个和你自己有关的选型维度(结构化程度、导入能力、统计能力、可迁出性、记一笔的摩擦成本),以及该换工具的三个信号和不该换的三种情形。
交易系统胜率 40% 算不算差:配 1:2 盈亏比的期望是 +0.2R,一张矩阵直接查
胜率 40% 听起来像是十次里输六次,于是很多人把它当成系统不行的证据。但期望值只由胜率和盈亏比两个数共同决定,40% 配 1:2 的期望是每笔 +0.2R,是一套明确能赚钱的系统。这篇给出五档盈亏比乘七档胜率的完整期望值矩阵、每档盈亏比对应的保本胜率、以及交易成本会吃掉多少期望的换算表,最后说明这张矩阵在什么条件下不能用。
交易系统模拟盘转实盘的四个硬指标:样本量、执行率、期望值、最大回撤,每个都能算出来
模拟盘做到什么程度才算可以上实盘,凭感觉答不了。这篇给四个能算出数字的硬指标:样本量至少 100 笔(附统计推导,30 笔时胜率的标准误是 9.1 个百分点,100 笔降到 5.0)、计划执行率不低于 90%、期望值不低于 0.2R 且 t 值大于 2、最大回撤以 R 计不超过 20R。每个指标都给出计算方法、达标线和阈值是怎么定出来的,并说明三种典型的假达标。
觉得有用?关注公众号
扫码或在微信里搜「Tom讲交易」,每周更新交易教学文章