概述

量化中,我们经常会遇到各种量化指标的计算,对于zipline来说,也会对这部分计算进行处理,由于指标计算的通用性比较强,所以,zipline单独封装了 empyrical 这个模块,可以处理类似的计算,由于这个模块并不依赖其它zipline模块,我们可以在我么的项目中单独使用它。

安装

pip install empyrical

它会依赖安装 numpy, scipy, pandas 等模块

使用

导入

from empyrical import (
    alpha,
    beta,
    alpha_beta_aligned,
    annual_volatility,
    cum_returns,
    annual_return,
    downside_risk,
    information_ratio,
    max_drawdown,
    sharpe_ratio,
    sortino_ratio,
    calmar_ratio,
    omega_ratio,
    tail_ratio
)

初始数据

策略收益率

大多数函数的参数都需要策略的收益率列表,格式为 pandas.Series 结构,如下:

...
2015-07-16    -0.012143
2015-07-17    0.045350
2015-07-20    0.030957
2015-07-21    0.004902
...

索引为一个时间序列, 值为每日的收益率,为一个百分比,并且是非累积的,也就是每天相对于上一个交易日的收益比率。

下面我们构造一个初始数据

import pandas as pd
returns = pd.Series(
    index=pd.date_range('2017-03-10', '2017-03-19'),
    data=(-0.012143, 0.045350, 0.030957, 0.004902, 0.002341, -0.02103, 0.00148, 0.004820, -0.00023, 0.01201)
)
returns
2017-03-10   -0.012143
2017-03-11    0.045350
2017-03-12    0.030957
2017-03-13    0.004902
2017-03-14    0.002341
2017-03-15   -0.021030
2017-03-16    0.001480
2017-03-17    0.004820
2017-03-18   -0.000230
2017-03-19    0.012010
Freq: D, dtype: float64
returns.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f3bd6fecda0>

基准收益率

和策略收益一样,我们可以构造一个模拟的基准收益

benchmark_returns = pd.Series(
    index=pd.date_range('2017-03-10', '2017-03-19'),
    data=(-0.031940, 0.025350, -0.020957, -0.000902, 0.007341, -0.01103, 0.00248, 0.008820, -0.00123, 0.01091)
)

计算累计收益

creturns = cum_returns(returns)
creturns
2017-03-10   -0.012143
2017-03-11    0.032656
2017-03-12    0.064624
2017-03-13    0.069843
2017-03-14    0.072348
2017-03-15    0.049796
2017-03-16    0.051350
2017-03-17    0.056417
2017-03-18    0.056174
2017-03-19    0.068859
Freq: D, dtype: float64
creturns.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f3bd65eb0b8>

计算最大回撤

max_drawdown(returns)
-0.02103000000000009

计算年化收益

annual_return(returns)
4.3554273608590925

年化Volatility (策略波动率)

用来测量策略的风险性,波动越大代表策略风险越高。

annual_volatility(returns, period='daily')
0.3055933840036463

Calmar比率

Calmar比率描述的是收益和最大回撤之间的关系。计算方式为年化收益率与历史最大回撤之间的比率。Calmar比率数值越大,基金的业绩表现越好。反之,基金的业绩表现越差。

calmar_ratio(returns)
207.10543798664165

Omega比率

介绍: Omega函数是用来分析收益分布的一种方法,它是一种天然的业绩指标。基于Omega的分析是在下跌,下偏矩和损益文献的精神上进行的。Omega函数捕捉到在收益分布上的所有高阶矩信息并且影响收益水平的敏感性。

公式意义:Omega越高越好,它是对偏度和峰值的一个调整。

omega_ratio(returns=returns, risk_free=0.0001)
3.0015132184078577

Sharpe比率

核心思想:理性的投资者将选择并持有有效的投资组合.

公式意义:夏普指数代表投资人每多承担一分风险,可以拿到几分收益;若为正值,代表基金收益率高过波动风险;若为负值,代表基金操作风险大过于收益率。每个投资组合都可以计算Sharpe ratio,即投资回报与多冒风险的比例,这个比例越高,投资组合越佳。

sharpe_ratio(returns=returns)
5.6451366106126715

sortino比率

介绍: Sortino ratio是一个能够评价投资资产、组合或者策略收益的指标。它是夏普比率的修正,它只对收益低于某个值的波动性进行衡量,这个值可能是持有者规定的目标收益或者是要求收益,而夏普比率是同时对上涨的和下降的波动进行衡量。尽管这两个比率都衡量的是一个调整后的投资风险,但它们的意义却不同,这导致投资的收益的结果不同。

核心思想: 公式及其解释:R是资产或组合的预期收益,T是投资策略的目标或要求的收益,起源于最小可接受收益。DR是目标方差的平方根。也就是二阶低偏矩。 Sharpe and Omega-Sharpe ratio的一个自然扩展就是由Sortino在1991年提出的,他使用的是downside risk作为分母,downside risk就是二阶下偏矩。 总风险用下降风险所代替,因为投资组合经理不会被上涨的变化而惩罚,但会被低于最小目标收益的变化而惩罚。 用下降标准差而不是总标准差,以区别不利和有利的波动。

sortino_ratio(returns=returns)
14.150708210667487

下降风险

downside_risk(returns=returns)
0.12191025172150209

信息比率(Information Ratio)

信息比率主要是用来衡量某一投资组合优于一个特定指数的风险调整超额报酬,或者说是用来衡量超额风险所带来的超额收益。它表示单位主动风险所带来的超额收益。

Information Ratio = α∕ω (α为组合的超额收益,ω为主动风险)

计算信息比率时,可以将基金报酬率减去同类基金或者是大盘报酬率(剩下的值为超额报酬),再除以该超额报酬的标准差。信息比率越高,该基金表现持续优于大盘的程度越高。

information_ratio(returns=returns, factor_returns=benchmark_returns)
0.43383172638699696

Alpha

投资中面临着系统性风险(即Beta)和非系统性风险(即Alpha),Alpha是投资者获得与市场波动无关的回报。比如投资者获得了15%的回报,其基准获得了10%的回报,那么Alpha或者价值增值的部分就是5%。

alpha(returns=returns, factor_returns=benchmark_returns, risk_free=0.01)
0.7781943501778946

Beta

表示投资的系统性风险,反映了策略对大盘变化的敏感性。例如一个策略的Beta为1.5,则大盘涨1%的时候,策略可能涨1.5%,反之亦然;如果一个策略的Beta为-1.5,说明大盘涨1%的时候,策略可能跌1.5%,反之亦然。

beta(returns=returns, factor_returns=benchmark_returns, risk_free=0.01)
0.56157656832313008

Tail Ratio

tail_ratio(returns=returns)
2.2825137911495892

其他说明

上面很多参数都涉及到年华指标,他们都会涉及到两个可选的参数, periodannualization , 其中,如果设置了 annualization ,则 period会被忽略,

他们是用来设置策略的年化频率的,对于period 设置为一个字符串,可以设置的参数为 'monthly', 'weekly' , 'daily', 后面是默认的值 ,

{'monthly':12
 'weekly': 52
 'daily': 252}

如果需要覆盖默认的值, 则可以通过 annualization 参数来设定。

zipline风险指标计算 (empyrical模块)的更多相关文章

  1. Python科学计算—numpy模块总结(1)

    作为一个本科学数学专业,目前研究非线性物理领域的研究僧.用什么软件进行纯科学计算好,Fortran永远是第一位的:matlab虽然很强大,可以很容易的处理大量的大矩阵,但是求解我们的模型(有时可能是几 ...

  2. Python科学计算包模块的安装(ubuntu)

    Python的科学计算包设计到C语言代码的编译,采用pip的方式安装会出现错误. 一种简单的方式是采用的集成包,具体的步骤参考:https://www.continuum.io/downloads#_ ...

  3. 用于<挣值管理>的各种指标计算

    PV(Planning Value) 含义:计划价值,截至到某个时间计划工作经批准的成本预算. 公式:PV=计划工作数X计划单价. BAC 含义:完工预算,截至到完工时间计划工作经批准的成本预算,即完 ...

  4. 客户端埋点实时OLAP指标计算方案

    背景 产品经理想要实时查询一些指标数据,在新版本的APP上线之后,我们APP的一些质量指标,比如课堂连接掉线率,课堂内崩溃率,APP崩溃率等指标,以此来看APP升级之后上课的体验是否有所提升,上课质量 ...

  5. Python 科学计算涉及模块

    模块1.数据基础 numpy 模块2.数值运算 scipy 模块3.符号运算 sympy 模块4.图形绘制 matplotlib

  6. SQL语句在OLAP的妙用(多维分析与指标计算)

    ================================================================================ BI传统实现原理: 1.涉及维度管理( ...

  7. php关于精准计算的模块 BCMath

    Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_ope ...

  8. 数据分析计算xgboost模块

    一.安装xgboost方法 摘要:之前为了安装xgboost,少不了进入各种坑,但最终安装成功了!首先, 准备的工作:,下载mingw64,链接https://pan.baidu.com/s/1i5C ...

  9. 云技术:弹性计算ECS

    云计算(Cloud Computing)被业界看作继大型计算机.个人计算机.互联网之后的第四次IT产业革命,正日益成为未来互联网与移动技术相结合的一种新兴计算模式.云计算提供了IT基础设施和平台服务的 ...

随机推荐

  1. Nokia Imaging SDK 的高级使用—实时滤镜拍照

    有关 Nokia Imaging SDK 的初级使用,可以参考:Nokia Imaging SDK滤镜使用入门 本文的主题: 1.如何 PhotoCaptureDevice 类使用,以及如何在 Med ...

  2. maven 引入 net sf jsonlib 报错 has borken path

    pom.xml 内容: <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json ...

  3. ubuntu下更改分辨率

      在虚拟机中装了ubuntu但是没有1600*900的分辨率 第一步: xrandr -q 查看现在系统中所有的分辨率 第二步: cvt 1600 900 得到所需的更改分辨率数据 第三步:  ww ...

  4. 原生js怎么删除一个 div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. html 处理

    近期做了一个后台管理网站,后台页面都是Html页面,里面再通过ajax访问后台服务.要做到比较好的用户体验,即:如果用户没有登录或没有权限马上调到登录页面,而不是等到页面加载后再ajax时判断是否登录 ...

  6. tf.nn.conv2d实现卷积的过程

    #coding=utf-8 import tensorflow as tf #case 2 input = tf.Variable(tf.round(10 * tf.random_normal([1, ...

  7. 为什么选择使用Spring Cloud而放弃了Dubbo

    为什么选择使用Spring Cloud而放弃了Dubbo 可能大家会问,为什么选择了使用Dubbo之后,而又选择全面使用Spring Cloud呢?其中有几个原因: 1)从两个公司的背景来谈:Dubb ...

  8. XMPP客户端

    1. Strophe.js 2. Converse.js

  9. SSH开发环境整合搭建

    1.建立动态web工程,加入必要的jar包. antlr-2.7.7.jar asm-3.3.jar asm-commons-3.3.jar asm-tree-3.3.jar c3p0-0.9.1.2 ...

  10. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...