-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
default: | |
engine: "mysql" | |
host: "localhost" | |
database: "traderbot" | |
user: "bot" | |
password: "db_password" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*!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