(9条消息) Backtrader量化平台教程(七)Optimizer
AD:(本人录制的backtrader视频课程,大家多多支持哦~ https://edu.csdn.net/course/detail/9040)
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。教程链接:https://www.cbedai.net/qtlyx
还是那我们以前的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)