inr是什么代号,inr是什么项目

  

  如何衡量一个量化策略的好坏?一是相对稳定的收入,二是严谨的回测,三是清晰的逻辑。刘付兵   

  

  引言   

  

  虽然介绍不能代表过去的未来,但是通过历史回测来评估量化策略还是很重要的。量化回测过程中常用的指标有年化收益率、最大回撤、beta、alpha、夏普比率、信息比率等。(见下图)。目前很多量化网站都可以提供Python的量化回测框架,如Jukuan、Youkuang、Wankuang、Zipline、vnpy、pyalgotrade等,为我们评估量化策略提供了很好的交互平台。毕竟平台的使用有其局限性。如果不使用平台,怎么用python写一个简单的定量回测框架?本文将一步步向您展示如何使用python来计算量化的策略风险指标。本文提及的股票仅供学习范例,不构成投资建议。   

  

     

  

  (来源:优矿通联实验室)   

  

  01   

  

  指数含义和公式   

  

  0   

  

  1   

  

  累计收益率与年化收益率   

  

  年化收益率是将当前收益率(日收益率、周收益率、月收益率)换算成人收益率计算出来的。这是一个理论回报率,但不是真正实现的回报率。因为年化收益率是可变的,年化收益率不一定和年化收益率一样。   

  

  累积回报率:   

  

     

  

  其中,PT为期末卖出时的价格,Pt为期初买入时的价格。   

  

  年回报率:   

  

     

  

  其中R为期间总收益率,M为N(可以是日、周、月)对应的计算期间。按照计算惯例,m=250,52,12分别指日,周,月换算成年。   

  

  0   

  

  2   

  

  最大回撤   

  

  所选周期内任意历史点的回推,最低点的收益率回撤的最大值。最大回撤用来描述可能出现的最坏情况。最大回撤是一个重要的风险指标,对于量化策略交易来说比波动率更重要。   

  

  p是某一天的净值,I是某一天,J是I之后的某一天,Pi是第I天的产品净值,Pj是Pi之后的某一天的净值。   

  

  基金的最高提取额计算如下:   

  

     

  

  也就是通过评估每个净值的回撤率,然后找出最大的一个。   

  

  0   

  

  3   

  

  Beta和Alpha   

  

  :相当于业绩评价基准收益的整体波动率,计算方法如下:   

  

     

  

  Pi和Pm分别指个股(组合)和市场(如上证综指)的收益率序列,值常用来衡量某一策略的系统性风险。   

  

  其含义可以简单理解为:如果Beta为1,则策略和市场(如沪深300指数)的波动率相同;如果大于1,策略波动大于市场,比如2,那么当市场上涨10%时,策略上涨20%;反之亦然,达拉斯到礼堂如果小于1,策略的波动小于市场。如果是0.8,当大盘上涨10%时,策略上涨8%。反之亦然。   

  

  值是多少?这个具体问题还得具体分析。如果是牛市,个股和大盘都在飙升,大Beta值的策略占优;如果是熊市,值小的策略占优。   

  

  :根据系数计算出的实际收益与预期收益之间的差额。代表策略超过预期回报率的程度。   

  

  您可以使用资本资产定价模型(CAPM)来估计策略的beta和alpha值:   

  

     

  

  E(ri)是股票I的预期收益率,rf是无风险利率,rm是市场指数收益率;贝塔系数用于评估股票市场的波动性。   

风险与投资机会的方法中,常用来衡量结构性与系统性风险,可以简单理解为个股波动相对大盘波动的偏离程度。CAPM的计量模型可以表示为:

  


  

  


  

alpha可以理解为超额收益率,最后一项是随机扰动,可以理解为个体风险。

  

0

  

4

  

夏普比率和信息比率

  

夏普比率代表每多承担一份风险,可以获得几份回报,即单位风险所获得的超额回报,该比率越高,策略承担单位风险得到的超额回报越高,所以夏普比率越高越好。

  


  

  


  

其中,Rp为策略年化收益率,Rf是无风险收益率,

  

  

为年化标准差。

  

信息比率:含义与夏普比率类似,只不过其参照基准不是无风险收益率,而是策略的市场基准收益率。

  


  

  


  

其中,Rp为策略年化收益率,Rm为基准年化收益率(如沪深300指数),

  

  

为策略与基准每日收益率差值的年化标准差。

  

02

  

Python计算量化指标

  

  

使用tushare获取交易数据,考虑最简单的策略:买入持有!分别计算期间总收益率,年化收益率,最大回撤,beta、alpha系数,夏普比率和信息比率。

  

  

#先引入后面可能用到的包(package)import pandas as pd import numpy as npimport matplotlib.pyplot as plt%matplotlib inline #正常显示画图时出现的中文和负号from pylab import mplmpl.rcParams<'font.sans-serif'>=<'SimHei'>mpl.rcParams<'axes.unicode_minus'>=False### 获取数据:tushare开源库(确认已安装好:pip install tushare)import tushare as ts#起始和结束日期可以自行输入,否则使用默认def get_data(code,start_date="2009-01-01", end_date="2019-01-18"): df = ts.get_k_data(code, start=start_date, end=end_date) df.index=pd.to_datetime(df.date) return df.close#返回收盘价#以上证综指、贵州茅台、工商银行、中国平安为例stocks={'sh':'上证综指','600519':'贵州茅台', '601398':'工商银行','601318':'中国平安'}#获取上述股票(指数)的每日前复权收盘价df=pd.DataFrame()for code,name in stocks.items(): df=get_data(code)df.head()

  

#以第一交易日2009年1月5日收盘价为基点,计算净值df_new=df/df.iloc<0>#将上述股票在回测期间内的净值可视化df_new.plot(figsize=(16,7))#图标题plt.title('股价净值走势',fontsize=15)#设置x轴坐标my_ticks = pd.date_range('2008-01-01','2019-01-18',freq='Y')plt.xticks(my_ticks,fontsize=12)#去掉上、右图的线ax=plt.gca()ax.spines<'right'>.set_color('none')ax.spines<'top'>.set_color('none')plt.show()

  

  


  

1

  

累计收益率和年化收益率

  

收益率可以根据上面公式计算,或使用对数收益率,下面直接根据上面的累计净值来推出累计收益率(累计净值-1)。

  

### 区间累计收益率(绝对收益率)total_ret=df_new.iloc<-1>-1TR=pd.DataFrame(total_ret.values,columns=<'累计收益率'>,index=total_ret.index)TR

  

2最大回撤实际上,numpy和pandas借助库函数均可以实现一行代码计算最大回撤。#numpy:np.maximum.accumulate计算序列累计最大值code='上证综指'n_d=((np.maximum.accumulate(df)-df)/np.maximum.accumulate(df)).max()#pandas使用cummax()计算序列累计最大值p_d=((df.cummax()-df)/df.cummax()).max()#打印结果print(f'numpy方法计算结果:{round(n_d*100,2)}%')print(f'pandas方法计算结果:{round(p_d*100,2)}%') numpy方法计算结果:52.3%pandas方法计算结果:52.3% ###年化收益率,假设一年以250交易日计算annual_ret=pow(1+total_ret,250/len(df_new))-1AR=pd.DataFrame(annual_ret.values,columns=<'年化收益率'>,index=annual_ret.index)AR

  

#定义成函数,减少重复工作def max_drawdown(df): md=((df.cummax()-df)/df.cummax()).max() return round(md,4)md={}for code,name in stocks.items(): md=max_drawdown(df)#最大回撤率结果:MD=pd.DataFrame(md,index=<'最大回撤'>).TMD

  

3

  

alpha和beta

  


  

#计算每日收益率#收盘价缺失值(停牌),使用前值代替rets=(df.fillna(method='pad')).apply(lambda x:x/x.shift(1)-1)<1:>rets.head()#市场指数为x,个股收益率为yfrom scipy import statsx=rets.iloc<:,0>.valuesy=rets.iloc<:,1:>.valuesAB=pd.DataFrame()alpha=<>beta=<>for i in range(3):#使用scipy库中的stats.linregress线性回归#python回归有多种实现方式,#如statsmodels.api的OLS,sklearn库等等 b,a,r_value,p_value,std_err=stats.linregress(x,y<:,i>) #alpha转化为年化 alpha.append(round(a*250,3)) beta.append(round(b,3))AB<'alpha'>=alphaAB<'beta'>=betaAB.index=rets.columns<1:>#输出结果:AB

  

#使用公式法直接计算beta值(见前文公式):beta1=rets<<'上证综指','贵州茅台'>>.cov().iat<0,1>/rets<'上证综指'>.var()beta2=rets<<'上证综指','工商银行'>>.cov().iat<0,1>/rets<'上证综指'>.var()beta3=rets<<'上证综指','中国平安'>>.cov().iat<0,1>/rets<'上证综指'>.var()print(f'贵州茅台beta:{round(beta1,3)}')print(f'工商银行beta:{round(beta2,3)}')print(f'中国平安beta:{round(beta3,3)}')#输出结果:贵州茅台beta:0.637工商银行beta:0.614中国平安beta:1.071#使用公式法直接计算beta值(见前文公式):#annual_ret是前文计算出来的年化收益率alpha1=(annual_ret<1>-annual_ret<0>*beta1)alpha2=(annual_ret<2>-annual_ret<0>*beta2)alpha3=(annual_ret<3>-annual_ret<0>*beta3)print(f'贵州茅台alpha:{round(alpha1,3)}')print(f'工商银行alpha:{round(alpha2,3)}')print(f'中国平安alpha:{round(alpha3,3)}')#输出结果:贵州茅台alpha:0.244工商银行alpha:0.077中国平安alpha:0.1384

  

夏普比率和信息比率

  


  

#超额收益率以无风险收益率为基准#假设无风险收益率为年化3%exReturn=rets-0.03/250#计算夏普比率sharperatio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std()#夏普比率的输出结果SHR=pd.DataFrame(sharperatio,columns=<'夏普比率'>)SHR

  

###信息比率#超额收益率以指数收益率或其他为基准#这里以上证综指为基准ex_return=pd.DataFrame() ex_return<'贵州茅台'>=rets.iloc<:,1>-rets.iloc<:,0>ex_return<'工商银行'>=rets.iloc<:,2>-rets.iloc<:,0>ex_return<'中国平安'>=rets.iloc<:,3>-rets.iloc<:,0>a#计算信息比率information=np.sqrt(len(ex_return))*ex_return.mean()/ex_return.std()#信息比率的输出结果INR=pd.DataFrame(information,columns=<'信息比率'>)INR

  

将上述指标合并成一张表,不难看出,在回测期间内(2009年01月01日至2019月01月18日期间),贵州茅台各项指标表现非常出色,其实贵州茅台近几年业绩表现非常优秀,每股收益在整个A股中是最高的。但是,其最大回撤却高达53.3%,意味着如果是在这期间的高点买入的,中间可能出现浮亏53.3%,要上涨114%才能回本,长期投资还真不是普通人心理能承受的。indicators=pd.concat(,axis=1, join='outer',sort='False')#结果保留三位小数indicators.round(3)

  

定义一个函数plot_max_drawdown(),对上述历史回撤的收益和风险指标进行可视化,函数代码相当于整合了上述计算过程,由于篇幅所限,此处省略。#贵州茅台买入持有策略回测可视化plot_max_drawdown(df,'贵州茅台')

  

  


  

#工商银行买入持有策略回测可视化plot_max_drawdown(df,'工商银行')

  

  


  

#中国平安买入持有策略回测可视化plot_max_drawdown(df,'中国平安')

  

  


相关文章