简述
backtrader支持 内置指标 和 talib 指标
相关文档:
内置指标:/docu/indautoref/
talib指标:/forest128/p/13823649.html
策略中使用内置指标:
class SmaCross(bt.Strategy):params = dict(period=5)def __init__(self):self.move_average = bt.ind.MovingAverageSimple(self.data.close,period=self.params.period)
策略中使用talib指标:
mac安装ta-lib:
brew install ta-lib
anaconda 安装TA-Lib
pip install TA-Lib
class TALibStrategy(bt.Strategy):params = (('period', 20), )def __init__(self):# ta-lib移动平均指标self.sma = bt.talib. T3(self.data, timeperiod=self.p.period)
自定义指标
backtrader的运算符
python的逻辑运算符都被Backtrader覆盖了,使其可以直接作用于线对象整体,进行矢量化运算
tips:
cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
在策略类的init方法中定义新指标
'''在策略类的init方法中定义新指标'''import backtrader as btfrom feed import feedfrom logger import lgclass MyStrategy(bt.Strategy):params = dict(period1=20, period2=25, period4=10, period3=5)def __init__(self):sma1 = bt.ind.MovingAverageSimple(self.data.close,period=self.params.period1)sma2 = bt.ind.MovingAverageSimple(sma1,period=self.params.period2)# 通过算数计算创建新指标线something = sma2 - sma1 + self.data.closesma3 = bt.ind.MovingAverageSimple(something,period=self.params.period3)self.greater = sma3 > sma1self.buysig = bt.And(sma1 > self.data.close, sma1 > self.data.high)self.high_or_low = bt.If(sma1 > self.data.close, self.data.low, self.data.high)self.high_or_30 = bt.If(sma1 > self.data.close, 30.0, self.data.high)# 生成开盘价除以收盘价形成的线,若某天的收盘价为0,则最终指标该日取 99999self.testIndicator = bt.DivByZero(self.data.open, self.data.close, zero=99999)# 若分母为0,则取8888;若分子分母都为0,取99999self.testIndicator2 = bt.DivZeroByZero(self.data.open, self.data.close, 8888, 99999)if __name__ == '__main__':cerebro = bt.Cerebro()cerebro.adddata(feed)cerebro.addstrategy(MyStrategy)cerebro.run(stdstats=False)cerebro.plot()
注意__init__中的指标画图时不会展示出来
自定义指标类(__init__中)
'''自定义新指标类 __init__ 中'''import backtrader as btfrom feed import feedfrom logger import lgclass OverUnderMovAv(bt.Indicator):lines = ('overunder',)params = dict(period=10)def __init__(self):movav = bt.ind.MovingAverageSimple(self.data,period=self.params.period)self.l.overunder = bt.Cmp(movav, self.data)def next(self):passclass Mystrategy(bt.Strategy):params = dict(period=20)def __init__(self):self.overunder = OverUnderMovAv(self.data.close, period=self.params.period)if __name__ == '__main__':cerebro = bt.Cerebro()cerebro.adddata(feed)cerebro.addstrategy(Mystrategy)cerebro.run(stdstats=False)cerebro.plot()
这个指标采用了backtrader内置的指标进行运算,无需自己处理最小周期
自定义指标类(next中)
'''自定义新指标类 next 中'''import mathfrom feed import feedimport backtrader as btclass SimpleMovingAverage1(bt.Indicator):lines = ('sma',)params = (('period', 20),)def __init__(self):self.addminperiod(self.params.period)def next(self):datasum = math.fsum(self.data.get(size=self.p.period))self.lines.sma[0] = datasum / self.p.periodclass Mystrategy(bt.Strategy):params = dict(period=20)def __init__(self):self.overunder = SimpleMovingAverage1(self.data.close, period=self.params.period)if __name__ == '__main__':cerebro = bt.Cerebro()cerebro.adddata(feed)cerebro.addstrategy(Mystrategy)cerebro.run(stdstats=False)cerebro.plot()
当需要自定义最小周期时可以使用next创建 指标类,在__init__中使用self.addminperiod()定义最小周期
注意指标类形式创建的指标会在画图中展示
如果觉得《Backtrader(十一) - Indicator指标》对你有帮助,请点赞、收藏,并留下你的观点哦!