转 Python量化策略风险指标

如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑。——刘富兵

引言

尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环。量化回测过程中常用到的指标有年化收益率、最大回撤、beta、alpha、夏普比率、信息比率等(见下图)。目前很多量化网站都能提供Python的量化回测框架,如聚宽 、优矿、万矿、Zipline 、vnpy 和pyalgotrade等,为我们评估量化策略提供了很好的交互平台。毕竟平台的使用有其局限性,如果不借助平台, 如何使用python写一个简单的量化回测框架呢?本文将一步一步为你展示如何使用python计算量化策略风险指标。文中提及股票仅供学习示例,不构成投资建议。

指标含义及公式

1.累计收益率与年化收益率

年化收益率是把当前收益率(日收益率、周收益率、月收益率)换算成年收益率来计算的,是一种理论收益率,并不是真正的已取得的收益率。因为年化收益率是变动的,所以年收益率不一定和年化收益率相同。

累计收益率:

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

年化收益率

其中,R是期间总收益率,m是与n(可以是天数、周数、月数)相对应的计算周期,根据计算惯例,m=250、52、12分别指代日、周、月向年化的转换。

2.最大回撤

在选定周期内任一历史时点往后推,于最低点时的收益率回撤幅度的最大值。最大回撤用来描述可能出现的最糟糕的情况。最大回撤是一个重要的风险指标,对于量化策略交易,该指标比波动率还重要。

P为某一天的净值,i为某一天,j为i后的某一天,Pi为第i天的产品净值,Pj则是Pi后面某一天的净值

则该基金的最大回撤计算如下:

即通过对每一个净值进行回撤率求值,然后找出最大的。

3.Beta和Alpha

Beta:相当于业绩评价基准收益的总体波动性,计算如下:

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

其含义可以简单理解为:如果Beta为1,策略和市场(如沪深300指数)波动相同;如果Beta大于1,策略波动大于市场,如2,则市场上涨10%时,策略上涨20%;反之亦然。如果Beta小于1,则策略波动小于市场,如为0.8,市场上涨10%时,策略上涨8%;反之亦然。

Beta值如何看呢?这得具体问题具体分析,如果是牛市,个股、大盘狂涨,Beta值大的策略占优;如果是熊市,Beta值小的策略占优。

Alpha:实际收益和按照Beta系数计算的期望收益之间的差额。代表策略多大程度上跑赢了预期的收益率。

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

E(ri)是股票i的预期收益率,rf是无风险利率,rm是市场指数收益率;beta系数在评估股市波动风险与投资机会的方法中,常用来衡量结构性与系统性风险,可以简单理解为个股波动相对大盘波动的偏离程度。CAPM的计量模型可以表示为:

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

4.夏普比率和信息比率

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

其中,Rp为策略年化收益率,Rf是无风险收益率,QP为年化标准差。

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

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

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

Python计算量化指标

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

#先引入后面可能用到的包(package)

importpandasaspd

importnumpyasnp

importmatplotlib.pyplotasplt

%matplotlib inline

#正常显示画图时出现的中文和负号

frompylabimportmpl

mpl.rcParams['font.sans-serif']=['SimHei']

mpl.rcParams['axes.unicode_minus']=False

### 获取数据:tushare开源库(确认已安装好:pip install tushare)

importtushareasts

#起始和结束日期可以自行输入,否则使用默认

defget_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)

returndf.close

#返回收盘价

#以上证综指、贵州茅台、工商银行、中国平安为例

stocks={'sh':'上证综指','600519':'贵州茅台',

'601398':'工商银行','601318':'中国平安'}

#获取上述股票(指数)的每日前复权收盘价

df=pd.DataFrame()

forcode,nameinstocks.items():

df[name]=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]-1

TR=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[code])-df[code])/np.maximum.accumulate(df[code])).max()

#pandas使用cummax()计算序列累计最大值

p_d=((df[code].cummax()-df[code])/df[code].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))-1

AR=pd.DataFrame(annual_ret.values,columns=['年化收益率'],index=annual_ret.index)

AR

#定义成函数,减少重复工作

defmax_drawdown(df):

md=((df.cummax()-df)/df.cummax()).max()

returnround(md,4)

md={}

forcode,nameinstocks.items():

md[name]=max_drawdown(df[name])

#最大回撤率结果:

MD=pd.DataFrame(md,index=['最大回撤']).T

MD

3.alpha和beta

#计算每日收益率

#收盘价缺失值(停牌),使用前值代替

rets=(df.fillna(method='pad')).apply(lambdax:x/x.shift(1)-1)[1:]

rets.head()

#市场指数为x,个股收益率为y

fromscipyimportstats

x=rets.iloc[:,0].values

y=rets.iloc[:,1:].values

AB=pd.DataFrame()

alpha=[]

beta=[]

foriinrange(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']=alpha

AB['beta']=beta

AB.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.138

4.夏普比率和信息比率

#超额收益率以无风险收益率为基准

#假设无风险收益率为年化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([TR,AR,MD,AB,SHR,INR],axis=1,

join='outer',sort='False')

#结果保留三位小数

indicators.round(3)

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

#贵州茅台买入持有策略回测可视化

plot_max_drawdown(df,'贵州茅台')

#工商银行买入持有策略回测可视化

plot_max_drawdown(df,'工商银行')

#中国平安买入持有策略回测可视化

plot_max_drawdown(df,'中国平安')

来源:Python金融量化

--------------------------------------------------------------------------------------

拓展阅读:


《算法导论 第三版英文版》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版

《Python科学计算》_高清中文版

《深度学习入门:基于Python的理论与实现》_高清中文版

《深入浅出数据分析》_高清中文版

《Python编程:从入门到实践》_高清中文版


Python量化策略风险指标相关推荐

  1. python获取时间周数_【手把手教你】Python量化策略风险指标

    如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑.--刘富兵 引言 引言尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环.量化回测过程中常 ...

  2. python金融量化风险_【手把手教你】Python量化策略风险指标

    如何衡量一个量化策略的好坏?一是比较稳定的收益,二是有严谨的回测,三是有清晰的逻辑.--刘富兵 引言 尽管过去不能代表未来,通过历史回测来评估量化策略仍然是量化投资非常重要的一环.量化回测过程中常用到 ...

  3. 基于Python量化策略牛市行情下的盈利与风险策略管理

    基于Python量化策略 牛市行情下的盈利与风险策略管理 牛市行情下的盈利策略与风险管理 1 项目背景 2 数据探索 2.1 数据获取 2.2 数据处理与分析 3 盈利策略量化建模与风险管理 3.1 ...

  4. python 量化策略回测_在python中创建和回测对交易策略

    python 量化策略回测 Pairs trading is one of the many mean-reversion strategies. It is considered non-direc ...

  5. python量化策略源码_【Python量化投资】趋向系统指标策略 ADX、DMI指标用于股票池(附源码)...

    原标题:[Python量化投资]趋向系统指标策略 ADX.DMI指标用于股票池(附源码) [什么是ADX] ADX(average directional indicator) 平均趋向指数,常用的趋 ...

  6. python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架

    欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读 ...

  7. python量化策略——混合择时策略(动量效应+pe_ttm、pb估值+美林时钟)——股债轮动

    将下面三个策略结合判断, 动量策略 估值策略 改进美林时钟 三个策略都判断股票上涨(做多股票,则股:债=0.5:0.5 三个中有两个策略判断做多股票信号 ,则股:债=0.4:0.6 三个中有一个策略判 ...

  8. python量化策略——大类资产配置模型(最小方差模型)

    最小方差模型 寻求风险最小的大类资产组合. max⁡=XTΣX\max=X^{T}\Sigma Xmax=XTΣX s.t.ΣX=1,Xi≥0,i=1,2,3...s.t. \quad \Sigma ...

  9. 百倍加速!Python量化策略的算法性能提升指南

    性能问题 Python在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模: 交易:vn.py.easytrader.at_py 数据:tushare 回测:rqalpha 在线平台: ...

  10. 百倍加速:Python量化策略的算法性能提升指南

    性能问题 Python在2016年里可以说是风靡国内量化投资圈,目前整个生态链已经初具规模: 交易:vn.py.easytrader.at_py 数据:tushare 回测:rqalpha 在线平台: ...

最新文章

  1. 伟人必须回答的(二十道问题)
  2. 推荐 14 个 GitHub 上优质的原创前端博客文章仓库
  3. 20172325 2018-2019-1 《Java程序设计》第二周学习总结
  4. JavaWeb笔记02-Tomcat
  5. SSM:Spring整合MyBatis框架时出现 java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManaged
  6. 上海计算机一级flash真题,2011年上海市一级考PS与Flash试卷.docx
  7. Luogu3516 POI2011 Shift 构造
  8. ascII码,asc2码表
  9. 什么是网络操作系统?网络操作系统具有那些基本功能?
  10. “元宇宙”是什么?涂子沛:人可在数据空间“复活”
  11. 华为认证数通HCIE面试之Qos完整解析
  12. vs2008中文版 下载
  13. 91 个常见的 Laravel 面试题和答案
  14. 百度统计之百度代码引用
  15. 软件开发的一些注意事项
  16. 怎么修改我的世界服务器封面,《我的世界:初识服务器》
  17. 太原理工大于丹计算机,太原理工大学硕士生将参加中国第30次南极考察
  18. C C++混合编译问题,gcc可以编译过,但是g++编译不过(restrict引起的问题)
  19. 复旦大学计算机学院江湾校区,复旦大学江湾校区
  20. carla学习笔记(六)

热门文章

  1. 浅谈一下pyd文件的逆向
  2. 使用Go清理数据:第1部分
  3. 老域名挖掘工具【支持扫描历史建站记录】SEO工具
  4. SOA联姻IMS对3G无线网络是福是祸?
  5. ThinkPHP6 自定义分页样式 快速配置
  6. 把小写金额转成大写金额 (Java经典编程案例)
  7. 极狐Gitlab操作手册
  8. 你肯定用过手机护眼模式, 但你知道怎么将电脑Win10窗口背景色修改为护眼的淡绿色吗?(附带如何备份注册表)
  9. ZYNQ EMMC/FLASH/SD卡硬件性能测试
  10. 北大计算机系女神每天必看必学的IT公众号