回测 · 风险指标
同一条净值曲线按月末和按每天取点算出的最大回撤可以差一倍
最大回撤 =(高点净值 − 高点之后的最低净值)÷ 高点净值,在整条净值曲线上找跌得最深的那一段。净值从 1.150 跌到 0.920,回撤是 (1.150 − 0.920) ÷ 1.150 = 20%;之后只要净值没回到 1.150,中间反弹过几次都还在这一段回撤里。
同一条曲线,取点越稀,量到的回撤只会更小或相等。这段 20% 的回撤换成只看每个月最后一天的净值,量到的是 10%,月中的高点和低点都没被取到。拿到一个最大回撤数字,要连带问清净值多久记一次,净值里包不包括还没平仓的浮动盈亏。
最大回撤的公式与一段回撤从哪天量到哪天
回撤是净值相对此前最高点的跌幅。曲线上任意一天:回撤 =(到这一天为止的最高净值 − 当天净值)÷ 到这一天为止的最高净值。每一天都有一个回撤,其中最大的那个就是最大回撤(Max Drawdown,回测报告里也写成 MDD)。
- 从第一个净值往后走,随时记着到目前为止出现过的最高净值;
- 每到一个新的点,用上面的式子算它比这个最高净值低了百分之几;
- 净值创了新高,最高净值换成新的,这一点的回撤是 0;
- 走完整条曲线,取第 2 步里出现过的最大值。
分母是高点净值,不是起始本金。起始净值 1.000、涨到 1.150 再跌到 0.920 的账户,对着本金看只亏了 (1.000 − 0.920) ÷ 1.000 = 8%,最大回撤却是 20%:在 1.150 那天把钱放进来的人,亏掉的就是这 20%。
一段回撤从高点那天开始,到净值回到或超过这个高点才结束。中间的反弹只要没够到原高点,后面再跌出更低的点,谷底就往后挪,仍是同一段。谷底因此要等净值创了新高才定得下来;曲线末尾还没回到高点,这段回撤量到的只是到那一天为止的深度。
美国商品期货监管条文里的最差峰谷回撤按月末净值来量
美国商品期货交易委员会(CFTC)的规则管商品基金运营人和交易顾问怎样向客户披露业绩,其中 17 CFR § 4.10 是定义条款,里面有两款讲回撤。回撤(Draw-down)是基金或账户在指定期间内经历的亏损。最差峰谷回撤(Worst peak-to-valley draw-down)是月末净值的最大累计百分比跌幅,量的是这样一段期间:起始的那个月末净值,没有被之后任何一个月末净值追平或超过。跌幅以起始月末净值的百分比表示,同时标出从起始月末净值到这段跌幅里最低月末净值所经过的月份和年份。
条文脚注里的记法例子是 4 to 8-92/25%,指这段峰谷回撤从 1992 年 4 月持续到 8 月,累计跌了 25%。
峰和谷在这个定义里都只能落在月末。月中涨到过多高、跌到过多低,只要月末收回来了,就不进这个数。
披露时要列的回撤有两个。交易顾问一节的 § 4.35(业绩披露)要求列出最近五个日历年加当年至今的最大月度回撤,以客户资金的百分比表示,标出发生的月份和年份;还要列出同一期间的最差峰谷回撤,以净值的百分比表示,标出起止月份和年份。前一个看单独一个月,后一个可以跨好几个月:连续两个月各亏 6% 和 5%,最大月度回撤是 6%,峰谷回撤是 1 − 0.94 × 0.95 = 1 − 0.893 = 10.7%。
这两条都在 CFTC 规则的第 4 部分,管的是商品基金运营人和交易顾问,并不表示加密货币平台上的网格机器人或跟单页面也按它来算。
同一条净值序列按月末取点和按每天取点的峰、谷与结果
一条每天记一次的净值序列,起始净值 1.000,6 月 30 日到 9 月 30 日之间的 11 个点:
| 日期 | 净值 | 到当天为止的最高净值 | 比最高净值低多少 | 是不是月末 |
|---|---|---|---|---|
| 6 月 30 日 | 1.000 | 1.000 | 0 | 月末 |
| 7 月 10 日 | 1.060 | 1.060 | 0 | |
| 7 月 21 日 | 1.150 | 1.150 | 0 | |
| 7 月 31 日 | 1.100 | 1.150 | 0.050 ÷ 1.150 ≈ 4.35% | 月末 |
| 8 月 7 日 | 1.040 | 1.150 | 0.110 ÷ 1.150 ≈ 9.57% | |
| 8 月 14 日 | 0.960 | 1.150 | 0.190 ÷ 1.150 ≈ 16.52% | |
| 8 月 20 日 | 0.920 | 1.150 | 0.230 ÷ 1.150 = 20.00% | |
| 8 月 31 日 | 0.990 | 1.150 | 0.160 ÷ 1.150 ≈ 13.91% | 月末 |
| 9 月 10 日 | 1.050 | 1.150 | 0.100 ÷ 1.150 ≈ 8.70% | |
| 9 月 18 日 | 1.010 | 1.150 | 0.140 ÷ 1.150 ≈ 12.17% | |
| 9 月 30 日 | 1.120 | 1.150 | 0.030 ÷ 1.150 ≈ 2.61% | 月末 |
表注:净值是自设的数。没列出的日子,净值都落在相邻两行之间,每天取点的最高点和最低点因此都在表里。第四列 =(最高净值 − 当天净值)÷ 最高净值。
按每天取点,最高净值在 7 月 21 日到了 1.150,之后没有再被超过,第四列最大的是 8 月 20 日:(1.150 − 0.920) ÷ 1.150 = 0.230 ÷ 1.150 = 20%。9 月 10 日反弹到 1.050,9 月 18 日又落到 1.010,这一下跌了 0.040 ÷ 1.050 ≈ 3.81%;1.050 没够到 1.150,它算在 7 月 21 日开始的那段回撤里面,不单独成段。
按月末取点,只剩 1.000、1.100、0.990、1.120 四个数。高点是 7 月 31 日的 1.100,8 月 31 日是 0.990:(1.100 − 0.990) ÷ 1.100 = 0.110 ÷ 1.100 = 10%。7 月 21 日的 1.150 和 8 月 20 日的 0.920 都在月中,取不到。
| 取点方式 | 峰 | 谷 | 算式 | 最大回撤 | 到 9 月 30 日这段回撤结束了吗 |
|---|---|---|---|---|---|
| 每个月最后一天 | 7 月 31 日,1.100 | 8 月 31 日,0.990 | (1.100 − 0.990) ÷ 1.100 | 10% | 结束了,1.120 高于 1.100 |
| 每天 | 7 月 21 日,1.150 | 8 月 20 日,0.920 | (1.150 − 0.920) ÷ 1.150 | 20% | 还没有,1.120 低于 1.150 |
曲线是同一条,两个数差了一倍,连「现在还在不在回撤里」的答案都相反:月末那一列在 9 月 30 日已经创了新高,每天那一列离高点还差 2.61%。
月末取点量到的这段跌幅整个落在 8 月一个月里,8 月的单月跌幅 (1.100 − 0.990) ÷ 1.100 同样是 10%,这条序列的最大月度回撤和月末峰谷回撤碰巧是同一个数。
每天取点也只是一天记一次。用历史 K 线做策略回测,净值是每根 K 线结束时记一个点,日线回测量出的回撤看不到当天盘中的低点;成交不变、只是换成小时线把净值记得更密,同一段行情量到的回撤只会更大或相等。两个策略的最大回撤要比大小,取点频率得一样;一个按月末、一个按每天,两个数没法直接比。
一直持仓的策略只看已实现盈亏为什么会把回撤看小?
净值(Net asset value)在 § 4.10 里指总资产减总负债,其中每一笔商品权益持仓都按公允市价入账。持仓按市价算,没平仓的浮动盈亏就在净值里面,回撤量的是这条包含浮动盈亏的曲线。
一个一直持仓的策略,本金 10,000 USDT,取两个时点:
- 第一个时点:已平仓的单子累计赚 200,手里的仓位浮盈 200,净值 10,000 + 200 + 200 = 10,400;
- 第二个时点:已实现盈亏涨到 500,价格下跌后仓位浮亏 1,660,净值 10,000 + 500 − 1,660 = 8,840。
按净值量,回撤是 (10,400 − 8,840) ÷ 10,400 = 1,560 ÷ 10,400 = 15%。只把已实现盈亏画成曲线,两个时点是 10,200 和 10,500,一路新高,回撤是 0。
网格和马丁格尔都在下跌途中继续买入:已经配对卖出的那部分利润还在累加,亏损留在没卖出的持仓里。已实现盈亏的曲线看不到这部分,价格跌得越深,它和净值曲线离得越远。
自己记净值,每天固定一个时刻记账户总权益:计价币余额加上持仓按当时市价折算的金额。中途往策略里加钱或取钱的那一天要单独处理,把这笔进出从当天的净值变化里扣掉;不扣的话,加一笔钱净值就「创了新高」,一段还没走完的回撤会被直接抹掉。
回撤 50% 要涨多少才能回本?
要涨 100%。净值从 1 跌掉 x,剩 1 − x;回到 1 要乘以 1 ÷ (1 − x),涨幅是 1 ÷ (1 − x) − 1 = x ÷ (1 − x)。跌幅的分母是高点,涨幅的分母是低点,低点更小,回本要的涨幅就比跌掉的幅度大。
| 回撤 x | 剩下的净值 1 − x | 回本要涨 x ÷ (1 − x) | 验算 |
|---|---|---|---|
| 10% | 0.90 | 0.10 ÷ 0.90 ≈ 11.1% | 0.90 × 1.111 ≈ 1.00 |
| 20% | 0.80 | 0.20 ÷ 0.80 = 25% | 0.80 × 1.25 = 1.00 |
| 30% | 0.70 | 0.30 ÷ 0.70 ≈ 42.9% | 0.70 × 1.429 ≈ 1.00 |
| 50% | 0.50 | 0.50 ÷ 0.50 = 100% | 0.50 × 2 = 1.00 |
| 75% | 0.25 | 0.75 ÷ 0.25 = 300% | 0.25 × 4 = 1.00 |
| 90% | 0.10 | 0.90 ÷ 0.10 = 900% | 0.10 × 10 = 1.00 |
回撤 30% 和 50% 只差 20 个百分点,回本要的涨幅是 42.9% 对 100%。回撤越深,多跌的每一个百分点要用越大的涨幅去补。
放回那条三个月的序列:按每天取点,谷底 0.920 要涨 0.20 ÷ 0.80 = 25% 才回到 1.150(0.920 × 1.25 = 1.150);9 月 30 日的 1.120 比谷底高 1.120 ÷ 0.920 − 1 ≈ 21.7%,还没够。按月末取点,谷底 0.990 回到 1.100 要涨 0.10 ÷ 0.90 ≈ 11.1%,9 月 30 日已经比 0.990 高出 1.120 ÷ 0.990 − 1 ≈ 13.1%。
回测报告上的最大回撤,是那段历史里已经出现过的最深一段,换一段行情可以更深。参数若是为了抹平某一段难看的回撤反复调出来的,报告上的数会偏小,这是回测很漂亮、实盘却亏钱的原因之一。