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讲交易」即可关注,每周更新交易教学
配套免费工具
交易规则卡片
把你的进场、止损、出场规则写成卡片,下单前过一遍,防止临盘改主意
打开就能用,不用注册也不用付费
配套复盘工具
交易复盘日记
道理看懂了,手还是不听话。把每一笔的理由和情绪记下来,一周之后你自己就能看出问题出在哪。
免费注册即可开始记录
推荐课程
合约陪跑实战训练营
不只教方法,更带你实盘执行。从仓位管理到止损止盈,手把手纠正你的交易习惯,建立可复制的盈利系统。
相关图解
一张图看完这件事,适合存下来随时翻
相关文章
交易系统是不是真的有效:六个硬指标和它们的及格线
赚钱不等于系统有效,亏钱也不等于系统无效,因为交易样本的噪声大得超出直觉。这篇给出六个必须算清楚的硬指标和各自的及格线:样本量是否达到统计要求、期望值的 t 值是否过 1.96、盈亏比对应的盈亏平衡胜率、最大回撤和水下时间、执行率、以及分环境后的表现是否稳定。每个指标都给了公式和一张对照表。
交易系统模拟盘转实盘的四个硬指标:样本量、执行率、期望值、最大回撤,每个都能算出来
模拟盘做到什么程度才算可以上实盘,凭感觉答不了。这篇给四个能算出数字的硬指标:样本量至少 100 笔(附统计推导,30 笔时胜率的标准误是 9.1 个百分点,100 笔降到 5.0)、计划执行率不低于 90%、期望值不低于 0.2R 且 t 值大于 2、最大回撤以 R 计不超过 20R。每个指标都给出计算方法、达标线和阈值是怎么定出来的,并说明三种典型的假达标。
交易系统怎么判断自己够不够格做全职交易:五条能从记录里算出来的验证标准
够不够格做全职交易,跟去年赚了多少没关系,跟你的记录能不能通过五项验证有关系:实盘样本量够不够撑起一个胜率结论、时间跨度有没有覆盖难做的行情、有没有在真金白银的回撤里扛住没改系统、执行率能不能到90%、以及净利是不是集中在少数几笔上。这篇给出五条的具体算法、及格线、以及不达标时对应的补课动作。
风险管理为什么我的胜率高但还是亏钱:一个公式定位问题,四种典型病症
胜率70%还在亏钱,问题一定出在期望值这个公式的另外三个变量上。这篇先用期望值公式定位你属于哪一种情况,再给出四种典型病症的具体表现和改法:赢小亏大、扛单摊平、手续费吃掉利润、以及重仓那笔恰好亏损。附一份可以直接算的自查表。
交易策略止盈设1:2还是1:3:按策略类型分三档,附盈亏比与保本胜率对照表
盈亏比不是挑一个自己喜欢的数字,是由你的实际胜率反推出来的。盈亏比1:2对应保本胜率33.3%,1:3对应25%,把往返成本算进去分别变成36.7%和27.5%。这篇给出完整对照表和反推公式,再按日内短线、波段、趋势跟踪分三档给出各自的取值区间和适用胜率,最后回答为什么强行把目标位从1:2拉到1:3往往会让期望值变差。
风险管理高赔率不等于高胜率:真正决定你赚不赚钱的是期望值
很多人以为找到一个高盈亏比的策略就稳赚,或者追求高胜率就能躺赢,结果两种人都长期不赚。真相是:单笔赔率再漂亮,不结合胜率算期望值,都是自欺欺人。这篇讲清楚盈亏比、胜率、期望值、赔率、风险回报比之间的真实关系,教你算出自己系统的期望值,找到适合自己性格的平衡点。
觉得有用?关注公众号
扫码或在微信里搜「Tom讲交易」,每周更新交易教学文章