(9条消息) Backtrader量化平台教程(五)Signal

AD:(本人录制的backtrader视频课程,大家多多支持哦~ https://edu.csdn.net/course/detail/9040

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。教程链接:https://www.cbedai.net/qtlyx

其实在backtrader中,我们也可以不编写Strategy类来实现我们的简单策略。这就涉及到另外一种策略的形式,Signal。在之前的例子中,写一个Strategy,初始化Indicator,在next方法中编写buy和sell的逻辑。但是当我们采用Signal的方式之后,我们只需要给Cerebro类add Signal就可以了。

1.代码

代码很简单,之前用Strategy实现的的SMA策略用Signal的方式来实现其实就是这样:

  1. # -*- coding: utf-8 -*-
  2. from __future__ import (absolute_import, division, print_function,
  3. unicode_literals)
  4. import datetime # For datetime objects
  5. import pandas as pd
  6. import backtrader as bt
  7. class MySignal(bt.Indicator):
  8. lines = ('signal',)
  9. params = (('period', 30),)
  10. def __init__(self):
  11. self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)
  12. if __name__ == '__main__':
  13. cerebro = bt.Cerebro()
  14. dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
  15. dataframe['openinterest'] = 0
  16. data = bt.feeds.PandasData(dataname=dataframe,
  17. fromdate = datetime.datetime(2015, 1, 1),
  18. todate = datetime.datetime(2016, 12, 31)
  19. )
  20. # Add the Data Feed to Cerebro
  21. cerebro.adddata(data)
  22. cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal, subplot=False)
  23. # 这句话很有用,画图看效果
  24. # cerebro.signal_accumulate(True)
  25. cerebro.broker.setcash(10000.0)
  26. cerebro.addsizer(bt.sizers.FixedSize, stake=10)
  27. cerebro.broker.setcommission(commission=0.0)
  28. print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
  29. cerebro.run()
  30. print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
  31. cerebro.plot()

      在MySignal中,我们产生的逻辑是

 

 

self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)

其实就是当前的收盘价减去当前的SMA,也就是说,我们这个Indicator子类只会产生三种值,>0,<0,=0.每一个时刻,这个值会被Cerebro接收,当然啦,我们要先把我们的Siganl(其实就是一个Indicator)加入到cerebro中:

cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal, subplot=False)

这样,我们就实现了。

2.Signal的含义

那么cerebro是怎么解读Signal的呢?

> 0 -> 买入
< 0 -> 卖出
== 0 -> 没有指令
        注意add_signal函数的第一个参数,这个参数限制了cerebro的买入卖出的行为。

这一参数共有五中类型,又可以分为两类,为MainGroup和ExitGroup。我们主要介绍MainGroup,Exit部分,笔者还在摸索。

Main Group:
LONGSHORT: 买入卖出信号都接受执行
LONG:买入信号执行,卖出信号仅仅将多头头寸平仓,而不反向卖出。
SHORT:卖出信号被执行,而买入信号仅仅将空头头寸平仓,而不方向买入。

3.效果

我们运行一下,可以看到下面的图:

LONGSHORT:

LONG:注意上方的红色cash和value与上面的区别,可以发现,LONG的情况下,并不会卖出证券标的。

最后,还有一个参数要提一下,

cerebro.signal_accumulate(True)

如果我们在add signal之后加入这一句,我们看一下图:

我们会发现,信号不断的在产生,这就是accumulate的效果。当然,更多的时候,我们要的并不是这样的效果,所以,默认情况下,signal并不是accumulate的。

(0)

相关推荐