Preguntas frecuentes sobre backtrader de marco cuantitativo de código abierto: desarrollo de fuentes de datos MySQL

Vea el tutorial técnico completo aquí

Mucha gente ha establecido su propia base de datos del mercado local, con la esperanza de enviar datos desde la base de datos local al inversor para uso estratégico. Un método común es leer los datos de mercado de la base de datos en un marco de datos de pandas y luego pasar los datos de este marco de datos al objeto de datos de alimentación de pandas del inversor, para que se pueda utilizar la estrategia.

Sin embargo, algunos estudiantes no quieren transferir a través del marco de datos de pandas, pero quieren alimentar datos directamente desde la base de datos al objeto de alimentación de datos del backtrader, lo que requiere el desarrollo de una clase de alimentación de datos especial para la base de datos.

El siguiente es un feed MySQLData proporcionado por la comunidad de backtraders para leer datos de una base de datos MySQL. Puede probarlo.

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import datetime
from backtrader.feed import DataBase
from backtrader import date2num
from sqlalchemy import create_engine


class MySQLData(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)

    def start(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")

    def stop(self):
        #self.conn.close()
        self.engine.dispose()

    def _load(self):
        one_row = self.result.fetchone()
        if one_row is None:
            return False
        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
        return True

 

Publicado hace 19 horas

Supongo que te gusta

Origin blog.csdn.net/qtbgo/article/details/111351729
Recomendado
Clasificación