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

引言

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

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

0

1

指标含义及公式

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

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可以理解为超额收益率,最后一项是随机扰动,可以理解为个体风险。

0

4

夏普比率和信息比率

夏普比率

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

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

为年化标准差。

信息比率

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

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

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

0

2

Python计算量化指标

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

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

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

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

from pylab import mpl

mpl.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[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

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

def max_drawdown(df):

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

return round(md,4)

md={}

for code,name in stocks.items():

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

#最大回撤率结果:

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

MD

3

alpha和beta

#计算每日收益率

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

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

rets.head()

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

from scipy import stats

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

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

AB=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']=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量化策略风险指标相关推荐

  1. python爬取资料怎么样_手把手教你Python爬取新房数据

    原标题:手把手教你Python爬取新房数据 项目背景 新房数据,对于房地产置业者来说是买房的重要参考依据,对于房地产开发商来说,也是分析竞争对手项目的绝佳途径,对于房地产代理来说,是踩盘前的重要准备. ...

  2. alpha因子常见问题_手把手教你构建量化因子分析体系

    原标题:手把手教你构建量化因子分析体系 挖掘Alpha因子.评价Alpha因子.改进Alpha因子是量化投资者职业生涯永恒的奋斗目标,而一套严密有效的因子分析体系是这一切的基石."不以规矩, ...

  3. python批量评论_手把手教你 Python挖掘用户评论典型意见并自动生产报告

    原标题:手把手教你 Python挖掘用户评论典型意见并自动生产报告 用户体验的工作可以说是用户需求和用户认知的分析.而消费者的声音是其中很重要的一环,它包含了用户对产品的评论,不管是好的坏的,都将对我 ...

  4. python流程控制-实战案例手把手教你Python流程控制技巧

    原标题:实战案例手把手教你Python流程控制技巧 作者:PianoOrRock 来源: http://blog.csdn.net/pianoorrock/article/details/711315 ...

  5. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  6. python进行数据预测_手把手教你用Python进行时间序列分解和预测

    原标题:手把手教你用Python进行时间序列分解和预测 作者:Mohit Sharma 翻译:数据派THU-王闯(Chuck) 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列 ...

  7. python 词云手把手_手把手教你生成炫酷的词云

    前言: 话说,在这个大数据时代,获取信息显得极为容易,可正是如此,我们想要对信息进行直观地了解难度就大了.Excel是一个很好的数据可视化方法,不过有时候我们的数据来源可能并不是一张或者多张Excel ...

  8. python爬虫如何连接数据库_手把手教你如何在Navicat中如何新建连接数据库及相关报错解决方法...

    前几天给大家分享了如何安装Navicat,没有来得及上车的小伙伴可以戳这篇文章:手把手教你安装Navicat--靠谱的Navicat安装教程.今天给大家分享一下Navicat的简单使用教程,具体的教程 ...

  9. python远程桌面控制_手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤

    配置说明 使用Pycharm 2020.1.1 professional 专业版.(据说只有专业版可以远程连接)如果不是专业的伙伴,可以用校园邮箱注册一个专业版,免费的哦! 步骤 1. 设置Conne ...

  10. python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...

    手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...

最新文章

  1. Ubuntu下安装Anaconda
  2. There's no Qt version assigned to this project for platform Win32/Win64
  3. bug诞生记——不定长参数隐藏的类型问题
  4. 哪个术语描述了服务器软件在专用计算机,计算机网络基础
  5. pctfree pctused详解
  6. unity webgl读写txt文件_python Files文件读写操作
  7. C如何将二维数组作为返回值
  8. 关于Python爬虫,一条高效的学习路径
  9. 2020年研究生入学考试991考试大纲
  10. CSS样式(一)- 基本语法
  11. boot idea无法识别spring_IDEA 的这款插件真是逆天了,代码那都不是事
  12. Bootstrap插件之 下拉菜单 源码分析~~
  13. window 10及window7电脑前面耳机插孔没有声音,后面有声音
  14. 计算机操作技能节,第十届知识技能节 网线制作竞赛方案
  15. 数据库update多条数据
  16. Linux中xtp文件上传不了,xtp_api_java: 中泰证券xtp java api for win\linux\mac https://xtp.zts.com.cn...
  17. 安卓app保持屏幕常亮
  18. 大家一起学数据结构之单链表
  19. android RatingBar基本使用介绍
  20. js 动态修改iframe的src

热门文章

  1. samba 实现linux 共享,用Samba实现Linux之间的文件共享机制
  2. Git复习(三)之分支管理、分支策略
  3. JSON.stringify() 格式化 输出log
  4. Node.js 目录操作
  5. Telerik RadGridView动态增删行及行列操作
  6. 三层架构实现增删的简单实例
  7. Oracle视图的作用与安全性
  8. jQuery基础修炼圣典—DOM篇(二)jQuery遍历
  9. 如何在程序中添加iAd广告
  10. Count Complete Tree Nodes