交易中的数学:夏普(Sharpe)和索蒂诺(Sortino)比率(基础篇)
夏普和索蒂诺:专业玩家看回报之外的尺子
很多人盯账户只算投资回报率,哪个策略赚得多就觉得哪个好。但回报率不剔除波动噪音,遇到外汇或贵金属这种高杠杆品种,一次黑天鹅就能把漂亮曲线打回原形。 专业交易者更信夏普比率和索蒂诺比率:前者用总波动衡量单位风险的超额收益,后者只算下行波动,更贴近「亏钱才疼」的真实体感。 原文作者在 2022 年 4 月 4 日发布的这篇讨论里提到,相关策略评估细节在其早前《交易中的数学:如何评估交易结果》中已有铺陈,那篇可作为前置读物。开 MT5 把历史回测跑一遍,分别调出两个比率,比单纯看净值曲线更能判断策略是否经得起折腾。
「用夏普比率横向比策略」
做组合的人常会同时跑好几套策略、持不同资产,难点在于怎么把它们的风险收益放在同一把尺子上量。夏普比率就是1966年诺奖得主威廉·F·夏普给出的那把尺:拿平均回报减掉无风险回报,再除以回报标准差。 公式长这样:Sharpe Ratio = (Return - RiskFree)/Std。Return是某段时间的均值回报,可以按月、季、年算;RiskFree是同期的无风险回报,通常取存款或国债这类近似零风险收益;Std是组合回报的标准差,偏离预期越大,账户波动和风险越高。 这套算法有个硬伤:源数据得是正态分布。也就是说收益分布要对称,不能出现尖峰或深坑,否则比出来的数会骗人。外汇和贵金属杠杆高、跳空多,分布经常不正态,用之前先瞅一眼直方图形状。
Sharpe Ratio = (Return - RiskFree)/Std
◍ 回报怎么算才接得上夏普
回报率是按选定时段内资产价值的变动来定的,它和夏普比率用的是同一段窗口。常见做法是看年度夏普,但季度、月度甚至每日回报也能算,窗口越短越能抓波动细节。 单段回报写成相对变化最直观:Return[i] = (Close[i]-Close[i-1])/Close[i-1],也就是本段收盘价比上一段收盘价多出来的比例。绝对变化 Delta[i] 除以上一期末的 Previous,结果一样。 想用日线凑出年度夏普,就得把年内每天回报先加总再除以天数 N,得到平均日回报。外汇和贵金属杠杆高、跳空频繁,日回报序列常被极端值拽偏,算之前最好先剔掉异常 K 线。
Return[i] = (Close[i]-Close[i-class="num">1])/Close[i-class="num">1] Return[i] = Delta[i]/Previous Return = Sum(Return[i])/N
夏普比率里的零无风险回报
在跨策略横向比较时,夏普比率要求时间间隔一致,这时把无风险回报设为零是一种常见处理。逻辑上风险从不会真正消失,所谓无风险回报只是比较框架里的条件假设,不是市场事实。 外汇与贵金属杠杆交易本身高风险,用零无风险回报算出的夏普值只反映策略相对波动,不暗示保本。 实际在 MT5 策略测试器里验证时,可直接把基准变量置零,看回测夏普如何随样本区间变化。
RiskFree = class="num">0「用标准差量化回报离散度」
标准差衡量的是随机变量相对均值的偏离程度。做回报分析时,先求出一段样本的平均回报,再把每个样本回报与均值的差的平方累加起来,得到总离散量。 把累加的平方差之和除以样本数 N,得到方差 D;对方差开根号,就是标准偏差 STD。公式上就是 D = Σ(Return - Return[i])² / N,STD = √D。 在 MT5 里你可以直接拿这段逻辑验证:先按持仓或笔数算出 Return 数组,循环累加 (Return - Return[i]) 的平方,除以 N 后调用 MathSqrt 得到 STD。外汇与贵金属波动剧烈,STD 只描述历史离散,不代表未来风险可控,高杠杆下仍可能快速回撤。
D = Sum((Return - Return[i])^class="num">2 )/N STD = SQRT(D)
◍ 把夏普比率折算成年化口径
夏普比率自 1966 年定型后算法核心没动过,只是名字更现代了。早先按年回报评估资金,后来改成月度数据再映射成年化值,目的就是让不同周期的策略能放在同一把尺子上比。 要把任意周期算出的 Sharpe 扩到年度,只需乘上「年度间隔数 ÷ 当前间隔数」的平方根。比如用日线回报算出 SharpeDaily,一年按 252 个交易日算,乘 √252 即得 SharpeAnnual;若用的是 H1 周期,一根 D1 含 24 根 H1,先乘 √24 转成日频,再乘 √252 年化。 这里有个细节:不是所有品种都 24 小时连续交易。但只要你对比的是同一产品、同一时间帧下的策略,这个折算偏差不影响横向比较。外汇和贵金属波动大、杠杆高,夏普只是风险调整后收益的参考,年化数字高不代表实盘盈利概率高。 SharpeAnnual = SQRT(252)*SharpeDaily // 252 working days in a year SharpeDaily = SQRT(24)*SharpeHourly // 24 hours fit into D1 在 MT5 里跑完策略测试,把日志里的日频或小时频夏普按上面两行乘一下,就能直接跟别人年化的结果对标,不用重新跑长周期回测。
SharpeAnnual = SQRT(class="num">252)*SharpeDaily class=class="str">"cmt">// class="num">252 working days in a year SharpeDaily = SQRT(class="num">24)*SharpeHourly class=class="str">"cmt">// class="num">24 hours fit into D1