博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pyfolio一行代码实现专业量化回测图表
阅读量:2160 次
发布时间:2019-05-01

本文共 3444 字,大约阅读时间需要 11 分钟。

来源:Python金融量化

—  01 

引言

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

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

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

—  02 

pyfolio回测实例

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

import pandas as pdimport tushare as tsimport 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%,关于这些指标的定义和计算可参照推文:《》。

最大回撤率与持续期间

事件分析(event study)

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

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

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

与backtrader相结合

此外,pyfolio还可以为backtrader的回测结果提供图表分析。关于backtrader的应用可参考公众号系列图文:、 、、、、、。

import backtrader as btfrom datetime import datetimeclass MyStrategy(bt.Strategy):    pass(略)
#假设数据为dfdata = bt.feeds.PandasData(dataname=df)# 初始化cerebro回测系统设置                           cerebro = bt.Cerebro()  # 加载数据cerebro.adddata(data) # 将交易策略加载到回测系统中cerebro.addstrategy(MyStrategy) # 设置初始资本为10,000cerebro.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 showtimeimport pyfolio as pfpf.create_full_tear_sheet(returns)

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

—  03 

结语

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

资料来源:

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

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

---------End---------

 后台回复「微信群」,将邀请加入读者交流群。

  • 回复 600 ,获取 

  • 回复 markdown ,获取 

  • 回复 time , 获取 

  • 回复 str, 获取 

  • 回复 SQL50 ,获取 

  • 回复 mat ,获取 

????分享、点赞、在看,给个三连击呗!???? 

转载地址:http://tnzzb.baihongyu.com/

你可能感兴趣的文章
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
solver及其配置
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>