专栏首页钱塘小甲子的博客Backtrader量化平台教程(七)Optimizer

Backtrader量化平台教程(七)Optimizer

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

还是那我们以前的SMA这个简单到不能叫策略的策略来说事吧。我们在使用SMA这个策略的时候,我们需要传入一个参数,也就是MA的平滑窗口。

self.sma = bt.indicators.SimpleMovingAverage(self.datas[0], period=self.params.maperiod)

        这里,第二个参数就是MA的窗口。         既然是参数,顾名思义,其实我们就可以调整这个参数。同时, 既然是赚钱,当然是越多越好。所以,我们的优化过程就是,不断地去修改这里的这个参数,然后看看每个参数对应的赚钱的效应,最后做个比较。         如果我们人类来完成这样的过程,显得很麻烦,还好,backtrader里面自带了optimizer。         其实过程很简单,之前我们是addStrategy来给berebro加入一个量化策略。那么优化一个策略的参数,我们用到的是

cerebro.optstrategy(
        MyStrategy,
        maperiod=range(10, 31))

optstrategy这个方法。当然啦,可以想一想,除了把我们的strategy类传入进去时候,肯定还得指定一个优化范围。range(10,31)就是我们的优化范围了,而在sma策略中,参数名是maperiod,所以我们指定方法的参数传入名,就可以实现效果了。

完整的代码如下:

# -*- 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
import numpy as np

# Create a Stratey
class MyStrategy(bt.Strategy):
    params = (
        ('ssa_window', 15),
        ('maperiod', 15),
    )

    def log(self, txt, dt=None):
        ''' Logging function fot this strategy'''
        dt = dt or self.datas[0].datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self):
        # Keep a reference to the "close" line in the data[0] dataseries
        self.dataclose = self.datas[0].close

        # To keep track of pending orders and buy price/commission
        self.order = None
        self.buyprice = None
        self.buycomm = None

        # Add a MovingAverageSimple indicator
        # self.ssa = ssa_index_ind(
        #     self.datas[0], ssa_window=self.params.ssa_window)
        self.sma = bt.indicators.SimpleMovingAverage(
            self.datas[0], period=self.params.maperiod)


    def next(self):
        if self.order:
            return
        if not self.position:
            if self.dataclose[0] > self.sma[0]:
                self.order = self.buy()

        else:

            if self.dataclose[0] < self.sma[0]:
                # Keep track of the created order to avoid a 2nd order
                self.order = self.sell()

    def stop(self):
        self.log('(MA Period %2d) Ending Value %.2f' %
                 (self.params.maperiod, self.broker.getvalue()))


if __name__ == '__main__':
    cerebro = bt.Cerebro()
    cerebro.optstrategy(
        MyStrategy,
        maperiod=range(10, 31))
    dataframe = pd.read_csv('./price_data/000001.SH.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)
                            )
    cerebro.adddata(data)
    cerebro.broker.setcash(10000.0)
    cerebro.addsizer(bt.sizers.FixedSize, stake=1)
    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()

我们看一下输出结果:

可以看到,我们一下子就获得了不同MA窗口下的最后策略的钱。显然,这个策略是亏钱的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vn.py源码解读(四、主引擎代码分析----初始化函数)

            vnpy有一个叫做主引擎的东西,在三里面也说过,个人觉得这个应该是一个运行框架的东西,不应该叫做引擎,不过没关系,名字而已嘛。这一篇呢主要就是分...

    钱塘小甲子
  • vn.py源码解读(九、策略类代码解析)

          说到这个最重要的类了。这个类说白了就是策略的实现。和绝大部分回测框架一样,策略想法是一个类的抽象,一般会继承一个基础类模板,每一个真实运行的策略就是...

    钱塘小甲子
  • vn.py源码解读(七、回测代码解析)

            原本想开始讲策略类的编写,后来觉得,结合回测代码其实能够更好的理解,所以先解读一下vnpy回测的代码吧,后续自己也想把vnpy回测的部分优化一下...

    钱塘小甲子
  • PyQT5 图片查看器

    由官方PyQt4 demo升级为PyQt5版本,原本只有缩放功能,现另加入打印和拖放功能。

    用户6021899
  • PyQt5 动画类--跳舞的火柴人

    PyQt5.QtCore中的 QPropertyAnimation可以实现动画功能。

    用户6021899
  • 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    在爬虫、自动化、数据分析、软件测试、Web 等日常操作中,除 JSON、YAML、XML 外,还有一些数据经常会用到,比如:Mysql、Sqlite、Redis...

    AirPython
  • Python 技术篇-pyhook暂停键盘鼠标监听事件,停止键盘鼠标监听事件且不关闭程序

    很多时候只是要暂停一下或只想关闭监听,并不想把程序关闭。 但是网上搜了半天,没有找到,然后自己就去翻了翻源码,发现了。

    小蓝枣
  • 12 | Tornado源码分析:BaseIOStream 对象(上)

    hello 大家好 通过前几期我们已经聊了 Tornado 中协程的创建、运行,本期我们开始聊聊 tornado 中 网络读写数据处理相关的内容,这部分还是比较...

    还是牛6504957
  • 福利来啦,送给大家一个小游戏的源码,不要错过哟(复制粘贴运行即可玩)

    从小到大玩过很多的游戏,在我小时候,能玩游戏的地方不多,那时玩游戏都是偷摸玩的,只要是个游戏就觉得非常有趣,比较经典的有魂斗罗,拳皇,超级玛丽,贪吃蛇,俄罗斯方...

    松鼠爱吃饼干
  • 喜欢的歌曲不在一个平台怎么办?你需要一个自己专属的音乐播放器

    网易云音乐,QQ音乐,酷狗音乐,是我们经常会用到的音乐软件,当然有时候我们因为一首歌,需要在各大音乐平台上跳转,那么我们完全可以使用python自己打造一款音乐...

    松鼠爱吃饼干

扫码关注云+社区

领取腾讯云代金券