Skip to content

Instantly share code, notes, and snippets.

@BeneInfosec
Forked from palencar/bovespa_intraday.py
Created May 6, 2021 02:39
Show Gist options
  • Save BeneInfosec/27ffa4a4613ffe3bdf270f9b0f7352d4 to your computer and use it in GitHub Desktop.
Save BeneInfosec/27ffa4a4613ffe3bdf270f9b0f7352d4 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