前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Backtrader量化平台教程(五)Signal

Backtrader量化平台教程(五)Signal

作者头像
钱塘小甲子
发布2019-01-28 14:51:38
3K0
发布2019-01-28 14:51:38
举报

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

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

1.代码

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

代码语言:javascript
复制
# -*- coding: utf-8 -*-

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import datetime  # For datetime objects
import pandas as pd
import backtrader as bt

class MySignal(bt.Indicator):
    lines = ('signal',)
    params = (('period', 30),)

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

if __name__ == '__main__':
    cerebro = bt.Cerebro()
    dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
    dataframe['openinterest'] = 0
    data = bt.feeds.PandasData(dataname=dataframe,
                            fromdate = datetime.datetime(2015, 1, 1),
                            todate = datetime.datetime(2016, 12, 31)
                            )
    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal, subplot=False)
    # 这句话很有用,画图看效果
    # cerebro.signal_accumulate(True)
    cerebro.broker.setcash(10000.0)
    cerebro.addsizer(bt.sizers.FixedSize, stake=10)
    cerebro.broker.setcommission(commission=0.0)
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    cerebro.run()
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
    cerebro.plot()

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

代码语言:javascript
复制
self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)

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

代码语言:javascript
复制
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的情况下,并不会卖出证券标的。

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

代码语言:javascript
复制
cerebro.signal_accumulate(True)

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.代码
  • 2.Signal的含义
  • 3.效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档