量化投资里的风险收益分析与可视化:empyrical和pyfolio实战,与backtrader整合

原创文章第75篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

今天来说说量化投资里的风险、收益分析

一个策略好与不好,与基准如何对比,就需要对策略的风险、收益进行数量化分析。

最重要且最直观的两个指标:收益指标是“年化收益”,风险指标是“最大回撤”和“夏普比”(或者“卡玛比率”)。

01 quantopian三剑客

提及量化平台,不得不说quantopian。

尽管这个量化平台鼻祖已经退出了历史舞台,但国内的一众模仿者还在继续。如joinquant,ricequant,bigquant,优矿,果仁等等。

quantopian还给开源界留下了三大框架:zipline, pyfolio 和alphalens

zipline是quantopian的回测框架,功能同backtrader,我们的选型是bt,所以不多加讨论;pyfolio是量化结果分析与可视化框架,alphalens是因子分析框架,使用度都不错,今天我们重要说pyfolio。

   02 empyrical

pyfolio背后计算量化指标的库叫empyrical,小而经典,我们先说说它。

安装比较简单:pip install empyrical

它依赖numpy和pandas,输入的参数主要是returns(pd.Serids)格式,即收益率序列即可。

import numpy as np
import pandas as pd

from empyrical import max_drawdown, sharpe_ratio,annual_return
import empyrical
print(dir(empyrical))

df = pd.read_csv('000300.sh.csv')
returns = df['pct_chg']/100
mdd = max_drawdown(returns)
sharpe = sharpe_ratio(df['pct_chg']/100)
a_return = annual_return(returns)

print('累计收益:',empyrical.cum_returns_final(returns))
print('年化收益:',empyrical.annual_return(returns))
print('最大回撤:',empyrical.max_drawdown(returns))
print('夏普比', empyrical.sharpe_ratio(returns))
print('卡玛比', empyrical.calmar_ratio(returns))

print('omega',empyrical.omega_ratio(returns))

可以看出,沪深300指数年化收益8.1%,最大回撤-72%,夏普比0.43等等。

03 pyfolio

安装同样简单:pip install pyfolio

使用这个安装会报bug——“AttributeError: ‘numpy.int64‘ object has no

attribute ‘to_pydatetime‘

可以使用这个线上github的版本:

pip install git+https://github.com/quantopian/pyfolio

两行代码:

import pyfolio as pf

ts = pf.create_full_tear_sheet(returns)

与刚才的计算结果一致,只是呈现在图表里,因为pyfolio背后调用的就是empyrical。

最大的五次回撤期:

都发生在2006-2008,就是08年的金融危机期间。

04 与backtrader整合

backtrader框架内置了兼容pyfolio的分析器,添加之后,可以从结果得到收益率,仓位,交易等信息,可以create_full_tear_sheet来分析。

cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')
strats = cerebro.run()
strat0 = strats[0]
pyfolio = strats.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()
import pyfolio as pf

pf.create_full_tear_sheet(returns)

很多教程有一个误区,说pyfolio只能在jupyter notebook环境下使用。这是不对

的,应该说在jupyter notebook下交易最好,可以显示表格数据。

在console模式下,使用matplotlib的pyplot可以正常绘图,但不能绘制表格。

import matplotlib.pyplot as plt
plt.show()

这里我的建议是直接使用empyrical来显示结果。

使用backtrader内置的analyzer,需要一个个添加,一个个取结果,但常用的指标

,其实通过returns可以直接算出来。

def show_result_empyrical(self, returns):
    import empyrical

    print('累计收益:', empyrical.cum_returns_final(returns))
    print('年化收益:', empyrical.annual_return(returns))
    print('最大回撤:', empyrical.max_drawdown(returns))
    print('夏普比', empyrical.sharpe_ratio(returns))
    print('卡玛比', empyrical.calmar_ratio(returns))
    print('omega', empyrical.omega_ratio(returns))

与内置的计算结果是一模一样的:

小结

强烈建议,使用pyfolio来分析backtrader的结果,包括收益,风险,以及交易,

订单信息都可以。但pyfolio对于jupyter notebook友好,对于matplotlib环境,

无法绘制表格。

明天我们在pyfolio的基础上,使用quantstats来显示表格数据和可视化。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI量化投资实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值