zipline風險指標計算 (empyrical模塊)


概述

量化中,我們經常會遇到各種量化指標的計算,對於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>

png

基准收益率

和策略收益一樣,我們可以構造一個模擬的基准收益

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>

png

計算最大回撤

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 參數來設定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM