開源量化框架backtrader FAQ:開發MySQL data feed

開源量化框架backtrader FAQ:開發MySQL data feed,第1張

完整技術教程見這裡

有很多人建立了自己本地的行情數據庫,希望能夠從本地數據庫將數據發到backtrader,供策略使用。一個通用的方法是將數據庫的行情數據讀到pandas dataframe裡,然後將這個數據幀的數據傳給backtrader的pandas feed數據對象,這樣策略就能夠使用了。

但是有些同學不想通過pandas dataframe中轉,而是想直接從數據庫將數據喂給backtrader的數據餽送對象,這就需要針對數據庫開發專門的data feed類了。

以下就是backtrader社區提供的一個從MySQL數據庫讀取數據的feed類MySQLData,大家可以試一試。

  1. from__future__import (absolute_import, division, print_function,
  2. unicode_literals)
  3. importdatetime
  4. frombacktrader.feedimportDataBase
  5. frombacktraderimportdate2num
  6. fromsqlalchemyimportcreate_engine
  7. classMySQLData(DataBase):
  8. params = (
  9. ('dbHost',None),
  10. ('dbUser',None),
  11. ('dbPWD',None),
  12. ('dbName',None),
  13. ('ticker','ISL'),
  14. ('fromdate', datetime.datetime.min),
  15. ('todate', datetime.datetime.max),
  16. ('name',''),
  17. )
  18. def__init__(self):
  19. self.engine = create_engine('mysql://'self.p.dbUser':'self.p.dbPWD'@'self.p.dbHost'/'self.p.dbName'?charset=utf8mb4', echo=False)
  20. defstart(self):
  21. self.conn = self.engine.connect()
  22. self.stockdata = self.conn.execute('SELECT id FROM stocks WHERE ticker LIKE ''self.p.ticker'' LIMIT 1')
  23. self.stock_id = self.stockdata.fetchone()[0]
  24. #self.result = self.engine.execute('SELECT `date`,`open`,`high`,`low`,`close`,`volume` FROM `eoddata` WHERE `stock_id` = 10 AND `date` between '' self.p.fromdate.strftime('%Y-%m-%d') '' and '' self.p.todate.strftime('%Y-%m-%d') '' ORDER BY `date` ASC')
  25. self.result = self.conn.execute('SELECT `date`,`open`,`high`,`low`,`close`,`volume` FROM `eoddata` WHERE `stock_id` = 'str(self.stock_id)' AND `date` between ''self.p.fromdate.strftime('%Y-%m-%d')'' and ''self.p.todate.strftime('%Y-%m-%d')'' ORDER BY `date` ASC')
  26. defstop(self):
  27. #self.conn.close()
  28. self.engine.dispose()
  29. def_load(self):
  30. one_row = self.result.fetchone()
  31. ifone_rowisNone:
  32. returnFalse
  33. self.lines.datetime[0] = date2num(one_row[0])
  34. self.lines.open[0] = float(one_row[1])
  35. self.lines.high[0] = float(one_row[2])
  36. self.lines.low[0] = float(one_row[3])
  37. self.lines.close[0] = float(one_row[4])
  38. self.lines.volume[0] = int(one_row[5])
  39. self.lines.openinterest[0] = -1
  40. returnTrue

發佈於 19 小時前


生活常識_百科知識_各類知識大全»開源量化框架backtrader FAQ:開發MySQL data feed

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情