FAQ Backtrader sur le framework quantitatif open source: développer un flux de données MySQL

Voir le tutoriel technique complet ici

De nombreuses personnes ont créé leur propre base de données sur le marché local, dans l'espoir d'envoyer des données de la base de données locale au backtrader pour une utilisation stratégique. Une méthode courante consiste à lire les données de marché de la base de données dans une trame de données pandas, puis à transmettre les données de cette trame de données à l'objet de données d'alimentation pandas du backtrader, afin que la stratégie puisse être utilisée.

Cependant, certains étudiants ne souhaitent pas transférer via pandas dataframe, mais souhaitent alimenter directement les données de la base de données vers l'objet de flux de données du backtrader, ce qui nécessite le développement d'une classe de flux de données spéciale pour la base de données.

Voici un flux MySQLData fourni par la communauté backtrader pour lire les données d'une base de données MySQL. Vous pouvez l'essayer.

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

 

Publié il y a 19 heures

Je suppose que tu aimes

Origine blog.csdn.net/qtbgo/article/details/111351729
conseillé
Classement