Skip to content

Instantly share code, notes, and snippets.

@palencar
Forked from maurobaraldi/bovespa_intraday.py
Last active May 6, 2021 02:39
Show Gist options
  • Save palencar/0e1dd1f7dbd0d9e20b92acb871d8f5bf to your computer and use it in GitHub Desktop.
Save palencar/0e1dd1f7dbd0d9e20b92acb871d8f5bf to your computer and use it in GitHub Desktop.
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)
default:
engine: "mysql"
host: "localhost"
database: "traderbot"
user: "bot"
password: "db_password"
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `intraday` (
`symbol` varchar(12) DEFAULT NULL,
`datetime` datetime DEFAULT NULL,
`open` double DEFAULT NULL,
`high` double DEFAULT NULL,
`low` double DEFAULT NULL,
`close` double DEFAULT NULL,
`volume` bigint(12) unsigned NOT NULL DEFAULT '0',
UNIQUE KEY `intradayindex` (`symbol`,`datetime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment