開源量化框架backtrader FAQ:開發MySQL data feed
有很多人建立了自己本地的行情數據庫,希望能夠從本地數據庫將數據發到backtrader,供策略使用。一個通用的方法是將數據庫的行情數據讀到pandas dataframe裡,然後將這個數據幀的數據傳給backtrader的pandas feed數據對象,這樣策略就能夠使用了。
但是有些同學不想通過pandas dataframe中轉,而是想直接從數據庫將數據喂給backtrader的數據餽送對象,這就需要針對數據庫開發專門的data feed類了。
以下就是backtrader社區提供的一個從MySQL數據庫讀取數據的feed類MySQLData,大家可以試一試。
- from__future__import (absolute_import, division, print_function,
- unicode_literals)
- importdatetime
- frombacktrader.feedimportDataBase
- frombacktraderimportdate2num
- fromsqlalchemyimportcreate_engine
- classMySQLData(DataBase):
- params = (
- ('dbHost',None),
- ('dbUser',None),
- ('dbPWD',None),
- ('dbName',None),
- ('ticker','ISL'),
- ('fromdate', datetime.datetime.min),
- ('todate', datetime.datetime.max),
- ('name',''),
- )
- def__init__(self):
- self.engine = create_engine('mysql://'self.p.dbUser':'self.p.dbPWD'@'self.p.dbHost'/'self.p.dbName'?charset=utf8mb4', echo=False)
- defstart(self):
- self.conn = self.engine.connect()
- self.stockdata = self.conn.execute('SELECT id FROM stocks WHERE ticker LIKE ''self.p.ticker'' LIMIT 1')
- self.stock_id = self.stockdata.fetchone()[0]
- #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')
- 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')
- defstop(self):
- #self.conn.close()
- self.engine.dispose()
- def_load(self):
- one_row = self.result.fetchone()
- ifone_rowisNone:
- returnFalse
- self.lines.datetime[0] = date2num(one_row[0])
- self.lines.open[0] = float(one_row[1])
- self.lines.high[0] = float(one_row[2])
- self.lines.low[0] = float(one_row[3])
- self.lines.close[0] = float(one_row[4])
- self.lines.volume[0] = int(one_row[5])
- self.lines.openinterest[0] = -1
- returnTrue
發佈於 19 小時前
0條評論