Python量化交易:如何计算夏普比率?衡量风险调整后收益

那天一个客户问我:年化20%收益算高吗?

上周有个程序员来开户,上来就跟我炫耀他的策略回测年化20%。我笑了笑没说话,给他看了另一个策略——年化15%,但最大回撤只有他的一半。他当场就愣住了:"这...这到底哪个更好?"

这就是我今天要聊的夏普比率(Sharpe Ratio)的意义。光看收益率就像买车只看最高时速——保时捷能跑300km/h,但你要是天天在市区开,还不如买个油耗低的丰田实在。

夏普比率到底是什么?

简单说,就是每承担一单位风险,能换来多少超额收益。公式长这样:

夏普比率 = (投资组合收益率 - 无风险利率) / 投资组合波动率

我常跟客户说,这就像外卖小哥的"每公里收入":A小哥一天跑100公里赚500块,B小哥跑50公里赚400块。单看总收入A更高,但算算每公里收入,B小哥其实更划算。

手把手用Python计算

假设我们已经有了每日收益率数据returns(别急,后面会教你怎么获取):

import numpy as np

# 假设无风险利率年化3%
risk_free_rate = 0.03 / 252  # 换算到日利率

def calculate_sharpe(returns):
    excess_returns = returns - risk_free_rate
    sharpe_ratio = np.sqrt(252) * excess_returns.mean() / excess_returns.std()
    return sharpe_ratio

上周有个做IT的小伙子问我:"为什么要乘以根号252?" 这里有个行业常识:我们把日波动率年化处理。252是一年大概的交易天数,就像你们程序员算并发量要区分QPS和TPS一样。

真实案例:两个策略的对比

去年有个客户同时跑了两个策略:

  • 策略A:年化收益35%,波动率25%
  • 策略B:年化收益28%,波动率12%

用夏普比率一算:

  • A策略:(35%-3%)/25% = 1.28
  • B策略:(28%-3%)/12% = 2.08

结果很明显——B策略每承担1%风险,能换来2.08%超额收益,完胜A策略。这个客户后来把主要仓位都调到了B策略,今年熊市里少亏了不少钱。

获取收益率数据的三种姿势

很多新手卡在第一步——数据从哪来?我常用的方法:

  1. 券商API(悄悄说,我们券商提供的Python接口比别家快30ms):
from brokerage_api import get_history_data
data = get_history_data('600519.SH', start='2020-01-01')
  1. 第三方库(适合小白):
import akshare as ak
df = ak.stock_zh_a_daily(symbol="sh600519")
  1. 本地缓存(适合高频交易):
import pandas as pd
returns = pd.read_parquet('local_data.parquet')['close'].pct_change()

那些年我踩过的坑

刚开始做量化时,我犯过一个低级错误——用收盘价直接算收益率。结果夏普比率高得离谱,实盘一跑就现原形。后来才明白要用复权价格,就像比较两个基金收益要看累计净值一样。

还有个客户更逗,他用了5分钟线数据计算年化夏普,但忘记调整时间尺度。相当于用"每分钟能跑多少米"直接推算"每年能跑多远",结果策略实盘后风险完全失控。

进阶技巧:滚动夏普比率

成熟的量化玩家不会只看静态指标。这是我的私房代码:

def rolling_sharpe(returns, window=63):
    rolling_mean = returns.rolling(window).mean()
    rolling_std = returns.rolling(window).std()
    return np.sqrt(window) * (rolling_mean - risk_free_rate) / rolling_std

这就像开车不仅要看当前车速,还要看过去一段时间的速度波动。去年有个客户用这个方法发现策略夏普持续下降,及时止损躲过了后来的暴跌。

开户后能做什么?

在我们这开户的量化用户,有三件事做得特别6:

  1. 直接对接交易所数据源,比免费API快0.5秒
  2. 使用我们的回测引擎,比自建系统省70%时间
  3. 享受专属保证金利率,年化能省2-3个点成本

上周还有个客户用我们的算法交易接口,把冲击成本降低了0.3%,相当于每年多赚一辆Model 3。

夏普不是万能的

最后说句掏心窝的话:夏普比率就像汽车油表,重要但不是全部。我见过夏普3.0的策略实盘亏钱,也见过夏普1.5的策略稳定盈利。关键是要结合最大回撤、胜率、盈亏比一起看。

就像去年有个客户,他的网格策略夏普只有1.2,但加上打新收益和融资套利,整体夏普能做到2.8。这提醒我们:好的量化交易应该是组合拳

(对了,最近我们券商针对Python量化用户推出了零门槛程序化交易权限,开户时记得找我拿特别通道)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐