量化交易 XtradingTime

用 Excel 做最简回测:十二列公式跑通一套系统,以及它做不到的三件事

用 Excel 做最简回测:十二列公式跑通一套系统,以及它做不到的三件事
本文目录(7 节)

不会写代码能不能做回测,答案是能,而且 Excel 做出来的第一版回测往往比直接上工具更有价值,因为你会被迫把每一条规则写成公式,模糊的地方立刻暴露。这篇给一个十二列的完整框架,公式可以直接粘贴,全程不用宏,也没有循环引用。先说边界:这个框架能回答「这套规则历史上产生了什么样的 R 倍数序列」,回答不了「实盘能不能复现」。

一、先把列位定下来

新建一张工作表,第 1 行写表头,行情数据从第 2 行开始,按时间从早到晚排序(最早的一天在最上面,这一点搞反会让所有回溯公式失效)。

内容来源
A日期行情数据
B开盘价行情数据
C最高价行情数据
D最低价行情数据
E收盘价行情数据
F20 日均线公式
G入场信号公式
H持仓状态(0 或 1)公式
I当前持仓的入场价公式
J出场价公式
K本笔 R 倍数公式
L累计 R公式

行情数据从哪来:看盘软件都支持导出历史 K 线,或者用Python 获取 A 股历史数据那篇里的接口拉下来存成 CSV。复权方式要固定,全程用同一种,中途换会让均线位置和突破幅度全部对不上。

回测的这套规则是:收盘价上穿 20 日均线,次日开盘入场;跌破入场价的 5% 止损,或者收盘跌回均线下方就平仓。

二、逐条公式

F 列,20 日均线。 F21 写这条,然后往下拉到最后一行:

=AVERAGE(E2:E21)

前 20 行(第 2 到第 21 行)是预热区,均线在这一段算不出有效值,所以回测正式从第 22 行开始。

种子行:第 21 行要手工填三个值。 G21 填 0,H21 填 0,I21 填 0,L21 填 0,J21 和 K21 留空。这四个数是整条链的起点,不填的话第 22 行的公式会引用到表头文字并报错。

G 列,入场信号。 G22 写这条并下拉:

=IF(AND(E21<=F21,E22>F22),1,0)

含义是昨天收盘在均线上或下方、今天收盘站到了均线上方,也就是上穿这一根。注意这里判定的是穿越而不是「在上方」,写成 E22>F22 的话,整段上涨行情里每一根都会给信号。

H 列,持仓状态。 H22 写这条并下拉:

=IF(H21=1,IF(OR(D22<=I21*0.95,E22<F22),0,1),IF(G21=1,1,0))

这一条是整个框架的核心,读法是:上一行如果持仓,就检查两个出场条件(今天最低价跌破止损,或者今天收盘跌回均线下方),满足任一条就变成 0,否则保持 1;上一行如果空仓,就看上一行有没有信号,有就今天开盘进场变成 1。

用上一行的信号决定今天进场,是为了避免用到未来数据。 信号在收盘后才确定,当天开盘的时候你还不知道,所以只能第二天开盘进。这一条如果写成同一行,回测结果会好得离谱,而实盘复现不出来。

I 列,当前持仓的入场价。 I22 写这条并下拉:

=IF(H22=1,IF(H21=0,B22,I21),IF(H21=1,I21,""))

持仓期间一直保持入场价,出场那一行也保留(这样 K 列才算得出 R 倍数),其余行为空。

J 列,出场价。 J22 写这条并下拉:

=IF(AND(H22=0,H21=1),IF(D22<=I21*0.95,I21*0.95,E22),"")

只在出场那一行有值:如果是被止损打掉的,按止损价算;否则按收盘价算。

K 列,本笔 R 倍数。 K22 写这条并下拉:

=IF(J22="","",(J22-I22)/(I22*0.05))

分母 I22*0.05 是这笔交易的计划风险(入场价的 5%),所以 K 列算出来的是「赚了或亏了几倍的计划风险」。用 R 倍数而不是百分比,是为了让不同价位、不同仓位的交易可以直接相加。

L 列,累计 R。 L22 写这条并下拉:

=IF(K22="",L21,L21+K22)

把 L 列做成折线图,就是这套系统的累计 R 曲线,形状和资金曲线一致但去掉了仓位变化的影响。资金曲线和回撤怎么画见Excel 做资金曲线

Excel 最简回测框架的十二列数据流图,横向排开 A 到 L 十二列,用箭头标出每列引用的来源:F 引用 E 的前 20 行、G 引用 E 与 F 的当前行和上一行、H 引用上一行的 H 与 G 以及本行的 D E F 和上一行的 I、I 引用本行 H 与上一行 H 和 I、J 引用 H 与 I、K 引用 I 与 J、L 引用上一行 L 与本行 K;图中用红色标出「H 引用的是上一行的 G」,旁注「信号在收盘后才确定,只能次日开盘进场,同行引用等于用到未来数据」

三、跑完之后看哪几个数

在表格右侧空白处放这几条统计公式(假设数据到第 1000 行):

交易笔数   =COUNT(K22:K1000)
胜率       =IFERROR(COUNTIF(K22:K1000,">0")/COUNT(K22:K1000),0)
平均 R     =IFERROR(AVERAGE(K22:K1000),0)
最好一笔   =MAX(K22:K1000)
最差一笔   =MIN(K22:K1000)
总 R       =SUM(K22:K1000)

平均 R 是这组数里最重要的一个。 它大于 0 才说明这套规则在历史上有正期望。胜率单独看没有意义,40% 胜率配 3 倍平均盈亏比,比 70% 胜率配 0.4 倍强得多。

最差一笔这个数要特别留意:它应该接近 −1。 如果出现 −1.5 或更差的值,说明止损在某些行情下没能按价成交(跳空),这不是公式错了,是这套系统在真实世界里的风险比你设计的大。

统计结果不足 50 笔不要下任何结论,这是本站统一的样本下限。为什么是这个数见回测样本量要多少

四、这个框架里三个乐观假设

写清楚比假装没有强,因为它们会让回测结果系统性偏好。

假设一,止损总能按止损价成交。 J 列里写的是「跌破就按止损价算」,真实市场上跳空低开会让你成交在更差的位置。A 股遇到跌停板时甚至根本卖不掉。

假设二,次日开盘价就是你的成交价。 集合竞价的成交价和你的挂单位置有关,滑点在这里是实打实的。

假设三,不考虑交易成本。 上面的 K 列没有扣费用。A 股往返按 0.102% 算,如果你的平均单笔盈利是 5%,成本就吃掉了 2%。要加进去,把 K 列改成下面这样:

=IF(J22="","",(J22*(1-0.00051)-I22*(1+0.00051))/(I22*0.05))

0.00051 是单边约 0.051% 的粗略估算(往返 0.102% 的一半)。你的实际费率不同就换成自己的。

五、Excel 回测做不到的三件事

第一,做不了盘中的触发顺序。 日线数据只有四个价格(开高低收),你不知道当天是先摸到止损还是先摸到止盈。上面的框架里如果同时设了止损和止盈,遇到两个都被触及的那一天,Excel 只能靠假设,而假设哪一个先到会显著改变结果。唯一的规避办法是只设一个出场条件,像上面这样,或者换到更小周期的数据上去回测。

第二,做不了滑点和流动性建模。 真实的滑点和成交量、波动率、下单大小都有关系,是一个分布而不是一个固定值。Excel 里你只能减一个固定数字,这在小市值品种和极端行情上会严重低估成本。

第三,做不了多品种共享资金。 十个品种同时给信号、账户只够开三个,该开哪三个,这个逻辑 Excel 表达不了,因为每个品种一张表,表之间不知道彼此的资金占用。多品种的仓位分配见多品种的止损与仓位怎么定

Excel 回测三个能力边界的示意图,三块并排:第一块画一根日线 K 线,上下各标一条止损线和止盈线,中间打一个问号,标注「日线只有四个价格,不知道谁先被触及」;第二块画一个滑点分布的直方图,旁边对照一个固定数值的减法,标注「真实滑点是分布,Excel 只能减常数」;第三块画十个品种同时亮起信号但只有三个资金格位,标注「表与表之间不知道彼此占用了多少资金」

六、出现这四个信号,必须换工具

信号一,你要回测的周期小于日线。 分钟级数据的行数会迅速超过 Excel 舒服的范围,而且盘中触发顺序的问题会变得更突出。

信号二,你的系统同时管理多个品种并共享资金。 见上一节第三条,这是硬边界。

信号三,你要做参数扫描。 想看均线周期从 10 试到 60 哪个最好,Excel 里得复制 51 张表。这时候几行代码比一天的复制粘贴快得多。不过参数扫描本身是个危险动作,很容易过拟合,理由见回测常见的坑

信号四,你要做随机重排或蒙特卡洛检验。 这类检验需要跑上千次,Excel 做不到,方法见蒙特卡洛怎么验证系统

四个信号都没撞上,Excel 就够用,不用为了「显得专业」去学一套工具。不写代码还有哪些回测路径,见不写代码能不能做回测

写在最后

这个框架最大的价值不在于它算出来的那几个数,在于写公式的过程会逼你把规则写死。「跌破均线就走」这句话,落到 H 列公式里必须回答清楚:是收盘跌破还是盘中跌破,跌破多少算数,跌破当天走还是第二天走。这三个问题回答不了的系统,本来就没法执行。

先用一个品种、一套最简单的规则跑通这十二列,再往上加条件。一上来就写一套有七个条件的系统,跑出来你也不知道是哪一条在起作用。

3秒免费测一下你的”管不住手指数”:journal.xtradingtime.com(记住 3316,就能找到我们)

本文内容仅供教育和参考用途,不构成任何投资建议。交易有风险,入市须谨慎。

微信搜一搜 Tom讲交易

在微信里搜「Tom讲交易」即可关注,每周更新交易教学

推荐课程

合约陪跑实战训练营

不只教方法,更带你实盘执行。从仓位管理到止损止盈,手把手纠正你的交易习惯,建立可复制的盈利系统。

相关文章

量化交易

不写代码能不能做回测:四条路径的能力边界,加六个选型维度

新手不写代码也能做回测,四条路径各有各的天花板:手工翻图样本上不去、表格法卡在盘中触发顺序、平台内置测试器要写几行脚本、无代码平台上手最快但黑盒最大。这篇给出四条路径的能力对照、六个选型维度(数据与复权、成本设置、出场表达力、能不能导出逐笔明细、样本外支持、可复现性),以及一条和写不写代码无关的硬边界。

量化交易

回测要用多长时间的数据:先算笔数不算年数,日线策略一年只有 25 笔

「回测一年还是五年」这个问题问错了对象。真正决定回测有没有说服力的是两个数:样本笔数和覆盖的市场状态数。日线策略一年约 250 根 K 线,若平均每 10 根出一个信号,一年只有 25 笔,离 208 笔的显著性门槛差 8.3 年。这篇给出信号密度与所需年数的换算表、五档周期的年信号数对照、市场状态覆盖的三条硬要求,以及数据不够时的三条替代路径。

量化交易

回测胜率多少才算及格:孤立的胜率没有及格线,及格的是期望值 0.2R 加样本 208 笔

回测跑出 55% 胜率就当系统能用,是这批参数里最贵的误判。胜率的及格线完全由盈亏比决定:盈亏比 1:1 时及格线是 60%,1:3 时只要 30%。更要命的是第二个条件,及格线越低的系统越难被证明,盈亏比 1:3 需要 323 笔样本而 1:2 只要 208 笔。这篇给出按盈亏比查的及格胜率表、对应的样本量表,以及回测及格之外必须同时满足的三条。

量化交易

Pine Script 入门:三行出一条均线,四条执行规则决定你写的对不对

写一个能在图上画出均线的指标,Pine Script 只需要三行,本文第一段就能直接粘贴运行。但真正决定你写出来的东西准不准的,是四条执行规则:脚本按每根 K 线执行一遍、所有变量都是序列、未收盘的那根 K 线会被反复重算、脚本跑在 TradingView 服务器上而不是你的电脑上。这篇给出三段可直接粘贴的完整代码(均线、放量金叉信号、策略骨架),讲透四条执行规则,并列出 Pine 做不到的五件事。

量化交易

AI量化是不是骗局:六个骗局特征,四个自己就能做的验证

打着AI和大模型旗号的量化产品这两年特别多,其中真做量化的和纯粹套壳收钱的混在一起,光看宣传页分不出来。这篇不评价任何具体产品,只给判据:六个骗局产品身上高频出现的特征,每个都配一个你自己能核对的动作;再给四个动手验证的方法,包括逐笔记录抽查、小额实测、主体资质查询和资金权限检查。另附真做量化的团队通常长什么样。

量化交易

一个交易系统需要回测多少笔才算有效:公式 n ≥ (1.96σ/E)²,附四档期望值对照表

回测五十笔就下结论是自欺,一百笔也远远不够。所需样本量有一个可以直接算的公式,它只依赖两个数:单笔期望值和单笔标准差。这篇给出公式的来源、标准差怎么算、以及期望值 0.1R 到 0.5R 四档下所需笔数的完整对照表。核心结论是平方关系:期望值降一半,样本量需求变四倍。文末给出样本量之外必须同时满足的四个条件。

觉得有用?关注公众号

扫码或在微信里搜「Tom讲交易」,每周更新交易教学文章

扫码关注 Tom讲交易,或微信搜一搜 Tom讲交易

配套免费工具

随机漫步模拟

打开