Backtrader快速入门——3. 使用pyfolio进行可视化分析

1. 介绍

注意

  • 提前打好预防针,这是金融方面的库,所以在兼容性上存在一些问题。这里做一些简单的尝试,但是不确定其他的是否正确。
  • 此外,从(至少)2017年7月25日起,pyfolio API已更改,并且create_full_tear_sheet不再有Gross_lev作为命名参数。因此,集成示例不起作用。
  • pyfolio自动绘图可在Jupyter Notebook外部使用,但在内部使用效果最佳。pyfolio数据表的输出似乎无法在Jupyter Notebook之外运行,只能在Notebook内部工作。如果希望使用pyfolio,最好还是在Jupyter Notebook中运行。

2. 安装pyfolio

首先要确定一下系统版本,但是这个pyfolio的文档是真的不太友好,github上的Github: quantopian/pyfolio网页版本的文档内容一模一样,但是就是找不到库版本那些东西,只好自己慢慢找了。

  • github项目里连个requirement.txt文件都没有,大部分文件最后一次更新时间是3年前和6年前,从某些文件的最后一次提交时间可以看到这个库对pandas==0.25.0这个版本有特殊的修改 在这里插入图片描述
  • 从这个版本记录文件,what’s new.md可以看到几个关键内容:在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    参考CSDN 量化回测平台Backtrader实战教程,视频作者的博客也有很多相关资料。
  • python==2.7.13
  • backtrader==1.9.64.122
  • 确实是老了一些

由于版本不太确定,所以还是新建一个环境,重新搞一套好一些,由于对python3.5也逐渐不支持了,所以直接安装python3.6版本的好了

"""建立新环境"""
conda create -n py36 python=3.6
"""
安装backtrader(plotting会帮助安装 matplotlib)
可能因为是金融领域,所以backtrader除了画图时引入了matplotlib之外,没有再使用其他依赖包
"""
pip install backtrader[plotting] -i https://pypi.tuna.tsinghua.edu.cn/simple 
# 默认安装的是1.9.76.123
"""安装pyfolio"""
conda install pyfolio --channel conda-forge
# 使用这个命令会显示一大堆包需要安装,很多,更新就完事了 X 报错了
"""
大概是VS2015类似的错误,直接删环境,还是试试python3.5吧,大不了就不在pycharm上用,反正pyfolio本来也就只在jupyter上跑得好
"""

# 使用python3.5试试
`DEPRECATION: Python 3.5 reached the end of its life on September 13th, 2020. 
Please upgrade your Python as Python 3.5 is no longer maintained. pip 21.0 will 
drop support for Python 3.5 in January 2021. pip 21.0 will remove support for 
this functionality. `

pip install pyfolio -i https://pypi.tuna.tsinghua.edu.cn/simple 
# 可以看到,默认下载的是0.9.2版本的pyfolio 
# 除了pyfolio ,还另外需要numpy,pandas,matplotlib 如果报超时错误,就把channel加上,下载pyfolio的时候,不要加channel,不然有时候会找不到。

# 配一下jupyter 准备工作就算好了
pip install ipykernel
python -m ipykernel install --user --name py35 --display-name "Python35"

2.1 关于PyFolio的

参考:
backtrader高级专题:策略绩效评价:用不了pyfolio?还有quantstats

  • backtrader提供各种分析者对象analyzer,可以输出各项策略绩效指标。
  • 但输出结果是嵌套字典方式,要把其内容规整地打印出来,对初学者是一个挑战,并且无可视化的绩效报表,还缺少一些重要指标,比如索提诺比率(sortino ratio)。
  • 本来,backtrader可以集成PyFolio这个第三方库,方便地以可视化方法输出这些指标。
  • 但是,由于PyFolio后来变更了接口,两者就没有集成了。
  • 好在,还有一个衡量策略绩效指标的第三方库quantstats,可以非常方便地与backtrader集成。
  • quantstats可以输出html报表,包括各项绩效指标和图表。
  • 可以用命令pip install quantstats安装该库。

此外,这个人的博客还有一些重要结论:

所以如果要使用pyfolio这个库,可能需要自己修改一些源码,来保证兼容性,
参考知乎专栏文章:
如何用backtrader结合pyfolio对策略的绩效进行评估?

3. 运行案例

3.1 网上的模板代码

也是照着官方文档的改了改

import datetime
import backtrader as bt
import backtrader.analyzers as btanalyzers
import backtrader.feeds as btfeeds
import backtrader.strategies as btstrats

cerebro = bt.Cerebro()

dataname = './2005-2006-day-001.txt'
data = btfeeds.BacktraderCSVData(dataname=dataname)
cerebro.adddata(data)
cerebro.addstrategy(btstrats.SMA_CrossOver)

cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')    
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

strat = results[0]
pyfoliozer = strat.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()
import pyfolio as pf
pf.create_full_tear_sheet(
    returns,
    positions=positions,
    transactions=transactions,
    gross_lev=gross_lev,
    live_start_date='2005-05-01',
    round_trips=True)
cerebro.plot()

3.2 报错

运行代码之后,陆续出错:

  • 先报错:ValueError: 'pyfolio' is not in list(这个错误不重要,一般就是代码写的有问题),
  • 然后是TypeError: create_full_tear_sheet() got an unexpected keyword argument 'gross_lev'(这个错误比较严重,属于pyfolio接口改变,backtrader没有兼容。)

从(至少)2017年7月25日起,pyfolio API已更改,并且create_full_tear_sheet不再有Gross_lev作为命名参数。因此,集成示例不起作用。)

在这个【backtrader股票策略 】151 trading strategies》中的价格动量策略文章中,

  • 看到gross_lev这个参数被注释掉了,
  • 同时这个人的代码里并没有round_trips=True这一行(如果不注释会报错)
  • 所以修改代码(只改了create_full_tear_sheet这个函数中的参数):
pf.create_full_tear_sheet(
    returns,
    positions=positions,
    transactions=transactions,
    live_start_date='2005-05-01')
cerebro.plot()

参考纠错的网站:

3.3 有可视化结果的代码

注意,一定使用jupyter notebook来运行代码

import datetime

import backtrader as bt
import backtrader.analyzers as btanalyzers
import backtrader.feeds as btfeeds
import backtrader.strategies as btstrats

cerebro = bt.Cerebro()

dataname = './2005-2006-day-001.txt'
data = btfeeds.BacktraderCSVData(dataname=dataname)
cerebro.adddata(data)
cerebro.addstrategy(btstrats.SMA_CrossOver)

cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')    
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

strat = results[0]
pyfoliozer = strat.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()


import pyfolio as pf
import matplotlib 
%matplotlib inline
pf.create_full_tear_sheet(
    returns,
    positions=positions,
    transactions=transactions,
    live_start_date='2005-05-01')
# cerebro.plot()

3.4 输出结果

和官方文档给出的输出结果差不多,但是有几个不太一样。但是总之是输出来了,成功!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Castlehe/article/details/113849079