bt入门的学习资料整理
01,官方中文文档
https://www.heywhale.com/mw/project/63857587d0329ee911dcd7f2
4.4.3. 线的长度
len和buflen之间的区别:
len报告已处理了多少条
buflen报告已为交易数据加载的柱线总数
如果两个都返回相同的值,则要么没有数据被预加载,要么当前处理已消耗了所有预加载的数据(除非系统连接到实时交易数据,否则将意味着处理结束)。
4.5. 索引0和-1
框架认为最后一项为(读写当前点的前一个点)索引值为-1。 因此,在策略中比较当前收盘价与前一个收盘价是通过 0 vs -1的方式。
4.6. 切片
backtrader不支持对线对象进行切片,这是遵循[0]和[-1]索引方案的设计决策
4.6.1. 获取切片
可以获得具有最新值的数组,语法:
# 显示默认值myslice = self.my_sma.get(ago=0, size=1)返回一个数组,该数组的大小为1,当前时刻为0,向后获取。要从当前时间点获取10个值(即:最后10个值):# ago的默认值为0myslice = self.my_sma.get(size=10)4.7. 线的延迟索引
[]运算符可用于在next逻辑阶段提取单个值
假设一条逻辑是将先前的收盘价与简单移动平均线的实际值进行比较。无需在每次next迭代中进行手动操作,而是可以生成预定义的lines对象:
class MyStrategy(bt.Strategy): params = dict(period=20)
def __init__(self): self.movav = btind.SimpleMovingAverage(self.data, period=self.p.period) self.cmpval = self.data.close(-1) > self.sma def next(self): if self.cmpval[0]: print('上一个收盘价高于当前移动平均值')这里使用”()“延迟符号:
这提供了收盘价的副本,但延迟了-1。
比较self.data.close(-1)> self.sma 会生成另一个line对象,如果条件为True,则返回1,否则为0
4.8. 线(群)的耦合
日交易数据每年约有250条
周交易数据每年有52条
于是()表示法(空调用)可用于解决这个问题:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self):
# data0 是日交易数据 sma0 = btind.SMA(self.data0, period=15) # 15天sma # data1 是周要以数据 sma1 = btind.SMA(self.data1, period=5) # 5周sma
self.buysig = sma0 > sma1()
def next(self): if self.buysig[0]: print('每日sma大于每周sma1')在这里,较大的时间范围指标sma1通过sma1()与每日时间范围耦合。这将返回与更大数量的sma0兼容的对象,并复制sma1产生的值,从而有效地将52个周数据分散为250个日数据
4.9. 通过操作符构造对象
4.9.1. 情景1-操作符创建对象(init阶段构造指标)
4.9.2. 情景2-逻辑操作符 (next阶段构造指标)
4.9.3. 一些不可重载的运算符/函数
Python不允许重载所有内容,因此提供了一些功能函数来应对这种情况。
注意:仅适用于情景1,以创建对象供后面使用。
操作符:
and -> Andor -> Or逻辑控制:
if -> If函数:
any -> Anyall -> Allcmp -> Cmpmax -> Maxmin -> Minsum -> Sumreduce -> Reduce02,量化NPC
数据源:insight,华泰免费2个月
sma策略,高低点突破策略
【backtrader保姆教学】高低轨突破策略:https://blog.csdn.net/weixin_38132951/article/details/129472199
【backtrader保姆级教学】日内区间突破型策略:https://blog.csdn.net/weixin_38132951/article/details/129477688
【backtrader保姆级教学】投资组合回测:https://blog.csdn.net/weixin_38132951/article/details/129765384
【backtrader保姆级教学】趋势选股策略:https://blog.csdn.net/weixin_38132951/article/details/129965349
03,量化投资与机器学习
gitee,刘时忞 / learn_backtrader(包含,各个文章要点):https://gitee.com/simon_lsm/learn_backtrader
github,QIML Backtrader系列:https://github.com/QuantWorld2022/backtrader
微信公众号,文章:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=2380299870701420545
csdn,Backtrader系列教程⑦<可视化篇>可视化篇>(重构):https://blog.csdn.net/qq_41578115/article/details/122535202
Backtrader 来了
Backtrader 数据篇
Backtrader 指标篇
Backtrader 交易篇(上)
Backtrader 交易篇(下)
Backtrader 策略篇
Backtrader 可视化篇(重构)
Backtrader 常见问题汇总
Backtrader 常见案例汇总
notify_order,notify_trader区别
策略里,notify_order, notify_trade两个函数,一个是订阅提交时触发,一个是交易产生时触发,这个在策略调试时特别有用,而且是通用的,直接写在基类里,另外就是基数实现log函数
03 “模块化算子”
这个才是“积木式”策略开发的精华。
我们连上面的代码都不想写,想直接从“仓库”里复用。
我们把策略逻辑拆解成:选标的、按信号筛选,排序,仓位分配等等。
先从最简单的“等权重买入并持有,每个季度动态再平衡”,这个经典的资本配置策略开始。
这里拆分成“算子”会是:
当前时点(今日):datetime 2019-01-02 close 51.12077805
往前推1天(昨日):datetime 2021-01-28 close 54.91980265
往前推2天(前日) datetime 2021-01-27 close 55.5952978
注意:此处时间循环了,应该19年的,取到了21年。
如何对齐不同周期的指标
__init__()和once() 区别
部分信息可能已经过时