一条曲线向上爬,你就觉得"这策略行"。可它一路有多颠、最深亏过多少,你说得清吗?
上一篇,我们终于写出了那个最小的向量化回测引擎,让一段策略在历史数据上从头跑到尾,吐出了一条资金曲线。
那一刻很爽。你盯着那条曲线,看它从左下角爬到右上角,心里默念:"嗯,在涨,应该不错。"
但请你诚实地回答一个问题——
你凭什么说它"不错"?
是因为它最后比开头高?还是因为它的形状看起来很顺眼?
如果我再给你三条都在涨的曲线,你怎么排出谁好谁坏?
这就是今天要解决的事:把"看着像在涨"这种主观感觉,换成几个客观的数字。
只有变成数字,策略之间才能横向比较;只有能比较,你才谈得上"挑一个更好的"。
回测引擎吐出来的,本质上是一列"每天账户值多少"的数字。光看一长串数字没人受得了,所以第一件事——画出来。
import matplotlib.pyplot as pltequity.plot()plt.show()
这三行干的事很朴素:把那一列账户净值,按时间顺序连成一条线,显示出来。equity 就是上一篇引擎累乘出来的资金曲线。
画出来之后,你能一眼看到很多数字看不出的东西:它是一路平稳上爬,还是大起大落地涨上去的?中间有没有一段长长的、让人难熬的下坡?
画图是体检的第一步,但它只能"看个大概"。
问题在于——
眼睛会骗人。同样涨了一倍的两条曲线,一条让你睡得着,一条让你半路就割肉离场了。
光靠"颜值"判断,迟早翻车。我们需要尺子。
⚖️ 第二步:收益不能单独看,要和风险一起称
很多新手只盯着一个数:最后赚了多少。
这是最容易掉进去的坑。因为——
收益是用风险换来的。
你可以让一条曲线涨得很猛,代价是它中途可能腰斩;你也可以让它涨得温吞,但一路平平稳稳。光报一个"涨了 80%",等于只说了故事的一半。
所以我们至少要同时看两类数字:"涨多快" 和 "亏多深"。
先说"涨多快"——年化收益。
它的直觉很简单:把整段回测期间赚的钱,折算成"平均每年涨百分之多少"。不管你测的是三年还是十年,都拉到"每年"这个统一口径,这样不同长度的回测才能比。
再说那个真正揪心的——最大回撤。
这是本篇我要你死死记住的概念。它问的是:
从你账户曾经到过的最高点,一路滑到之后的最低点,中间最深的那一段,亏掉了百分之几?
peak = equity.cummax()drawdown = equity / peak - 1max_dd = drawdown.min()
这几行在干嘛?cummax() 是"记录到目前为止见过的最高水位";拿当前净值跟这个历史最高点比,就知道现在从高点跌下来多少;这一路所有跌幅里最深的那个,就是最大回撤。
为什么最大回撤比收益更值得盯?
因为收益决定你能赚多少,回撤决定你能不能活到赚到的那天。
一个策略年化再漂亮,如果中途有过一段腰斩级的回撤,绝大多数真人——包括你——会在谷底那一刻扛不住、平仓离场。于是那条"理论上很赚"的曲线,跟你再无关系。
这正是第六季《资金管理》⑨ 反复敲打的回撤红线,也是第四季《回测的科学》⑧ 把绩效指标单独拎出来讲的原因:回撤不是一个数字,是你的心理承受边界。
📐 第三步:把"涨多快"和"亏多深"压成一个数
知道了收益和回撤,下一个很自然的念头是:能不能用一个数,同时考虑这两件事?
能。这就是大名鼎鼎的 夏普比率。
别被名字吓到,它的直觉一句话就能讲清:
你每多承受一份波动,到底换回来多少收益?
同样涨了 30%,一条曲线一路平稳,另一条上蹿下跳像心电图——前者的夏普更高,因为它用更小的颠簸换到了同样的收益。
sharpe = returns.mean() / returns.std()
这行的意思是:把每天的平均收益,除以收益的波动幅度。分子是"赚得多不多",分母是"颠得厉不厉害"。用波动去"折价"收益——颠得越凶,同样的收益就越不值钱。
(实际计算里还会乘一个年化系数、减掉无风险利率,但那是细节。你先抓住这个直觉:夏普 = 收益 ÷ 波动。)
除了这几个,还有两个你在第六季就见过的老朋友,回扣一下:
- • 盈亏比:平均每笔赚的钱,是平均每笔亏的钱的几倍。
这两个要一起看——胜率三成的策略照样能赚钱,只要它"赚时赚得多、亏时亏得少"。单看胜率高就以为稳,是另一个常见的错觉。
把这些指标算齐,你手里就不再是一条"看着像在涨"的曲线,而是一张体检报告。
而报告最大的价值,是让不同的策略、不同的参数能并排比较。
同样的年化收益,回撤更小的那个更好。同样的回撤,夏普更高的那个更好。
凭这张报告选优,而不是凭"哪条曲线画得更顺眼"——这就是从"感觉派"走向"量化派"的那道分水岭。
这也正好回扣上一篇:我们费劲写出引擎、跑出那条曲线,不是为了欣赏它,是为了把它送进这台"指标机器"里评分。
📌 小结
- • 先画图,再算数。 资金曲线让你看个大概,但眼睛会骗人,真正下结论要靠指标。
- • 收益不能单独看。 收益是用风险换来的,只报"涨了多少"等于只说了一半故事。
- • 最大回撤最揪心。 它决定你能不能扛得住、活到赚到的那天——这是第六季回撤红线、第四季绩效指标的核心。
- • 用一个数压两件事。 夏普比率衡量"每承担一份波动换多少收益";胜率和盈亏比要成对看。
- • 凭数字横向比,别凭颜值。 同样收益看谁回撤小,同样回撤看谁夏普高——这才是挑策略的姿势。
【下一篇预告】有了这套指标,你一定会冒出一个念头:那我多试几组参数,挑指标最漂亮的那组不就行了?下一篇⑦,我们就来聊参数优化——以及那条最危险的红线:当你拼命让指标变好看时,你很可能正在亲手把策略喂进"过拟合"的坑里。
如果这篇让你对"资金曲线"多了一分警惕,点个赞、点个关注,留言区告诉我:你以前是不是也只盯着"最后赚了多少"?
本文仅为个人学习记录与编程笔记,所涉代码与方法均为技术科普,非交易建议,不构成任何操作建议。市场有风险,据此操作风险自负。