假设你是一家外卖站点的站长,要从阿明和阿强两位骑手里选一位金牌骑手,负责全站最黄金的商圈。阿明总在月底爆单,偶尔单日收入破千,却也常因超时被投诉扣钱;阿强每天稳定收入三百,从不大起大落。光看“谁赚得多”够吗?显然不够。你还得追问三个问题:他赚得稳不稳?他最惨的时候亏多少?遇上台风天(行情突变)还能不能准时送达?量化交易里的策略评估指标,就是回答这三问的“骑手体检表”:夏普比率衡量“每冒一分险换多少回报”,最大回撤记录“从巅峰摔到谷底有多深”,Calmar比率看“一年收益与最惨亏损的性价比”,稳健性评估则检验他在各种天气下的发挥是否稳定。本文就以这套“体检表”为线索,从收益度量、风险度量讲到综合评估体系,帮你看懂如何客观评判一个量化策略的实盘成色。
对量化与 AI 金融从业者而言,掌握策略评估指标是判断模型能否从回测走向实盘的分水岭,是从“能写出赚钱的策略”走向“能承担资金与风控责任”的必修基本功。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
策略净值曲线与回撤——收益与风险可视化 净值曲线:策略累计收益走势 回撤区域:峰值到谷底最大跌幅 峰值标记:历史最高净值点 谷底标记:最大回撤最低点 MDD = max(1 - V(t)/max(V(0..t))) × 100%
收益度量指标
站长要选拔金牌骑手,第一步永远是翻看两位骑手的“日收入账本”。但账本上一堆数字没法直接比——阿明干了半年,阿强干了一年,怎么比谁更能赚?聪明的站长会把收入折算成“年化收入”,把时长不同、起点不同的人拉到同一把尺子上量。量化交易的第一步,同样是把策略的净值曲线折算成各种口径的收益指标。
最基础的是累计收益率,它回答“从起点到终点一共赚了多少”。但它有个大毛病:时间长短不同,累计收益就没法比。于是有了年化收益率,把总收益按时间比例折算成“每年赚多少”。更进一步,市场涨的时候人人赚钱,要看清策略的真本事,还得扣掉市场本身的贡献,这就是超额收益——好比骑手在“平台无差别派单”的底薪之外,靠路线规划多赚的那部分。
技术细节上,先计算累计收益率,再做年化折算:假设策略跑了一年半(约 378 个交易日),总收益 20%,我们就用一年 252 个交易日的口径把 20% 摊成“每年约 13%”。
站长最后在台账上写下两个年化数字:阿明年化六万,阿强年化五万二。数字好看并不等于可以签约——他还得看看这两份收入的“稳定性”,这就引出下一节的风险度量。
- 算累计总收益先用期末净值减期初净值,再除以期初本金,得到全程总收益率。
- 加 1 转为增长倍数把百分比形式的收益转换成净值增长倍数,方便后续做时间折算。
- 按时间比例取幂用一年的周期数 m 除以总周期数 T 作为指数,把总倍数“摊”到每年。
- 减 1 还原年化把年化倍数减 1,恢复成“每年赚百分之几”的常用口径。
风险度量指标
光看收入高没有用。阿明年化六万,但收入像过山车:月初爆单月尾封号;阿强五万二,每天稳稳当当地跑。站长心里明白:波动越大,他越难预测明天的账,也越担心阿明哪天撑不住辞职。这种“收入忽高忽低”的程度,在量化里就叫波动率。
波动率用日收益率的标准差来度量,把“每天偏离平均多少”量化成一个数字;再乘 √252(一年约 252 个交易日)做年化。注意波动率对上涨和下跌都敏感,所以衍生出只统计下跌一侧的下行波动率——毕竟投资者真正害怕的是亏钱。而最大回撤更极端,直接刻画“从最高点摔到最低点有多惨”,这一节先建立概念,第四节再展开。
站长在阿明的档案里看到一行刺眼的记录:日收入波动率是阿强的三倍。这就像策略净值曲线上的大起大落——波动率是“颠簸指数”,颠得越狠,乘客(投资者)越容易晕车离场。
- 构造日收益序列用相邻两日净值的差除以前一日净值,得到每天的涨跌百分比。
- 计算日波动率对日收益序列求标准差,衡量每天收益偏离均值的平均幅度。
- 年化放大乘上年交易日数的平方根,把“一天的风险”折算成“一年的风险”。
夏普比率
收入看过了,颠簸也测过了,站长要拍板了:到底谁的综合素质高?直觉上,最好的骑手当然是“每受一分颠簸的罪,就多赚一份钱”——量化里第一把这样的尺子就是夏普比率。
夏普比率 =(策略年化收益 − 无风险利率)÷ 年化波动率。分子先扣掉“躺平也能赚的钱”(比如国债收益),留下靠策略本事赚的超额收益;分母是承担的风险。结果就是“每承担 1 单位波动,换来多少超额回报”。一般认为夏普大于 1 算合格,大于 2 属优秀。但夏普有两个著名盲区:第一,它把上涨波动和下跌波动同等惩罚,而投资者其实只恨下跌;第二,它假设收益近似正态分布,对极端尾部风险不敏感。这两个盲区要靠后两节补上。
站长一算账:阿明夏普 0.8,阿强夏普 1.9——阿明每颠簸一分才换来八厘收益,阿强几乎“稳赚不颠”。结论很清楚:性价比上阿强完胜。
- 算策略年化收益用第一节的方法把累计收益折算成年化水平,作为分子的第一部分。
- 算超额收益减去无风险利率,剔除“躺着也能赚的钱”,留下策略真正的超额贡献。
- 除以年化波动用年化波动率作分母,把收益“归一化”成每单位风险的回报。
- 得到夏普比值把前两步合并成一个除法式子,这就是夏普比率的完整表达式。
最大回撤详解
站长正准备签阿强,突然想起去年台风夜:阿强连人带车摔了,歇了两周,收入直接清零。任何骑手都有“最惨时刻”,而投资策略的“最惨时刻”就是最大回撤。如果说波动率是“日常颠簸”,最大回撤就是“塌方式下跌”,专门考验你能扛多深。
最大回撤的定义很严格:从净值的历史最高点,一路跌到之后的最低点,这个跌幅的最大值。它回答的问题很朴素:“如果你运气差到在巅峰进场,最多会亏多少?”它比波动率更贴近真实心态,因为人们最难忘的不是每天的起伏,而是从高点的跌落。回撤还有一个残酷的不对称性:亏 20% 只需涨 25% 回本,亏 50% 却要涨 100% 才能回本($R_{recover} = D/(1-D)$),回撤越深,恢复越难。
站长把台风夜那两周的亏空标红:阿强的最大回撤是 30%。他心里清楚,真实世界往往是“跌起来比回测更狠”,这 30% 已经足够考验绝大多数人的心脏了——最大回撤是给投资者做“心脏体检”的指标。
- 追踪历史峰值每走到一个新时刻,先找出截至该时刻的净值最高点,作为比较基准。
- 计算瞬时回撤用峰值减当前净值再除以峰值,得到当前从高点回落的百分比。
- 取最深回撤在全部时间点上取回撤的最大值,即整个历史中最惨的一次下跌。
Calmar比率
综合两张表格,站长发现一个难题:阿明贡献了更高的峰值收入,阿强则从不大起大落。到底用哪张表拍板?他想起行业里的一个老规矩:看“一年赚的钱”和“最惨一次性亏损”的账,这个比值就是 Calmar 比率。
Calmar 比率 = 年化收益率 ÷ 最大回撤的绝对值。它把“最坏时刻”放进分母:每承受 1% 的最大回撤,换来多少年化收益。夏普比率用波动率做分母,关心的是“全程平均颠簸的性价比”;Calmar 用最大回撤做分母,关心“巅峰到谷底的性价比”。实战中,Calmar 特别适合过滤“尾部风险型”策略:某策略平时波动不大、夏普挺高,但某次黑天鹅直接腰斩——夏普看不出来,Calmar 立刻现形。反过来它也有局限:只看“最深的那个点”,忽略回撤持续的时间;新策略样本期短,最大回撤估计不足,Calmar 容易虚高,需搭配足够长的样本。
站长用 Calmar 算完账,阿强 2.1,阿明 0.5。他恍然大悟:“我不怕你平时颠簸,就怕你把最关键的黄金商圈大单搞砸一次。” Calmar 就是那把专盯“最惨时刻”的尺子。
- 算年化收益率把策略全程收益折算成年化口径,与回撤的时间维度保持一致。
- 取最大回撤绝对值最大回撤是下跌方向的百分比,取绝对值得到“损失幅度”。
- 两者相除年化收益除以最大回撤,得到每承受 1% 最深回撤换来的年化收益。
稳健性评估
体检报告全绿还不够。站长把阿强叫来:“上次台风天你发挥怎么样?如果平台改派单规则,你还跑得动吗?”这些“换环境考试”的做法,在量化里叫稳健性评估——检验策略在数据换一批、参数动一动、成本加一加之后,还赚不赚钱。
回测漂亮的策略常常是“过拟合”的:研究员调参数调到历史数据上完美,但换到新数据立刻失灵。对付过拟合有三大武器:一是样本外检验,把时间序列切成训练段和样本外段,只让策略“看过”前半段再考后半段;二是滚动前推(walk-forward),不停滚动地“训练一小段、验证下一小段”;三是参数敏感性分析,把参数略微扰动,看业绩是否剧烈崩塌。实际工程里还要把交易成本、滑点算进去——一个“扣完成本就不赚钱”的策略不值得实盘。
站长拿着“用晴天数据集训、再考雨天路线”的模拟记录,发现阿强样本外成绩只缩水了一成,而阿明从没做过这种演练——稳健性评估的意义,就是把“考试型选手”和“实战型选手”分开。
- 滚动切窗把历史区间切成 K 个“训练+验证”对,模拟不断用过去预测未来。
- 收集样本外收益每段的验证窗口算出一个收益率 r_k,它们共同构成样本外成绩单。
- 连乘复利把所有 1+r_k 连乘,模拟资金在滚动窗口中被持续投资。
- 还原累计收益连乘结果减 1,得到纯样本外累计收益率,用来和样本内表现对比。
市场环境适配
最后一个问题:平台下个月要调整派单算法,雨雪天单量翻倍,阿强还能不能保住金牌?市场就像天气,不会永远晴朗。一个策略在牛市是印钞机,到了熊市可能就是绞肉机——所以评估的最后一步,是看它在不同“天气”下的适应力。
实践中,把历史行情按状态划分:牛市(指数持续上涨)、熊市(持续下跌)、震荡市(来回拉锯),再分别统计策略在每个状态下的收益、回撤和夏普。还可以做压力测试,模拟极端行情(如 2020 年 3 月流动性危机)下的最坏结果。最后要设定策略生命周期预警:一旦实盘表现显著劣于历史分布,比如回撤超过历史最大回撤的 1.5 倍,就要降仓或停用重审。
站长在阿强的档案上盖下“金牌骑手”章,备注却写着“每季度复检一次”。市场环境会变,策略会衰减,评估不是一次性的体检,而是长期的健康管理。
- 标记市场状态按指数涨跌或波动水平,把每个时间段归类为牛、熊或震荡市。
- 分组统计参数只取某一市场状态下的策略收益切片,计算平均收益和标准差。
- 代入夏普公式将分组统计结果套进夏普公式,得到该市场状态的独立性价比。
AI 应用场景
量化私募的策略“体检评审”流水线
阶段:模型评估与上线决策
解决的问题:传统投研评审依赖研究员自报收益、回避回撤,口头汇报容易“报喜不报忧”。AI 平台把夏普、最大回撤、Calmar、样本外衰减比等指标全自动计算并生成标准化“体检卡”,让策略上会评审像骑手体检一样有据可查。
具体案例:某量化私募的 AI 投研平台每周对 1200 个候选因子策略做滚动回测,自动计算夏普、Calmar、最大回撤与样本外/样本内收益比;低于风控阈值的策略自动打上黄色预警进入人工复核,基金经理只需审阅红黄名单,评审时间从一天缩短到半小时。
智能投顾的“风险星级”翻译器
阶段:产品化与用户风险匹配
解决的问题:普通投资者看不懂“年化波动率 18%”,却听得懂“最多可能亏 8%”。用最大回撤和 Calmar 把专业指标翻译成用户能感知的风险标签,是智能投顾提升信任感的关键。
具体案例:某券商 App 的智能投顾在推荐基金组合时,用“骑手体检表”的思路计算组合的最大回撤与 Calmar,把“最大回撤 8%”翻译成“历史最差时约亏 8%”的风险胶囊,并结合用户风险测评分数做匹配,显著降低投诉率。
Python 演示
import math def compute_metrics(returns, rf_annual=0.02, periods=252): """给定日收益率序列, 计算年化收益/波动/夏普/最大回撤/Calmar""" n = len(returns) if n == 0: return None total = 1.0 for r in returns: total *= (1 + r) if total > 0: r_annual = total ** (periods / n) - 1 else: r_annual = -1.0 mean = sum(returns) / n var = sum((r - mean) ** 2 for r in returns) / (n - 1) vol_annual = math.sqrt(var) * math.sqrt(periods) if vol_annual > 0: sharpe = (r_annual - rf_annual) / vol_annual else: sharpe = 0.0 peak = 1.0 nav = 1.0 max_dd = 0.0 for r in returns: nav *= (1 + r) peak = max(peak, nav) dd = (peak - nav) / peak max_dd = max(max_dd, dd) calmar = r_annual / max_dd if max_dd > 0 else 0.0 return { "annual_return": r_annual, "annual_vol": vol_annual, "sharpe": sharpe, "max_drawdown": max_dd, "calmar": calmar, } if __name__ == "__main__": demo_returns = [ 0.006, -0.004, 0.008, -0.006, 0.010, -0.012, 0.007, -0.005, 0.009, -0.008, 0.011, -0.009, 0.005, -0.007, 0.008, ] m = compute_metrics(demo_returns) if m: for key, value in m.items(): print(f"{key}: {value:.4f}")
total *= (1 + r)把每天的净值倍数连乘,资金按复利滚动。r_annual = total ** (periods / n) - 1按时间比例把累计收益折算成年化收益。vol_annual = math.sqrt(var) * math.sqrt(periods)日波动率乘 √252 放大到年度。sharpe = (r_annual - rf_annual) / vol_annual if vol_annual > 0 else 0.0每承担 1% 年化波动换来的超额收益,波动为零时记 0。peak = max(peak, nav)实时刷新历史最高净值。dd = (peak - nav) / peak当前净值相对巅峰的回撤比例。calmar = r_annual / max_dd if max_dd > 0 else 0.0年化收益除以最大回撤的绝对值,最大回撤为零时记 0。
常见误区
误区“这个策略三年翻了 3 倍,回测曲线一路向上,肯定是个好策略!”很多新手选策略的第一眼永远只看累计收益,完全不问这收益背后忍受了多大波动、扛过多大回撤。
正解收益必须与风险放在一起看。夏普比率把波动率放进分母,Calmar 把最大回撤放进分母,都是在回答“这份收益是便宜买来的,还是拿命换来的”。就像站长不会因为阿明某个月收入破纪录就发金牌——他还要看那个月阿明吃了多少张超时罚单。翻 3 倍的背后若是 50% 的回撤,多数投资者在回撤中途就已割肉离场,根本等不到翻倍。
为何常见:累计收益是单一、直观的数字,而风险是多维、无形的东西。大脑天然对“多赚了”敏感,对“可能亏多少”迟钝,这是认知偏误在作怪。
误区“夏普 3 的肯定碾压夏普 1.5 的,直接满仓干!”初学者喜欢用单一指标排名,并把高夏普等同于稳赚不赔。
正解夏普有三大盲区:把上涨波动和下跌波动同等惩罚;假设收益接近正态分布,对极端尾部风险不敏感;本质是事后统计,样本外会衰减。所以高夏普也要结合最大回撤、Calmar 和样本外检验一起看。就像站长不能只凭“平均每天赚得稳”就提拔骑手,还要看他在台风演练里的表现。
为何常见:一个数字最容易被拿来排名和炫耀,而“夏普”这个名字听起来很官方,容易被当成“标准答案”。
误区“回测显示最大回撤只有 8%,那我实盘最多也就亏 8%,放心梭哈。”
正解回测是事后的,参数经过反复调整的结果,天然存在过拟合;实盘还要叠加交易成本、滑点、流动性冲击、策略拥挤等因素,真实回撤通常显著大于回测。业界习惯按“回撤放大 1.5~2 倍 + 样本外验证通过”来做压力预期。就像台风夜的演练成绩不能代表真实台风的破坏力,真实路况永远比沙盘复杂。
为何常见:人们容易把精心设计的回顾性测试结果误当成对未来的承诺,忽略了“事后看和事前看”的信息不对称。
误区“把一百个策略按夏普排个序,取前 10% 就完事了。”
正解单一指标排序会漏掉策略在其余维度上的短板:有的夏普高但回撤极深,有的 Calmar 好但极端行情下一击即溃,有的样本内惊艳、样本外崩盘。正确做法是构建“体检矩阵”:收益、波动、回撤、Calmar、稳健性、市场环境适配多维度打分,再结合策略容量与交易成本综合决策。就像站长从收入、波动、台风演练、投诉率多个维度给骑手打分,而不是只看月收入排名。
为何常见:排序是大脑处理多目标决策时最省力的捷径,但“多目标优化”本质上不存在一个唯一的排序,简化成单指标必然丢失关键信息。
面试题
Q1. 夏普比率的分子表示什么?
- A.策略收益减去无风险收益← 正确答案
- B.策略收益减去基准指数收益
- C.策略收益加上无风险收益
- D.策略年化收益与最大回撤之差
答案:A。夏普比率的分子是“超额收益”,即策略收益减去无风险利率,衡量扣掉“躺赚”部分后的真本事。选项 B 减基准指数对应的是信息比率的思想;C 方向反了;D 混淆了 Calmar 的分母。就像骑手扣掉底薪后,剩下的才是值得表扬的额外本事。
Q2. 日波动率转化为年化波动率时,近似乘以多少?
- A.12,一年的月份总数
- B.52,一年的周数总数
- C.√252,交易日数的开方← 正确答案
- D.252,一年的交易日数
答案:C。收益随时间线性累加,波动率则按时间平方根累积。一年约 252 个交易日,所以日波动率要乘 √252(约 15.87)得到年化波动率。A 是月份数、B 是周数、D 是纯天数,都偏离了波动率的时间聚合规则。
Q3. 净值从峰值 1.2 跌到最低 0.6,最大回撤是多少?
- A.约 50%,以历史峰值为基准计算← 正确答案
- B.约 40%,以初始净值为基准计算
- C.约 60%,以起始本金为基准计算
- D.约 100%,用差值除以最低净值
答案:A。最大回撤的分母是“历史峰值”而不是初始净值或最低净值,因此 (1.2-0.6)/1.2=50%。B 以初始净值 1.0 为基准得到 40%,C 用差值除以起始本金得到 60%,D 用差值除以最低净值得到 100%,都是错误口径。回撤必须站在“从峰值看跌了多少”的角度计算。
Q4. Calmar 比率的分母使用哪个指标?
- A.策略年化收益率的波动程度
- B.策略随市场整体波动的幅度
- C.策略历史最大回撤的绝对值← 正确答案
- D.货币市场的无风险利率水平
答案:C。Calmar = 年化收益 ÷ 最大回撤的绝对值,分母是最大回撤。A 是夏普的分母(波动率),B 与市场波动相关,D 与 Calmar 无关。Calmar 关注的是“最坏时刻”而非“平均颠簸”,这正是它与夏普互补的地方。
Q5. 策略亏损 50% 后,回到本金需要上涨多少?
- A.上涨和亏损幅度相等的 50%
- B.上涨大约 75% 才能完全回本
- C.需要上涨 100% 才能完全回本← 正确答案
- D.需要上涨 150% 才能完全回本
答案:C。回撤恢复具有不对称性:亏 50% 后本金只剩 50%,需要涨 100% 才能回到原点,公式为 D/(1-D)=0.5/0.5=1。A 只能回本一半,B 和 D 都不满足回本条件。这也是最大回撤对心理冲击如此之大的数学根源。
Q6. 关于夏普比率的局限,下列哪项描述是错误的?
- A.它把上涨下跌波动同等计入风险
- B.它依赖近似正态分布的收益假设
- C.它能精准捕捉极端下跌的尾部风险← 正确答案
- D.它是基于历史数据的事后统计指标
答案:C。夏普的局限性包括:对上涨与下跌波动一视同仁、假设收益近似正态、以及事后统计会样本外衰减。它恰恰不擅长刻画极端尾部风险,所以 C 描述错误。A、B、D 都是公认的局限。就像体检表测不出“突然心梗”的概率,夏普也测不出黑天鹅。
Q7. 某策略样本内夏普 3.0,样本外仅 1.2,最合理的判断是?
- A.实盘应完全复制样本内的表现
- B.存在过拟合且实盘表现会打折← 正确答案
- C.说明市场环境一直都没有变化
- D.应该直接加大仓位以博取高收益
答案:B。样本内夏普 3.0 到样本外 1.2 是明显的“衰减”,这是过拟合的典型信号,说明策略对历史噪声过度敏感,实盘表现大概率会打折扣。A 过于乐观,C 无法从夏普差异推断市场状态,D 在过拟合信号下加仓是危险的错误操作。
Q8. 下列哪些属于策略稳健性评估的手段?
- A.滚动前推的样本外检验← 正确答案
- B.对关键参数做敏感性分析← 正确答案
- C.把无风险利率直接调高两倍
- D.计入交易成本和冲击成本← 正确答案
答案:ABD。稳健性评估的常用手段包括:滚动前推的样本外检验(A)、参数敏感性分析(B)、以及把交易成本和冲击成本计入后的压力测试(D)。C 调整无风险利率只是改动假设参数,并不是稳健性检验手段。就像台风演练要换天气、换路线、加负重,才算真正考验骑手。
Q9. 关于策略评估指标,以下哪些说法是正确的?
- A.最大回撤刻画最差时点入场的浮亏← 正确答案
- B.卡玛比率是年化收益除以最大回撤← 正确答案
- C.波动率只捕捉下跌方向的单边风险
- D.压力测试用来模拟极端行情的表现← 正确答案
答案:ABD。A 正确,最大回撤刻画“最差时点入场”的最深浮亏;B 正确,Calmar 正是年化收益÷最大回撤;D 正确,压力测试就是模拟极端行情。C 错误,波动率同时统计上涨和下跌两侧,只有下行波动率才只捕捉单边风险。夏普和波动率都“分不清方向”,这正是它们需要被补充的原因。
Q10. 关于回撤恢复的不对称性,以下哪些是正确的?
- A.恢复所需涨幅通常大于回撤的幅度← 正确答案
- B.回撤 20% 后需要涨 25% 才能回本← 正确答案
- C.回撤越深恢复难度呈加速上升趋势← 正确答案
- D.回撤 10% 后仅需上涨约 9% 回本
答案:ABC。A、B、C 都正确:恢复所需涨幅大于回撤幅度,回撤 20% 需要涨 25% 回本,且回撤越深恢复难度呈加速上升。D 错误,回撤 10% 需要涨 11.1%(10%/90%)而不是 9%。这条不对称性提醒我们:控制回撤比追求收益更优先。