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

这篇博客介绍了如何在Python环境中安装和使用backtrader及pyfolio库进行金融策略绩效分析。由于pyfolio接口变动,导致与backtrader的集成出现错误。作者通过创建新环境、安装指定版本的库以及调整代码来解决这个问题。最终在Jupyter Notebook中成功运行并展示了可视化结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 输出结果

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

### 集成和使用SEAL加密库于Visual Studio 2022 #### 安装准备 为了成功在Visual Studio 2022中集成并使用SEAL加密库,确保已经安装了必要的基础环境。平台应为Windows操作系统,并已安装有Visual Studio 2022以及Git工具[^2]。 #### 下载与构建SEAL库 下载SEAL源码后,在SEAL文件夹所在的目录下通过终端执行一系列命令完成编译工作。推荐使用Visual Studio Developer Command Prompt for VS 2022作为终端工具。具体操作如下: 1. 进入到`seal`文件夹路径: ```powershell cd path\to\seal ``` 2. 使用CMake配置项目生成解决方案文件: ```bash cmake -S . -B build -G "Visual Studio 17 2022" -A x64 ``` 3. 编译Release版本的SEAL库: ```bash cmake --build build --config Release ``` 4. 执行安装指令使头文件及预编译好的动态链接库被放置至指定位置以便后续引用: ```bash cmake --install . --config Release ``` 以上步骤完成后即可获得可直接用于开发项目的静态/动态链接库(.lib/.dll)及相关头文件(.h)[^3]。 #### 创建新的Visual C++工程 启动Visual Studio 2022创建一个新的控制台应用程序或其他类型的C++工程项目。接着按照下面的方法引入之前建立成功的SEAL组件。 - **设置附加包含目录**:右键点击解决方案资源管理器中的项目名称->属性(Property)->C/C++ ->常规(General),向“其他包含目录”添加SEAL头文件的位置。 - **设定库依赖项**:同样是在项目属性窗口内切换到链接(Linker)->输入(Input), 将`.lib`文件的名字填入“附加依赖项”。 - **调整运行时库选项**:保证程序使用的CRT(C Runtime Library)模式匹配,即多线程DLL(/MD 或 /MDd )形式。 此时应该能够顺利调用SEAL API实现同态加密功能了。可以尝试编写简单的测试代码验证是否正常运作。 ```cpp #include <iostream> #include "seal/seal.h" using namespace std; using namespace seal; int main() { EncryptionParameters parms(scheme_type::bfv); cout << "SEAL version: " << SEAL_VERSION << endl; } ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吨吨不打野

解决了问题,觉得还行就给点

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

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

打赏作者

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

抵扣说明:

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

余额充值