
量化投资神器-backtrader源码解析-从入门到精通

文章平均质量分 67
作者:曾在某基金做量化研究员\量化基金经理,金融硕士,注册国际投资分析师(CIIA),金融风险管理师(FRM),国际金融理财师(CFP)
内容:主要分享backtrader使用教程、源代码解读与讲解、各种股票、期货、期权、基金、外汇等策略、backtrader在IB实盘交易相关问题
优惠券已抵扣
余额抵扣
还需支付
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
云金杞
量化研究员\CTA量化基金经理,金融硕士,CIIA,CFP,FRM,CFA,擅长使用python进行数据分析和建模,熟练使用backtrader、tbquant等量化平台。
展开
-
0、本专栏的预计更新的内容与更新时间表(2023-05-05更新目录排版)
一、本专栏主要分四个部分:1、backtrader主要功能的分享2、backtrader实现各种策略3、backtrader源代码解析4、backtrader的实盘交易功能1.1、backtrader主要功能的分享backtrader官网上的教程已经非常详细,只要你有耐心,看个几遍教程,然后 多做一些策略,在做策略的时候一般会遇到问题,多多查看文档的教程,出现解决不了的问题,尝试去论坛咨询,如果还解决不了,就去阅读backtrader的源代码,只要花时间和精力...原创 2020-07-26 15:32:37 · 13492 阅读 · 42 评论 -
【86 backtrader实现crypto交易策略】backtrader和ccxt对接实现中低频自动化交易-01
这个周末尝试实现了backtrader和ccxt的对接,主要是参考了下面的。感兴趣可以尝试一下,我准备在okex上尝试实现。看看长期跑一跑怎么样。原创 2023-11-12 16:09:34 · 464 阅读 · 0 评论 -
【答读者问57】backtrader回测的时候出现nan值的时候如何解决
今天读者提供的一个案例还是比较罕见的,是因为输入数据的时候只包含了close列,没有datetime, open,high,low,volume这些常见的列,导致下单self.buy()的时候导致了缺少open列的数据,出现缺失值。下面的代码是读者提供的,看起来和backtrader官网上的入门案例比较类似,当年我写代码也写成这样,后来慢慢用的多了,就会有一些经验和感悟,在这篇代码后面提供了一些新的修改建议,就当是为我当年的自己写的吧,也希望更多使用backtrader做量化投研的朋友能够少走一些弯路。原创 2023-09-28 23:23:40 · 465 阅读 · 0 评论 -
arrow的使用
pandas2.0引入了pyarrow作为可选后端,比numpy的性能提高很多,所以为了改造backtrader,用cython和c++重写整个框架,准备用arrow作为底层的数据结构(backtrader现在的底层数据结构是基于python array构建的)安装arrow推荐使用vcpkg。原创 2023-09-09 21:43:27 · 903 阅读 · 0 评论 -
【85 backtrader-cs因子测试的一些高级技巧-2】使用cython、c语言和c++加速某些函数的计算
中,使用了numba改进某些函数,实现加速,在这一篇文章中,尝试接着上一篇文章的主题,继续尝试用cython,c语言和c++尝试改进decayliear函数的计算速度。原创 2023-06-24 20:09:46 · 727 阅读 · 2 评论 -
【答读者问56】backtrader如何输出持仓时候的每日收益率
有个读者咨询如何在运行策略之后,能够输出来特定的数据到csv文件中,比如持仓期间每个bar的收益率等相关信息?原创 2023-06-23 22:32:35 · 1040 阅读 · 0 评论 -
【85 backtrader-cs因子测试的一些高级技巧】使用numba加速某些函数的计算
实际上,还是可以考虑进一步优化的,但是现在这个水平,速度已经可以接受了。原先如果优化参数需要45个小时,现在差不多1小时就可以搞定了。这几行代码实现的,所以考虑采用numba优化这个算法。原创 2023-06-04 23:58:34 · 649 阅读 · 0 评论 -
84、【backtrader期货策略】一个基于基差套利或者基差投机的期货策略
这篇文章是使用akshare获取到的国债期货日线数据,计算近月合约和远月合约的价差,根据价差大小做的价差套利策略或者价差投机策略。原创 2023-05-25 21:51:08 · 1319 阅读 · 0 评论 -
83、【backtrader期货策略】一个国债期货的日线趋势跟踪策略
有读者咨询怎么获取国债期货的数据以及如何用国债期货做一个交易策略,并且指定其中要涉及到移仓换月,交易逻辑和这篇文章一样即可.原创 2023-05-25 10:46:36 · 974 阅读 · 1 评论 -
82、backtrader部分回测功能替代品_ts和cs功能介绍及使用说明
做一万七千多组参数优化,跑10个进程,使用的时间不超过20分钟。本来这个算是公司资产,但是离职的时候谈的条件是公司这边允许我自由使用我在工作期间撰写的代码 、使用的数据和做出的研究,所以我就尝试把cs这个框架公开了。在github上找了一圈用于做因子测试的框架,并没有找到比较合适的,要么是比较难学,要么就是速度比较慢,不得不自己用了一两周的时间写了 一个cs的框架用于期货单因子的回测(也可以用于股票上),并且经过几个月的改进,cs这个框架的速度大大提高,在我本地电脑上,基于期货各品种的日线数据。原创 2023-05-05 15:20:18 · 1142 阅读 · 0 评论 -
【答读者问55】再谈如何用backtrader实现一个自定义指标-以barslast为例
用backtrader实现barslast指标原创 2022-12-12 20:49:24 · 970 阅读 · 0 评论 -
【答读者问54】谈一谈backtrader在多品种跨周期调用数据的时候面临的坑以及是否选择使用resample的问题
由于backtrader特殊的时间处理方式,在分钟线刚开始的时候调用日线数据,有可能调用到数据结束时候的值,在写代码的时候要注意避免。理论上是的,当使用resample函数合成日线数据的时候,确实避免了上面的一些问题,但是同时也带来了一些新的问题。中实现了在日线数据上运行,调用周线数据的指标的方案,如果要实现分钟线调用日线数据,还有一些细节问题需要注意。数据会在每日结束的时候才合成,在最开始的一天是调用不到数据的,如果调用数据,会报错。调用数据的时候需要注意调用到的日线数据究竟是不是当前的数据。原创 2022-12-01 18:59:03 · 1049 阅读 · 0 评论 -
如何在windows上安装python3.11并且使用python3.11运行一个backtrader写的量化交易策略并提升20%左右的速度?
三、找到一个backtrader策略,使用python3.8运行和python3.11运行,对比下耗费的时间。在短时间的运行中,python3.11效率并没有比python3.8有特别高的提升。把数据和策略下载好,放到D盘的test文件夹中。3. 全部勾选所有的选项,点击install。3.全部勾选,然后选择下一步。效率提升为:19.85%一、python的安装。原创 2022-11-03 20:40:23 · 3390 阅读 · 4 评论 -
【答读者问53】谈一谈基于python开发的量化框架(如backtrader,vnpy)如何提高回测速度的一些原则和方法
正常情况下,使用python读取文件的速度,如果以csv文件为基准,读取其他的数据类型很可能会提高很多倍,尤其是需要读取的文件比较多的情况下,把很多的csv文件做成一个pickle格式的文件,通过读取这个文件,可以提高很多的速度;本文中主要梳理下我在回测的过程中为了提高速度进行过的一些尝试,当你尝试过这些方法,backtrader或者说基于python的以事件驱动为主的量化框架依然满足不了你的需求,那么就可以考虑选择的这个量化框架是否合适了,需不需要选择一门其他语言的量化框架。原创 2022-10-11 22:17:27 · 1490 阅读 · 0 评论 -
81、【backtrader基金策略】如果每周定投一次,在周几定投收益率更高?
记得上半年有朋友问过我:“如果做基金定投,是不是周四进行定投收益率会更高?” 我当时基于自己的经验和直觉,认为在周几定投,其实差别不大。这篇文章就是对这个问题进行了一下简单的实证研究,确实证明了从总体而言,如果坚持定投超过三年以上,选择周几来进行定投,对未来的收益其实是影响不大的。原创 2022-09-16 20:14:41 · 994 阅读 · 0 评论 -
【backtrader源码解析52】indicators部分代码解读(枯燥,仅供参考,源代码解析结束,后面会增加一个backtrader框架分析)
另外,关于backtrader源代码的注释,放到网站上了,在文末大家可以找到相关的连接。到这里,源代码解析工作算是初步结束了,总体而言,源代码解析这部分其实意义不大,大家python水平足够,自然比较容易看懂各个文件的源代码,核心在于提高自己python编程水平,对源代码注释,仅仅只能起到辅助的作用。完成backtrader框架分析之后,就只剩下来一些策略的实现了,这个专栏也即将接近尾声了,总体上进度并没有计划的那么快,在繁忙的工作、考证和生活之余,坚持写了下来,也算是一言难尽吧。原创 2022-09-13 21:35:57 · 999 阅读 · 0 评论 -
【答读者问52】为什么backtrader要使用那么多元编程技术?
简而言之,元编程的主要目标是创建函数和类,并用他们来操纵代码(比如说修改、生成或者包装已有的代码)。如果说删除元编程的话,理论上也是可以的,但是这个工作量本身就会比较大。而且删除之后,可能会有很多的重复性的代码,写的也不优雅。有读者咨询了一个元编程的问题:感觉如果backtrader如何能删除元编程,逻辑其实挺简单的,主要就是元编程让人难以完全看懂代码。请问一下可否把所有的元编程删除。backtrader中大量使用了元类,在某种程度上,节省了大量的重复的代码,实现了一些比较复杂的功能。...原创 2022-08-29 22:44:53 · 1008 阅读 · 0 评论 -
【答读者问51】谈一谈策略(strategy)使用多数据的时候prenext和next的区别
对策略的一些关键函数做了讲解,重新copy到这里,可以看到,在策略初始化的时候,会运行__init__中的一些代码,接下来会运行start,一般情况下,是只运行一次,接下来就是比较关键的prenext了,如果多数据的时候,这些数据的日期并不一致,将会导致不会进入到next中,会一直在prenext中运行,直到所有的数据日期都有了之后,才会进入到next中。这个是前段有一个读者咨询过的问题,记录下来了,一直没有写成文章,主要是感觉太简单了,没有必要写成一个单独的文章。...原创 2022-08-14 22:15:13 · 869 阅读 · 0 评论 -
80、【backtrader基金策略】实现上证50ETF和创业板ETF轮动交易策略(2022-07-17更新)
提到了一个上证50ETF和创业板ETF轮动交易的策略,就用backtrader简单验证了下。如果有任意一个大于20日均线,持有净值处于20日均线较大的那只基金(平掉另一只买入这只持有)该数据源自东方财富网,最新的数据可以在网上自行下载。在两只基金的净值都低于20日均线的时候,清仓离场。交易手续费按照万分之二计算。...............原创 2022-07-15 22:51:20 · 1872 阅读 · 0 评论 -
【backtrader源码解析51】observers中七个文件源代码简单解读(枯燥,仅供参考)
observers中的一些类主要用于实现画图的时候显示一些交易,账户金额等情况。我个人认为出发点是挺好的,实现的功能也不错,可扩展性很强,但是和analyzer一样,很多的东西其实是没有必要存在的,直接在底层写个函数,保存每日的value,cash,order,trade,position等情况,然后对这些数据进行分析,效率是不是会更高一些?trades.pytimereturn.pylogreturns.pydrawdown.pybuysell.pybroker.pybenchmark.py.原创 2022-06-21 22:40:16 · 796 阅读 · 0 评论 -
【backtrader源码解析50】analyzers中calmar.py、vwr.py和sqn.py三个文件源代码解读(枯燥,仅供参考)
calmar.pyvwr.pysqn.py原创 2022-06-16 21:50:57 · 702 阅读 · 0 评论 -
【backtrader源码解析49】analyzers中tradeanalyzer.py、periodstats.py、drawdown.py三个文件源代码解读(枯燥,仅供参考)
tradeanalyzer.py、periodstats.py、drawdown.py三个文件解读tradeanalyzer.pyperiodstats.pydrawdown.py原创 2022-06-16 21:47:04 · 763 阅读 · 0 评论 -
【backtrader源码解析48】analyzer中pyfolio(positions,leverage,transactions)等几个相关的文件解读(枯燥,仅供参考)
analyzers中positions,leverage,transcations和pyfolio几个文件的解读positions.pytranscations.pyleverage.pypyfolio.py原创 2022-06-16 21:18:52 · 727 阅读 · 0 评论 -
【backtrader源码解析47】analyzer中annualreturn、timereturn、returns等几个计算收益率的文件解读(枯燥,仅供参考)
annualreturn.pytimereturn.pyreturns.py原创 2022-06-11 16:40:23 · 866 阅读 · 0 评论 -
【backtrader源码解析46】cerebro.py代码注释(枯燥,backtrader核心代码之一,推荐阅读,注释仅供参考)
cerebro类的相关代码。写到这里,除了analyzer和indicator相关的一些文件没有注释之外,基本上代码注释算是完成的差不多了。完成了analyzer和indicator的注释之后,后面会基于对backtrader使用、五六遍代码阅读经验,梳理总结下backtrader相关的框架,计划用20讲左右的篇幅。...原创 2022-06-09 22:28:26 · 494 阅读 · 1 评论 -
【backtrader源码解析45】ibbroker.py代码注释(枯燥,仅供参考)
backtrader中ibbroker源代码解析,这个文件中的代码可以作为实现一个live broker的示例,实现其他的实盘的broker,比如实现一个CTP的实盘的brokerfrom __future__ import (absolute_import, division, print_function, unicode_literals)import collectionsfrom copy import copyfrom datetime原创 2022-05-29 11:33:31 · 451 阅读 · 0 评论 -
【backtrader源码解析44】bbroker.py代码注释(枯燥,仅供参考)
bbroker是backtrader中回测用的brokerfrom __future__ import (absolute_import, division, print_function, unicode_literals)import collectionsimport datetimeimport backtrader as btfrom backtrader.comminfo import CommInfoBasefrom backtr原创 2022-05-28 23:01:22 · 399 阅读 · 0 评论 -
【backtrader源码解析43】resamplerfilter.py代码注释(枯燥,仅供参考)
这几个类里面代码非常绕,不感兴趣的忽略。如果有注释不当的地方,欢迎提醒哦。from __future__ import (absolute_import, division, print_function, unicode_literals)from datetime import datetime, date, timedeltafrom .dataseries import TimeFrame, _Barfrom .utils.py3 imp原创 2022-05-28 22:57:31 · 263 阅读 · 0 评论 -
【79 backtrader的一些高级技巧】谈一谈如何在单个品种上同时运行多个策略?
昨天晚上有朋友咨询了如何在单个品种上运行多个策略,今天总于做出来了一个小例子,供大家参考。首先,两个策略来自于以前的期货日内策略的例子,其在股指上的表现分别如下:73 [backtrader期货策略]十大经典策略-菲阿里四价(逻辑优化版)74 [backtrader期货策略] 十大经典策略-汉斯123策略(逻辑优化版)当把两个策略同时运行的时候,跟猜想中的一样,可以提高策略的收益风险比。组合起来回测结果如下:name:IF,boll_period:300,boll_mult:2.5,ma_p原创 2022-05-25 22:42:10 · 698 阅读 · 1 评论 -
【backtrader与IB(盈透证券)实盘交易教程4】使用resample合成多周期数据的时候需要注意的一些问题
最近有读者resample形成不同周期的数据的时候,有时候访问其他较大周期的数据会报错,仔细看了它代码之后,发现有一个地方设置的有问题:如果是多个周期的数据同时运行的话,需要把交易周期最小的数据放到第一个,交易周期较大的,放到后面。举例说明,如果有两个周期,1分钟和5分钟,那么就需要先resample形成1分钟的数据,然后resample形成5分钟的数据。如果加载的数据是存在多个周期,或者数据开始的时间不一致,backtrader的机制是想要运行到next的话,需要这些数据都已经开始。所以一般在使用过程原创 2022-05-23 21:02:20 · 910 阅读 · 0 评论 -
【答读者问50】如何针对加密货币设置利息费用?(2022-12-07修改)
有读者咨询了这样一个问题:interest_long和interest应该如何设置呢?因为在一倍杠杆以下做多,不需要利息,只有一倍以上杠杆需要利息,而做空都需要利息,这个应该如何设置呢?举例说明:例如我持有100U,要买300U的BTC,杠杆为三倍,这时候我只需要借入2*100U的钱就可以了, 所以利息应该是200U * interest,同理,对于n倍开多,需要付(n-1)base的利息。如果我要开空,我只有100U,我必须借入BTC先卖掉,就算是一倍开空,也得借入100U的BTC,所以对于n倍开空,需原创 2022-05-22 16:51:28 · 273 阅读 · 1 评论 -
【答读者问49】backtrader中的mult、leverage、margin的关系
backtrader中关于mult、leverage和margin的具体含义其实并没有百分之百的准则,CommInfoBase类里面的一些设置可能并不是完全合理,我们可以根据自己的需要,自己继承这个类,重写其中的一些方法。以期货 百分比的佣金方式去举例子:class ComminfoFuturesPercent(CommInfoBase): '''write by myself,using in the future backtest,it means we should give a perc原创 2022-05-18 21:55:31 · 513 阅读 · 0 评论 -
【backtrader源码解析42】tradingcal.py源码注释(枯燥,仅供参考)
这个文件主要是交易日历的实现,感兴趣可以参考。from __future__ import (absolute_import, division, print_function, unicode_literals)from datetime import datetime, timedelta, timefrom .metabase import MetaParamsfrom backtrader.utils.py3 import string_原创 2022-05-08 18:39:25 · 244 阅读 · 7 评论 -
【backtrader源码解析41】broker.py源码注释(枯燥,仅供参考)
backtrader中的broker,比较重要,但是这个文件里面只实现了broker元类和基类,需要使用的时候继承,比如bbroker主要用于回测。from __future__ import (absolute_import, division, print_function, unicode_literals)from backtrader.comminfo import CommInfoBasefrom backtrader.metabase i原创 2022-05-08 18:36:34 · 380 阅读 · 0 评论 -
【backtrader源码解析40】percents_sizer.py源码注释(枯燥,仅供参考)
百分比手数的实现方法from __future__ import (absolute_import, division, print_function, unicode_literals)import backtrader as bt__all__ = ['PercentSizer', 'AllInSizer', 'PercentSizerInt', 'AllInSizerInt']# 百分比手数,根据可以利用的现金的百分比下单class P原创 2022-05-08 18:32:28 · 237 阅读 · 0 评论 -
【backtrader源码解析39】fixedsize.py源码注释(枯燥,仅供参考)
下单的时候固定手数的实现过程,不感兴趣可以忽略from __future__ import (absolute_import, division, print_function, unicode_literals)import backtrader as bt# 固定手数类,如果下单的时候没有指定size,将会默认调用一个sizerclass FixedSize(bt.Sizer): ''' This sizer simply re原创 2022-05-08 18:29:17 · 236 阅读 · 0 评论 -
【backtrader源码解析38】comminfo.py源码注释(枯燥,仅供参考)
comminfo.py主要用于实现具体的佣金和保证金的功能,在实际做策略的过程中,使用还是比较频繁的,需要关注一下。from __future__ import (absolute_import, division, print_function, unicode_literals)import datetimefrom .utils.py3 import with_metaclassfrom .metabase import MetaParams原创 2022-05-08 18:26:31 · 416 阅读 · 0 评论 -
【backtrader源码解析37】timer.py源码注释(枯燥,仅供参考)
这个文件主要是实现backtrader的定时器功能,对定时器感兴趣的朋友可以参考from __future__ import (absolute_import, division, print_function, unicode_literals)import bisectimport collectionsfrom datetime import date, datetime, timedeltafrom itertools import is原创 2022-05-08 18:22:56 · 259 阅读 · 0 评论 -
【backtrader源码分析36】talib.py源码注释(枯燥,仅供参考)
talib的源代码注释,由于对talib内部结构了解并不是特别多,这个注释比较简略。from __future__ import (absolute_import, division, print_function, unicode_literals)# The modules below should/must define __all__ with the objects wishes# or prepend an "_" (underscore)原创 2022-05-08 18:20:21 · 639 阅读 · 0 评论 -
【backtrader源码解析35】observer.py源码注释(枯燥,仅供参考)
observer.py的源代码注释,总体上代码比较简单from __future__ import (absolute_import, division, print_function, unicode_literals)from .lineiterator import LineIterator, ObserverBase, StrategyBasefrom backtrader.utils.py3 import with_metaclass#原创 2022-05-08 18:17:16 · 223 阅读 · 0 评论