量化交易学习(六十四)backtrader识别顶底分形

昨天有读者建议我监测一下顶底分形,今天我已经把顶底分形的监测加好了。

首先介绍一下顶底分形:

20230830194109_43735.png

顶分形是连续三根k线,中间的k线的最高价和最低价比两边k线的都要高

底分形是连续三根k线,中间的k线的最高价和最低价比两边k线的都要低

在backtrader中默认没有识别顶底分形的指标,我们可以创建一个识别顶底分形的指标。

创建一个indicator.py文件,在这个文件中来创建我们的顶底分形指标。

自定义的指标类要继承自bt.Indicator,然后定义需要用到的线变量lines以及绘图参数,如果不定义绘图参数,则默认会在主图下用子图把定义的线画出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import backtrader as bt

class Pivot(bt.Indicator):
lines = ('high_pivot','low_pivot')
# 定义绘图参数
plotlines = dict(
# 绿色 菱形 尺寸为7
high_pivot=dict(color='green', ls='',marker='d',markersize='7.0'),
# 红色 菱形 尺寸为7
low_pivot=dict(color='red', ls='',marker='d',markersize='7.0')
)

plotinfo = dict()
# 设置画在主图上
plotinfo['subplot'] = False
# 是否画出标记
plotinfo['plotlinelabels'] = True

然后在类的初始化方法__init__中定义识别顶底分形的算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def __init__(self):
super(Pivot, self).__init__()
# 顶分形中间的k线最高价最低价比两边的都高
# 如果是顶分形则linehigh线的值为k线最高价*1.01
# 这样在绘图时就会标记在k线上
linehigh = bt.If(bt.And(bt.And(
self.data.high(-1)>self.data.high(-2),self.data.high(-1)>self.data.high(0)),
bt.And(self.data.low(-1)>self.data.low(-2),self.data.low(-1)>self.data.low(0))
),self.data.high(-1)*1.01,-100)
# 因为支点是三根k线中间的那条线,所以要往前挪一位
self.l.high_pivot=linehigh(1)
# 底分形同理
linelow = bt.If(bt.And(bt.And(
self.data.high(-1)<self.data.high(-2),self.data.high(-1)<self.data.high(0)),
bt.And(self.data.low(-1)<self.data.low(-2),self.data.low(-1)<self.data.low(0))
),self.data.high(-1)*1.01,-100)
self.l.low_pivot=linelow(1)

定义好指标后,把它加到策略中就能用啦!

1
2
3
4
5
6
7
class PivotStrategy(bt.Strategy):
# 策略初始化,设置一些参数
def __init__(self):
...
self.pivot=indicator.Pivot(self.data,plotvaluetags=True)
....

下面是对沪深300ETF识别的结果:

Figure_0.png

震荡行情下顶底分形也会反复触发,所以顶底分形可以作为参考,在实际使用中也要参考别的指标。


希望这篇文章能帮助到大家。如果你有任何问题或建议,欢迎留言讨论,私信。感谢你的阅读,觉得不错,点个赞哦!还没有关注我的朋友可以关注 江达小记

江达小记