跳转到内容

绩效评估

上一章回测跑完了:10 万元变成 120,475 元,赚了 20.5%。这个数字本身回答不了任何问题——20.5% 算高还是低?中间最深亏过多少?这些收益是稳稳赚来的,还是赌来的?两条终点相同的净值曲线,一条平滑向上,一条中途腰斩再爬回来,对持有者是完全不同的两种东西。

绩效评估就是把一条净值曲线翻译成一组可比较的数字:收益翻译成年化收益,波动翻译成回撤,「风险换收益值不值」翻译成夏普和卡玛,买卖的微观结构翻译成胜率和盈亏比。本章五个指标,每个都用上一章那条真实的净值序列(250 个交易日,2025-01-02 到 2025-12-17)手算一遍。

rˉyr=(VnV0)252/n−1\bar r_{yr} = \left(\frac{V_n}{V_0}\right)^{252/n} - 1

人话:V0V_0 是期初净值,VnV_n 是期末净值,nn 是交易日数(A 股一年约 252 个)。把总收益开 n/252n/252 次方根,得到「如果按这个复利速度跑满一年」的收益——这样三个月的策略和三年的策略才能放在同一把尺子上比。之所以用开方(几何平均)而不是除以年数(算术平均),是因为收益是乘法累积的:今年 +50%、明年 −50%,算术平均是 0,但你其实亏了 25%(1.5×0.5=0.751.5 \times 0.5 = 0.75)。几何算法如实反映复利。

手算:本例 V0=V0.toLocaleString(′zh−CN′)V_0 = {V0.toLocaleString('zh-CN')},Vn=Vn.toFixed(2)V_n = {Vn.toFixed(2)},n=nn = {n}:

rˉyr=(120475.36100000)252/250−1=1.20481.008−1≈(annRet∗100).toFixed(1)%\bar r_{yr} = \left(\frac{120475.36}{100000}\right)^{252/250} - 1 = 1.2048^{1.008} - 1 \approx {(annRet * 100).toFixed(1)}\%

这段回测恰好约一年(250 个交易日),年化 20.7% 和总收益 20.5% 几乎相同——252/250252/250 的指数接近 1,年化几乎没做调整。如果只有 3 个月数据,同样 20.5% 会年化出超过 100%,这正是短样本年化容易吓人一跳的原因(见文末常见坑)。

MDD=max⁡tmax⁡s≤tVs−Vtmax⁡s≤tVs\text{MDD} = \max_t \frac{\max_{s \le t} V_s - V_t}{\max_{s \le t} V_s}

人话:每天先记下「截至今天的历史最高净值」,再算今天从这个最高点跌下来百分之几;全周期里跌得最深的那一次,就是最大回撤。它回答的问题是:**持有过程中,账户最多比高点缩水多少?**这是大多数人对「风险」最真实的体感——不是方差,是「我眼睁睁看着账户少了两成」。

手算:扫描净值序列,历史最高点出现在 2025-05-09,净值 118105.74;此后最深跌到 2025-09-11 的 99541.83:

MDD=118105.74−99541.83118105.74=18563.91118105.74≈(ddStats.mdd∗100).toFixed(1)%\text{MDD} = \frac{118105.74 - 99541.83}{118105.74} = \frac{18563.91}{118105.74} \approx {(ddStats.mdd * 100).toFixed(1)}\%

从高点到谷底隔了约 4 个月——最大回撤是个数字,回撤的持续时间是另一种折磨:4 个月里每一天净值都在前高之下,你要每天回答自己「这个策略是不是失效了」。报回撤时不报修复时间,和只报年化不报回撤一样会误导人。

Sharpe=rˉd−rfsd252\text{Sharpe} = \frac{\bar r_d - r_f}{s_d}\sqrt{252}

人话:rˉd\bar r_d 是日收益均值,sds_d 是日收益标准差,rfr_f 是日无风险利率。分子是「比存银行多赚的部分」,分母是「为了赚这部分每天承受的波动」,商是每承担一单位波动换来多少超额收益,再乘 252\sqrt{252} 年化。无风险利率取 2%(约等于国内一年期存款/国债水平),这是一个简化——实务会按期限匹配选利率,但对这个数量级的策略,r_f 取 1.5% 还是 2.5% 几乎不改变结论。

手算:由净值序列算出 249 个日收益 rt=Vt/Vt−1−1r_t = V_t/V_{t-1} - 1:

  • 日收益均值 rˉd=(meanD∗100).toFixed(3)%\bar r_d = {(meanD * 100).toFixed(3)}\%,日收益标准差 sd=(sdD∗100).toFixed(2)%s_d = {(sdD * 100).toFixed(2)}\%;
  • 日无风险利率 rf=2%/252=(rfD∗100).toFixed(4)%r_f = 2\% / 252 = {(rfD * 100).toFixed(4)}\%;

Sharpe=0.083%−0.008%1.30%×252≈0.058×15.87≈sharpe.toFixed(2)\text{Sharpe} = \frac{0.083\% - 0.008\%}{1.30\%} \times \sqrt{252} \approx 0.058 \times 15.87 \approx {sharpe.toFixed(2)}

经验标尺:夏普 1 以上算不错,2 以上很少见且要警惕是否过拟合。0.92 的意思是「每承受一份波动换来近一份超额收益」——及格,但谈不上惊艳。一个细节:这个策略有空仓期,空仓时日收益是 0,把整体波动摊薄了,所以同一策略「满仓版」的夏普通常比这低。

Calmar=rˉyr∣MDD∣\text{Calmar} = \frac{\bar r_{yr}}{|\text{MDD}|}

人话:年化收益除以最大回撤。夏普用「日波动」当风险,卡玛用「最深的伤口」当风险——后者更贴近持仓体验:我不在乎每天上下 1%,我在乎最多会亏多少。

手算:Calmar=(annRet∗100).toFixed(1)%/(ddStats.mdd∗100).toFixed(1)%≈calmar.toFixed(2)\text{Calmar} = {(annRet * 100).toFixed(1)}\% / {(ddStats.mdd * 100).toFixed(1)}\% \approx {calmar.toFixed(2)}。即每承担 1% 的最大回撤,换来 1.31% 的年化收益。经验上卡玛大于 1 才值得考虑实盘——意味着「最深的坑」一年能爬回来。

胜率=盈利交易数总交易数,盈亏比=平均每笔盈利平均每笔亏损\text{胜率} = \frac{\text{盈利交易数}}{\text{总交易数}}, \qquad \text{盈亏比} = \frac{\text{平均每笔盈利}}{\text{平均每笔亏损}}

人话:胜率是「十次交易赢几次」,盈亏比是「赢的时候赢的厚度是亏的时候的几倍」。策略赚不赚钱看的是两者的乘积,单独看任何一个都会被骗。

手算一个高胜率亏钱的策略:10 笔交易,9 笔各赚 1%,1 笔亏 20%:

  • 胜率 = 9/10 = 90%,看起来神准;
  • 盈亏比 = 1% / 20% = 0.05;
  • 每笔期望收益 = 0.9×1%−0.1×20%=−1.1%0.9 \times 1\% - 0.1 \times 20\% = -1.1\%;
  • 10 笔复利下来:1.019×0.80≈1.094×0.80=0.8751.01^9 \times 0.80 \approx 1.094 \times 0.80 = 0.875,亏掉 12.5%。

90% 的胜率,稳定亏钱。现实中这种策略很常见:不断「止盈」落袋小钱,亏了死扛,直到一笔大亏吞掉全部利润——人肉版的「高胜率、低盈亏比」。反过来看上一章的双均线策略:五笔完整买卖只有一笔大赚(胜率 20%),其余四笔小亏,但那一笔赚了约 1.29 万,盈亏比足够大,整体盈利。这是趋势策略的典型形态:胜率是它的成本,盈亏比是它的利润来源。评价任何策略,两个数字必须一起报。

基准与超额收益:Alpha 与 Beta 的实战度量

Section titled “基准与超额收益:Alpha 与 Beta 的实战度量”

前面五个指标衡量的都是绝对表现。但只看绝对收益会掩盖一个残酷的事实:你在牛市里赚的钱,可能是大盘送的;在熊市里亏的钱,可能策略已经尽力了。

  • 2020 年核心资产大牛市,沪深 300 指数大涨 27%。如果你的策略赚了 15%,看起来很丰厚,但你其实跑输了市场 12 个百分点——随便买个指数 ETF 都比你强;
  • 2018 年单边阴跌,沪深 300 下跌 25%。如果你的策略亏损 5%,表面上在赔钱,但你跑赢了大盘 20 个百分点——极其优异的防守能力。

回忆第 2 章的一元线性回归:y=α+βxy = \alpha + \beta x。策略收益可以拆成两块:随大盘起伏的被动收益(β\beta 收益,靠天吃饭),以及剥离大盘后的独立超额收益(α\alpha 收益,真本事)。

衡量超额收益,首先要选一把公正的尺子(基准 Benchmark):

策略风格对应标准基准为什么不能错配
大盘白马 / 价值选股沪深 300错配小盘基准会把市场风格差异误当成超额
中盘成长中证 500中盘股波动大于沪深 300,不能直接对比
小市值 / 动量选股中证 1000 / 国证 2000若拿沪深 300 当基准,在小盘牛市里会制造出虚假的巨额超额

信息比率(IR):超额收益的夏普比率

Section titled “信息比率(IR):超额收益的夏普比率”

IR=rˉactiveTE,TE=s(ractive)⋅252\text{IR} = \frac{\bar r_{active}}{TE}, \qquad TE = s(r_{active}) \cdot \sqrt{252}

其中日超额收益 ractive,t=rstrategy,t−rbench,tr_{active, t} = r_{strategy, t} - r_{bench, t}。

人话解释:分子是年化平均跑赢基准的幅度,分母 TETE 是跟踪误差(超额收益的年化标准差,即跑赢幅度的波动大小)。商就是信息比率(Information Ratio, IR):每承受 1 单位相对跑偏的风险,能换来多少稳定的超额收益。它衡量的是机构口中「纯 Alpha 的质量」。

手算一遍: 某策略运行 250 个交易日,总收益 22%,同期基准指数上涨 10%,年化超额收益约 12%12\%。 计算 250 天的每日超额收益 ractive,tr_{active, t},算出其日标准差为 0.5%0.5\%:

TE=0.5%×252≈0.5%×15.87≈7.94%TE = 0.5\% \times \sqrt{252} \approx 0.5\% \times 15.87 \approx 7.94\%

IR=12%7.94%≈1.51\text{IR} = \frac{12\%}{7.94\%} \approx 1.51

经验标尺:信息比率大于 0.5 算及格,大于 1.0 算优秀,大于 1.5 在公募与量化私募界都属于头部水准。超额收益不稳定的策略(某个月暴赚 20%、其余月份持续跑输),跟踪误差很大,IR 会非常低。

输入:策略净值序列 V[0..n],基准净值序列 B[0..n],无风险年利率 rf
年化收益 ← (V[n] / V[0])^(252/n) − 1
peak ← V[0]
对 t 从 0 到 n:
peak ← max(peak, V[t])
dd[t] ← V[t] / peak − 1
最大回撤 ← −min(dd)
日收益 r[t] ← V[t] / V[t−1] − 1
夏普 ← (mean(r) − rf/252) / sd(r) × √252
卡玛 ← 年化收益 / 最大回撤
# 基准与超额计算
基准日收益 r_bench[t] ← B[t] / B[t−1] − 1
超额日收益 r_active[t] ← r[t] − r_bench[t]
跟踪误差 TE ← sd(r_active) × √252
年化超额 ← mean(r_active) × 252
信息比率 IR ← 年化超额 / TE

注意 peak 是逐日更新的累积最大值——回撤永远是相对「历史最高点」算的,不是相对期初,也不是相对昨天。

把净值序列的每一天都换算成「距历史高点的跌幅」,就得到下面的回撤图(行业惯称水下曲线,underwater curve):

看回撤图比看净值图更能感受风险。净值图上,5 月到 9 月那段只是「一条有点波折的线」;回撤图上,它是一片深 16%、持续 4 个月的绿色水域——每一天你都在水下,等待净值游回前高。这条曲线还回答了净值图看不出的问题:创新高的频率(曲线触到 0 轴的次数)、单次受伤的深度、以及修复的速度。评价一条净值曲线,先看它的水下部分。

  1. 只报年化,不报回撤。「年化 30%」和「年化 30%、最大回撤 40%」是两个策略。前者听着诱人,后者意味着你中途要扛过账户缩水四成的日子——绝大多数人扛不过去,会在谷底附近割肉,把浮动亏损变成永久亏损。任何业绩报告,年化和最大回撤必须同时出现;本章的卡玛比率就是把两者绑成一个数的强制手段。
  2. 只看绝对收益,误把市场 Beta 当 Alpha。在指数大涨 50% 的年份赚 30% 不是本事,其实跑输了 20 个百分点;熊市只跌 5% 也不是失败。评价策略必须对照基准看超额收益与信息比率。
  3. 样本太短,指标全是噪声。本章的回测恰好约一年,已经是最低限度的样本;三个月的实盘业绩算出的夏普,置信区间宽到没有意义——日收益的均值本身估计误差就很大,再除以另一个带误差的波动率、乘上 252\sqrt{252},误差被逐级放大。短样本年化尤其危险:3 个月赚 10% 年化出 46%,但这 46% 里大半是运气。经验法则:少于 1 年的数据,指标只当参考,不当结论;少于 3 个月的,连参考都算不上。

五个指标把净值曲线翻译完了:年化 20.7%、最大回撤 15.7%、夏普 0.92、卡玛 1.31,再加上胜率与盈亏比的微观结构。这套翻译有个前提——这些数字都是同一段历史、同一组参数下算出来的,是「过去表现」而非「未来预期」。参数是怎么来的、换段历史还灵不灵,是下一章过拟合与样本外检验要回答的问题。