金融量化指标--5Sortino索提诺比率
Sortino索提诺比率计算指标公式
添加图片注释,不超过 140 字(可选)
一、索提诺比率是什么?
核心定义: 索提诺比率衡量的是每承受一单位下行风险(Downside Risk),所能获得的超额回报(超过最低可接受回报的部分)。
与夏普比率不同,索提诺比率的核心思想是:
并非所有的波动都是坏的。 价格上涨带来的波动(上行波动)是投资者喜闻乐见的。
只有下跌带来的波动(下行波动)才是真正的风险。 投资者真正担忧的是资产价格低于其预期或低于某个目标水平的可能性。
因此,索提诺比率通过只关注“坏”的波动,为投资者提供了一个更精准的风险评估视角。
二、计算公式与组成部分
索提诺比率的计算公式如下:
Sortino Ratio = (Rp - Rf) / DR
其中:
Rp(Portfolio Return): 投资组合或策略在一段时间内的平均收益率 或年化收益率。
Rf(Risk-Free Rate): 无风险利率(例如美国国债收益率)。在某些情况下,投资者会使用一个自己设定的最低可接受回报率(Minimum Acceptable Return, MAR) 来代替Rf。MAR可以是0(保本)、通货膨胀率或一个固定的目标收益率。
DR(Downside Deviation): 下行偏差,这是索提诺比率的核心,也是它与夏普比率(使用总标准差)的关键区别。
重点详解:下行偏差(Downside Deviation)的计算
下行偏差不是简单的下跌时的标准差。它的计算有特定步骤:
设定目标基准(Target Benchmark): 通常是MAR或Rf。
计算超额回报序列: 记录投资组合每个周期(如每天、每月)的收益率,并减去目标基准(MAR或Rf),得到一系列超额回报值。 Excess Return_t = Return_t - MAR
只关注负的超额回报: 对于每个周期,如果超额回报是正的(即收益高于目标),我们将其视为“无风险”,在计算风险时忽略它。如果超额回报是负的(即收益低于目标),我们保留这个负值。
计算这些负值的标准差: 对这些被保留的负的超额回报值求标准差,就得到了下行偏差。
简而言之,下行偏差只计算了收益率低于目标基准的那些波动程度,而上行波动被完全排除在外。
三、与夏普比率(Sharpe Ratio)的对比
这是一个理解索提诺比率优势的关键环节。
特性 | 索提诺比率 (Sortino Ratio) | 夏普比率 (Sharpe Ratio) |
---|---|---|
风险定义 | 下行风险 (Downside Risk) | 总风险 (Total Risk),即总标准差 |
波动处理 | 区分好坏波动。只惩罚低于目标的波动(坏波动)。 | 不区分好坏波动。对所有波动(无论涨跌)都一视同仁地视为风险并进行惩罚。 |
适用场景 | 更适合评估收益分布不对称(非正态) 的策略,如趋势跟踪、期权卖方策略等。这些策略可能平时小幅盘整或上涨,偶尔大幅下跌。 | 更适合评估收益分布相对对称的策略。 |
对策略的评价 | 更能凸显那些控制下行风险能力强的策略的优势。如果一个策略上涨时波动大但下跌时波动小,其索提诺比率会非常出色。 | 可能会低估那些上涨波动大、但下行控制好的策略。因为上涨的波动也被算作风险,拉低了比率值。 |
公式差异 | 分母 = 下行偏差 (Downside Deviation) | 分母 = 总标准差 (Standard Deviation) |
举例说明: 假设有两个策略A和B,它们的年化收益率都是15%,无风险利率为2%。
策略A: 平稳上涨,偶尔小跌。总标准差为10%,但下行偏差只有5%。
策略B: 大起大落,涨跌都很剧烈。总标准差为10%,下行偏差也是9%。
计算:
夏普比率: 两者相同。(15% - 2%) / 10% = 1.3
索提诺比率:
策略A: (15% - 2%) / 5% = 2.6
策略B: (15% - 2%) / 9% ≈ 1.44
结论: 夏普比率认为两个策略一样好。但索提诺比率清晰地告诉我们,策略A的下行风险控制得更好,因此它的风险调整后收益远高于策略B。对于厌恶亏损的投资者来说,策略A显然是更优的选择。
四、如何解读索提诺比率
数值越高越好: 较高的索提诺比率意味着在承担相同单位的下行风险时,该策略能获得更高的超额回报。
正负值:
正值: 表示策略收益超过了目标基准(MAR/Rf)。
负值: 表示策略收益未能达到目标基准,该策略可能不值得投资。
比较性指标: 索提诺比率本身没有绝对意义,它的价值主要体现在横向比较不同投资策略、基金或资产时。在相同的MAR和时间周期下,比率高的更优。
绝对数值参考: 通常认为:
Sortino Ratio > 2: 非常优秀
Sortino Ratio > 1: 不错
Sortino Ratio < 1: 一般或较差
五、优点与局限性
优点:
更符合实际心理: 精准地捕捉了投资者对“亏损”的厌恶,而非对“波动”的厌恶。
更好地评估不对称策略: 对那些追求上涨潜力、严格控制下跌的策略(如“尾部风险对冲”策略)能给出更公平、更高的评价。
聚焦下行风险: 直接回答了投资者最关心的问题:“我可能亏多少钱?”
局限性:
对MAR的选择敏感: 使用不同的最低可接受回报率(MAR)会计算出截然不同的索提诺比率。例如,用0%作为MAR和用5%作为MAR,结果差异会很大。因此,在比较时必须确保使用的MAR一致。
仍需依赖历史数据: 和所有基于历史数据的指标一样,它假设过去的下行风险能代表未来,但这并非总是成立。
未考虑下行频率: 它衡量的是下行波动的幅度(波动率),但没有告诉你下行事件发生的频率。一个经常小亏的策略和一个极少发生但一亏就是巨亏的策略可能拥有相似的下行偏差。
不是万能的: 它不能替代其他分析。仍需结合最大回撤、胜率、盈亏比等指标综合判断一个策略的质量。
六、实际应用示例
假设你是一个基金经理,比较两个过去3年的策略:
策略X(稳健增长型):
年化收益率(Rp) = 12%
无风险利率(Rf) = 2%
下行偏差(DR) = 5%
索提诺比率 = (12 - 2) / 5 = 2.0
策略Y(高波动成长型):
年化收益率(Rp) = 20%
无风险利率(Rf) = 2%
下行偏差(DR) = 15%
索提诺比率 = (20 - 2) / 15 = 1.2
分析: 虽然策略Y的总收益率更高(20% vs 12%),但其索提诺比率(1.2)远低于策略X(2.0)。这意味着策略Y为获得其超额收益,承担了不成比例的高下行风险。
对于风险厌恶型投资者(如退休人士),策略X显然是更高效、更优质的选择。而愿意承受巨大波动以博取高回报的激进投资者,可能会选择策略Y,但索提诺比率明确揭示了其风险代价。
总结
索提诺比率通过聚焦下行偏差, refine(优化)了风险调整后收益的衡量方法,为投资者提供了一个更敏锐的工具来识别那些“涨得多、跌得少”的优秀策略。它是量化交易和基金评估中不可或缺的核心指标之一,尤其在对比不同风险收益特征的策略时,其价值远超传统的夏普比率。然而,使用时务必注意其局限性,并确保在同等条件下进行比较。
python计算的源代码
import numpy as np
import pandas as pddef calculate_sortino_ratio(returns, risk_free_rate=0.0, periods_per_year=252, min_acceptable_return=None):"""计算索提诺比率参数:returns -- 投资组合或策略的收益率序列 (pd.Series或np.array)risk_free_rate -- 无风险利率 (年化,默认0.0)periods_per_year -- 数据频率,252为日数据,12为月数据 (默认252)min_acceptable_return -- 最低可接受回报率(MAR),如果为None则使用risk_free_rate返回:sortino_ratio -- 索提诺比率"""# 确保returns是numpy数组returns = np.asarray(returns)# 设置最低可接受回报率(MAR)if min_acceptable_return is None:min_acceptable_return = risk_free_rate# 将年化利率转换为每期利率min_acceptable_return_per_period = (1 + min_acceptable_return) ** (1/periods_per_year) - 1# 计算平均收益率mean_return = np.mean(returns)# 计算超额收益 (超过MAR的部分)excess_returns = returns - min_acceptable_return_per_period# 只保留负的超额收益 (即收益低于MAR的部分)negative_excess_returns = excess_returns[excess_returns < 0]# 计算下行偏差 (即负超额收益的标准差)if len(negative_excess_returns) > 0:downside_deviation = np.std(negative_excess_returns, ddof=1) # 使用样本标准差(ddof=1)else:# 如果没有下行风险,下行偏差设为0,但这种情况理论上不应发生downside_deviation = 0# 年化平均收益率annualized_mean_return = (1 + mean_return) ** periods_per_year - 1# 年化下行偏差annualized_downside_deviation = downside_deviation * np.sqrt(periods_per_year)# 计算索提诺比率if annualized_downside_deviation > 0:sortino_ratio = (annualized_mean_return - min_acceptable_return) / annualized_downside_deviationelse:# 如果下行偏差为0,索提诺比率设为无穷大(理论上完美策略)sortino_ratio = float('inf')return sortino_ratio# 示例使用
if __name__ == "__main__":# 生成示例收益率数据 (年化收益率约15%,波动率约20%)np.random.seed(42)n_periods = 252 # 一年交易日daily_returns = np.random.normal(0.0005, 0.012, n_periods)# 计算索提诺比率sortino_ratio = calculate_sortino_ratio(returns=daily_returns,risk_free_rate=0.02, # 2%无风险利率periods_per_year=252)print(f"索提诺比率: {sortino_ratio:.4f}")# 使用实际数据示例 (需要安装yfinance库)try:import yfinance as yf# 获取苹果公司股票数据data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')returns = data['Adj Close'].pct_change().dropna()# 计算索提诺比率aapl_sortino = calculate_sortino_ratio(returns=returns,risk_free_rate=0.02,periods_per_year=252)print(f"AAPL索提诺比率(2020-2022): {aapl_sortino:.4f}")except ImportError:print("要运行实际数据示例,请先安装yfinance: pip install yfinance")