夏普比率 —— Python 实现

文章目录

  • 一、夏普比率
    • 1.投资预期收益率
    • 2.投资标准差
  • 二、单个投资夏普比率实例
  • 三、投资组合夏普比率实例
  • 四、sharpe_ratio() 函数

一、夏普比率

其数值意思为在承受单位风险的情况下,所能获取的回报。
计算公式:
S h a r p e R a t i o = E ( R P ) − R f σ P SharpeRatio=\frac {E(R_P)-R_f} {\sigma _P} SharpeRatio=σPE(RP)Rf
其中, E ( R p ) E(R_p) E(Rp) 是投资预期报酬率, R f R_f Rf 是无风险利率(常用国债利率), σ P \sigma_P σP 是投资标准差。

1.投资预期收益率

别名:期望投资报酬率

计算公式:
E ( R P ) = 期 望 投 资 收 益 / 投 资 成 本 × 100 % E(R_P)=期望投资收益/投资成本×100% E(RP)×100

eg:某物业售价 200 W 200W 200W,同等物业月租金 2 W 2W 2W,转售成交价 215 W 215W 215W
出 租 投 资 报 酬 率 = 2 W ∗ 12 ( 月 数 ) 200 W = 12 % 出租投资报酬率=\frac {2W*12(月数)}{200W}=12\% =200W2W12=12%
售 出 投 资 报 酬 率 = 215 W − 200 W 200 W = 7.5 % 售出投资报酬率=\frac {215W-200W} {200W}=7.5\% =200W215W200W=7.5%

2.投资标准差

计算公式:
σ p = ∑ i = 1 n ( x i − x ˉ ) 2 n \sigma_p=\sqrt{\frac{\sum_{i=1}^{n}(x_i-\bar{x})^2}{n}} σp=ni=1n(xixˉ)2
其中, x i x_i xi为第 i i i 天收益率, x ˉ \bar x xˉ 为收益率平均数, n n n 为天数。

二、单个投资夏普比率实例

假设计算十天数据,使用随机函数生成随机利润百分数,假设年无风险利率为3%

# 数据天数
n=10
# 假设年无风险利率
rf=3
# 随机生成 n 天利润百分数
data=np.random.normal(size=(n))
'''
数据为:array([ 0.23239275,  0.06663936, -0.5533271 , -0.79159902,  0.72197139,
		       0.97178241,  2.18499703,  0.51868447, -0.41878817, -0.51338701])
'''

计算年月日夏普比率

# 投资预期收益率 - 无风险利率
erp_rf=data.sum()/n-rf/252
'''
data.sum()/n 为 n 天利润百分数平均值
rf / 252 对应日无风险利益
'''
# 投资标准差
sigmap=data.std()

import math
# 关于 period(数值,意义):(252,日夏普),(52,周夏普),(12,月夏普),(1,年夏普)
period=252
Sharpe=erp_rf/sigmap*math.sqrt(period)

三、投资组合夏普比率实例

注:随机选取了5个股票数据(来自雅虎),在做的项目刚好有股票数据,就拿来使用了

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 使用雅虎得到股票数据,选其中5个股票收盘价数据
print(stock_data)
'''
			d_spy_TEL	d_spy_HON	d_spy_ADP	d_spy_FIS	d_spy_ICE
2007-11-09	32.570000	55.066624	41.027218	41.779999	33.088001
2007-11-12	31.360001	54.466000	40.930641	42.900002	32.270000
2007-11-13	32.349998	55.428905	41.404739	43.730000	33.580002
2007-11-14	32.500000	55.791183	41.633011	43.360001	34.228001
2007-11-15	33.099998	54.494602	41.167690	43.240002	34.500000
	  ...		...			...			...			...			...
2008-08-20	33.439999	46.228889	38.805969	22.230000	17.114000
2008-08-21	33.189999	46.476765	39.262512	22.160000	16.830000
2008-08-22	32.900002	47.477802	39.622475	22.330000	17.620001
2008-08-25	32.099998	46.286091	38.718174	21.969999	16.990000
2008-08-26	32.000000	46.657906	38.832310	21.790001	16.948000

200 rows × 5 columns
'''

计算组合收益

# pct.change() 函数计算第 i 天相对第 i-1 天变化的百分率
# drop() 丢弃nan数据
# stock_ratio 为五个股票数据199天的收益率
stock_ratio=stock_data.pct_change().dropna()

# 5个股票权重(生成随机数并标准化)
weight=np.random.uniform(size=5)
weight/=weight.sum()
'''
array([0.14724825, 0.0809638 , 0.26815966, 0.24306394, 0.26056435])
'''

# 根据权重计算5个股票收益率
stock_ratio_weight=stock_ratio.mul(weight, axis=1)
# 添加一列数据:组合收益率
stock_ratio_weight['portfolio']=stock_ratio_weight.sum(axis=1)

'''
			d_spy_TEL	d_spy_HON	d_spy_ADP	d_spy_FIS	d_spy_ICE	portfolio
2007-11-12	-0.005470	-0.000883	-0.000631	0.006516	-0.006442	-0.006911
2007-11-13	0.004648	0.001431	0.003106	0.004703	0.010578	0.024466
2007-11-14	0.000683	0.000529	0.001478	-0.002057	0.005028	0.005662
2007-11-15	0.002718	-0.001882	-0.002997	-0.000673	0.002071	-0.000762
2007-11-16	0.008541	-0.001813	0.001544	-0.001518	0.003837	0.010591
		...		...			...			...			...			...			...
2008-08-20	-0.003901	-0.000941	0.000121	-0.001952	0.008068	0.001396
2008-08-21	-0.001101	0.000434	0.003155	-0.000765	-0.004324	-0.002601
2008-08-22	-0.001287	0.001744	0.002459	0.001865	0.012231	0.017011
2008-08-25	-0.003581	-0.002032	-0.006120	-0.003919	-0.009316	-0.024968
2008-08-26	-0.000459	0.000650	0.000790	-0.001991	-0.000644	-0.001653

199 rows × 6 columns
'''

组合投资收益

stock_ratio_weight.portfolio.plot()
plt.show()

夏普比率 —— Python 实现_第1张图片
累积收益曲线

all_portfolio = ((1+stock_ratio_weight['portfolio']).cumprod()-1)
all_portfolio.plot(label='portfolio')
plt.legend()
plt.show()

夏普比率 —— Python 实现_第2张图片

# 组合收益率
data=np.array(stock_ratio_weight.portfolio)

# 计算方法同单个投资实例
erp_rf=data.sum()/n-rf/252
sigmap=data.std()
Sharpe=erp_rf/sigmap*math.sqrt(period)

四、sharpe_ratio() 函数

函数来源自库:empyrical【金融评测指标库】

# 函数定义
def sharpe_ratio(returns,
                 risk_free=0,
                 period=DAILY,
                 annualization=None,
                 out=None):
'''
	Parameters
    ----------
    returns : pd.Series or np.ndarray
		策略的日利率,非累积的利率。
    risk_free : int, float
        无风险利率
    period : str, optional
    	计算结果的夏普比率类型:
    	年、季、月、周、日
        'yearly'、'quarterly'、'monthly'、'weekly'、'daily'
'''

你可能感兴趣的:(python,数据处理,金融量化)