Grava as cotações intraday por minuto em um banco de dados. Os dados obtidos do banco de dados podem ser agregados por outros programas em períodos maiores em um formato OHLCV.

Home   »   Grava as cotações intraday por minuto em um banco de dados. Os dados obtidos do banco de dados podem ser agregados por outros programas em períodos maiores em um formato OHLCV.

import argparse
from datetime import datetime
from json import loads
from requests import get
import pandas as pd
import numpy as np
import pymysql
import yaml
from sqlalchemy import create_engine

parser = argparse.ArgumentParser()

parser.add_argument('-s', '--names-list', nargs='+', default=[])

args = parser.parse_args()

symbols = args.names_list

base = 'http://cotacoes.economia.uol.com.br/ws/asset'
assets = base + '/stock/list?size=10000'
intraday = base + '/{asset}/intraday?size={size}&callback=uolfinancecallback0&fields=date,price,open,low,high,vol'
assets = {i['code']: i['idt'] for i in get(assets).json()['data']}

assets = {x: v for x, v in assets.items() if x in symbols}

def get_intraday(asset, size):
    url = intraday.format(**{'asset': asset, 'size': size})
    return loads(get(url).content[20:-2])

dbcfg = yaml.load(open('config.yml'))

engine = create_engine("mysql+mysqlconnector://{user}:{pw}@localhost/{db}"
                       .format(user=dbcfg['default']['user'],
                               pw=dbcfg['default']['password'],
                               db=dbcfg['default']['database']), echo=False)

for asset, code in assets.items():

    symbol = asset.split('.')[0]

    lastdt = pd.read_sql_query('select max(datetime) as lastdt from intraday where symbol = "{}"'.format(symbol), con=engine)

    td = pd.Timestamp(np.datetime64('now')).tz_localize('UTC').tz_convert('America/Sao_Paulo').tz_localize(None) - lastdt.lastdt[0]
    size = int(td.seconds/60) + 1

    print("{} : last {} minutes".format(symbol, size))

    quote = get_intraday(code, size).get('data', {})

    if(len(quote) > 0):

        # print(lastdt.lastdt[0])

        df = pd.DataFrame(quote)
        df['datetime'] = pd.to_datetime(df['date'], unit='ms').dt.tz_localize('UTC').dt.tz_convert('America/Sao_Paulo').dt.tz_localize(None)

        if(len(df) > 0):

            df.sort_values(by='datetime', inplace=True)
            df.drop('date', axis=1, inplace=True)
            df.loc[df.shape[0]-2:,'vol'] = df['vol'].rolling(window=2).apply(lambda x: x[1] - x[0]).dropna(axis=0)
            df = df.assign(symbol=symbol, open=df['price'], high=df['price'], low=df['price'], vol=df["vol"].astype(int))
            df.rename(columns={'price': 'close', 'vol': 'volume'}, inplace=True)

            # print("Ignoring {} minutes".format(len(df[df.datetime <= lastdt.lastdt[0]].datetime)))

            df = df[df.datetime > lastdt.lastdt[0]]

            # print(df.datetime.tail(1))

            df.to_sql(name='intraday', con=engine, if_exists = 'append', index=False)

Leave a Reply

Your email address will not be published. Required fields are marked *