(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加入一个量化策略。那么优化一个策略的参数,我们用到的是

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

 

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

完整的代码如下:

  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. import numpy as np
  8. # Create a Stratey
  9. class MyStrategy(bt.Strategy):
  10. params = (
  11. ('ssa_window', 15),
  12. ('maperiod', 15),
  13. )
  14. def log(self, txt, dt=None):
  15. ''' Logging function fot this strategy'''
  16. dt = dt or self.datas[0].datetime.date(0)
  17. print('%s, %s' % (dt.isoformat(), txt))
  18. def __init__(self):
  19. # Keep a reference to the "close" line in the data[0] dataseries
  20. self.dataclose = self.datas[0].close
  21. # To keep track of pending orders and buy price/commission
  22. self.order = None
  23. self.buyprice = None
  24. self.buycomm = None
  25. # Add a MovingAverageSimple indicator
  26. # self.ssa = ssa_index_ind(
  27. # self.datas[0], ssa_window=self.params.ssa_window)
  28. self.sma = bt.indicators.SimpleMovingAverage(
  29. self.datas[0], period=self.params.maperiod)
  30. def next(self):
  31. if self.order:
  32. return
  33. if not self.position:
  34. if self.dataclose[0] > self.sma[0]:
  35. self.order = self.buy()
  36. else:
  37. if self.dataclose[0] < self.sma[0]:
  38. # Keep track of the created order to avoid a 2nd order
  39. self.order = self.sell()
  40. def stop(self):
  41. self.log('(MA Period %2d) Ending Value %.2f' %
  42. (self.params.maperiod, self.broker.getvalue()))
  43. if __name__ == '__main__':
  44. cerebro = bt.Cerebro()
  45. cerebro.optstrategy(
  46. MyStrategy,
  47. maperiod=range(10, 31))
  48. dataframe = pd.read_csv('./price_data/000001.SH.csv', index_col=0, parse_dates=True)
  49. dataframe['openinterest'] = 0
  50. data = bt.feeds.PandasData(dataname=dataframe,
  51. fromdate = datetime.datetime(2015, 1, 1),
  52. todate = datetime.datetime(2016, 12, 31)
  53. )
  54. cerebro.adddata(data)
  55. cerebro.broker.setcash(10000.0)
  56. cerebro.addsizer(bt.sizers.FixedSize, stake=1)
  57. cerebro.broker.setcommission(commission=0.0)
  58. print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
  59. cerebro.run()
  60. print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
  61. # cerebro.plot()

我们看一下输出结果:

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

 

 

 

 

 

 

 

(0)

相关推荐