完整技術(shù)教程見(jiàn)這里
有很多人建立了自己本地的行情數(shù)據(jù)庫(kù),希望能夠從本地?cái)?shù)據(jù)庫(kù)將數(shù)據(jù)發(fā)到backtrader,供策略使用。一個(gè)通用的方法是將數(shù)據(jù)庫(kù)的行情數(shù)據(jù)讀到pandas dataframe里,然后將這個(gè)數(shù)據(jù)幀的數(shù)據(jù)傳給backtrader的pandas feed數(shù)據(jù)對(duì)象,這樣策略就能夠使用了。
但是有些同學(xué)不想通過(guò)pandas dataframe中轉(zhuǎn),而是想直接從數(shù)據(jù)庫(kù)將數(shù)據(jù)喂給backtrader的數(shù)據(jù)饋送對(duì)象,這就需要針對(duì)數(shù)據(jù)庫(kù)開(kāi)發(fā)專門的data feed類了。
以下就是backtrader社區(qū)提供的一個(gè)從MySQL數(shù)據(jù)庫(kù)讀取數(shù)據(jù)的feed類MySQLData,大家可以試一試。
from __future__ import (absolute_import, division, print_function, from backtrader.feed import DataBase from backtrader import date2num from sqlalchemy import create_engine class MySQLData(DataBase): ('fromdate', datetime.datetime.min), ('todate', datetime.datetime.max), self.engine = create_engine('mysql://'+self.p.dbUser+':'+ self.p.dbPWD +'@'+ self.p.dbHost +'/'+ self.p.dbName +'?charset=utf8mb4', echo=False) 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') one_row = self.result.fetchone() 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
發(fā)布于 19 小時(shí)前
|