程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

Pyfolio一行代码实现专业量化回测图表

hfteth 2025-02-08 11:10:25 技术文章 23 ℃

引言

量化回测是量化投资中不可或缺的步骤,是构建、评价和优化策略的重要手段。策略回测归根结底是对历史资金曲线的回测,不管是中低频(日、周、月等)还是高频(时、分、秒)交易策略,只要我们根据既定的交易策略获得该交易频率下的历史收益率,便可以对策略进行量化评价,常见的评价指标包括年化收益、累计收益、最大回撤、夏普比率等等。那么有没现成的量化模块库既可以实现计算量化评价指标,还可以输出专业级的量化图表呢?答案是 pyfolio

pyfolio 是全球最大量化网站Quantopian开发的量化“三剑客”之一,另外两个分别是alphalens(用于多因子分析)和zipline(类似backtrader的回测框架)。pyfolio非常适合用于金融投资组合性能和风险分析,包括与Zipline和alphalens结合,输出专业的量化指标和图表分析结果。关于alphalens的应用参照推文《如何对选股因子进行量化回测?》。pyfolio和alphalens直接使用pip即可安装,而zipline由于各种原因一直未安装成功。

pyfolio的核心是一种所谓的tears表,由各种独立的量化回测结果组成,提供交易算法性能的综合图表。下面通过一个简单的例子为大家展示pyfolio的用法。

pyfolio回测实例

下面使用tushare获取个股和指数交易数据,以简单的买入持有作为交易策略进行简单回测,实际上其他交易策略和投资组合均可以以类似方式进行回测,关键是得到策略的资金曲线(即某交易策略或组合的最终收益率时间序列)。

import?pandas?as?pd
import?tushare?as?ts
import?pyfolio?as?pf

获取数据

def?get_return(code):
????df=ts.get_k_data(code,start='2010-01-01')
????df.index=pd.to_datetime(df.date)
????return?df.close.pct_change().fillna(0).tz_localize('UTC')
ret=get_return('600519')
benchmark_ret=get_return('sh')
#假设前面是模拟盘,2017年开始实盘买入600519并一直持有
date='2017-01-03'

pyfolio一行代码进行回测

pyfolio的create_full_tear_sheet函数可以实现一行代码输出所有量化回测结果和图表,具体参数包括:

其中,returns就是我们要输入的收益率时间序列数据(pd.Series),其他默认参数均为可选项,如benchmark_rets(pd.DataFrame)是策略或组合的基准收益率,用于对比分析,live_start_date是指定个时间开始进行实盘交易分析。如果要单独输出某个量化结果图表,可以通过输入pf.create_xxx_tear_sheet (returns),如输出收益相关量化结果图表,则xxx为returns,具体可参考pyfolio源代码中的tears.py,该文件提供了各种图表的输出函数和详细的参数说明。

pf.create_full_tear_sheet(returns=ret,benchmark_rets=benchmark_ret,live_start_date=date)


量化回测基本统计指标


结果显示,量化回测开始日期为2010年1月4日,结束日期为2021年5月28日。由于设定了实盘起始日期为2017年1月3日,pyfolio将数据分为样本内(in-sample,2010.1.4-2017.1.3)和样本外(out of sample,2017.1.4-2021.5.28)进行回测。Annual return是年化收益率,从样本外回测看,如果你在2017年1月3日后买入贵州茅台一直持有,年化收益率达到57%,累计收益率(Cumulative returns)为587%,年化波动率31.6%,夏普比率(Sharpe ratio)为1.59,最大回撤为-33.5%,关于这些指标的定义和计算可参照推文:《【手把手教你】Python量化策略风险指标》。

最大回撤率与持续期间

事件分析(event study)

pyfolio还提供了事件分析的量化结果,如欧债危机、2010年5月的闪电暴跌(FlashCrash)事件期间该策略的收益率情况。

下面输出的的累计收益率(含基准对比)、波动率、滚动夏普比率、最大回撤、月度收益率等的量化结果的可视化图。

极端事件期间的收益率分析


与backtrader相结合

此外,pyfolio还可以为backtrader的回测结果提供图表分析。关于backtrader的应用可参考公众号系列图文:【手把手教你】入门量化回测最强神器backtrader(一)、【手把手教你】入门量化回测最强神器backtrader(二)【手把手教你】入门量化回测最强神器backtrader(三)、backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】、 如何用backtrader对股票组合进行量化回测?、【手把手教你】用backtrader量化回测海龟交易策略、backtrader股票技术指标自定义与量化回测。


import?backtrader?as?bt
from?datetime?import?datetime

class?MyStrategy(bt.Strategy):
????pass(略)
#假设数据为df
data?=?bt.feeds.PandasData(dataname=df)
#?初始化cerebro回测系统设置???????????????????????????
cerebro?=?bt.Cerebro()??
#?加载数据
cerebro.adddata(data)?
#?将交易策略加载到回测系统中
cerebro.addstrategy(MyStrategy)?
#?设置初始资本为10,000
cerebro.broker.setcash(100000.0)?
#每次固定交易数量
cerebro.addsizer(bt.sizers.FixedSize,?stake=1000)?
#手续费
cerebro.broker.setcommission(commission=0.001)?
#运行回测系统
cerebro.addanalyzer(bt.analyzers.PyFolio,?_name='pyfolio')
results?=?cerebro.run()
strat?=?results[0]
pyfoliozer?=?strat.analyzers.getbyname('pyfolio')
returns,?positions,?transactions,?gross_lev?=?pyfoliozer.get_pf_items()
#?pyfolio?showtime
import?pyfolio?as?pf
pf.create_full_tear_sheet(returns)


从上述代码不难看出,应用在backtrader回测框架中,关键是在analyzer模块中使用PyFolio获取相应的数据,即只要获取returns收益系列数据,就能使用pyfolio输出专业化的量化回测结果图表。实际上backtrader能提供收益、头寸、交易费用、杠杆等更多数据,这些结果都可以作为输入项在pyfolio作进一步分析。

结语

本文以一个简单例子介绍了pyfolio在量化回测中的应用,要想更深入的研究和使用该模块的相关函数,最好的方法是分析安装包的源代码。目前随着量化的流行和python等编程语言的普及,国内外呈现出大量的量化在线平台和开源回测框架,参见推文【推荐收藏】倾心整理的Python量化资源大合集。量化在线平台为我们学习和研究策略提供了大量资源,但是量化投资中策略永远是核心,真正赚钱的策略一般是不公开的,因此量化回测单机才是王道,这也是本人一直不习惯在某平台上进行回测的原因(平台与平台之间代码不能很好的移植)。从单机回测来看,pyfolio的应用是很广泛的,类似于pandas之于数据处理。


资料来源:

Quantopian Github: https://github.com/quantopian

Pyfolio:https://github.com/quantopian/pyfolio

Tags:

最近发表
标签列表