SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.
Mostrando postagens com marcador Automação. Mostrar todas as postagens
Mostrando postagens com marcador Automação. Mostrar todas as postagens

segunda-feira, 15 de maio de 2017

taskscheduleR: Agendando tarefas no R.


A automação de tarefas é importante quando deseja-se executar um mesmo script de maneira regular. Nesse sentido o pacote taskscheduleR pode apoiar no agendamento de scripts feitos em R.

Como exemplo vamos supor que estamos interessados em decidir se devemos comprar ou vender uma ação no dia seguinte baseado no preço de fechamento dos dias anteriores usando um modelo de Máquinas de Suporte Vetorial.

#Limpa o Workspace
rm(list=ls())
#Chama a biblioteca
library(devtools)
library(quantmod)
library(kernlab)
#Instala o pacote taskscheduleR
devtools::install_github("jwijffels/taskscheduleR")
#Chama a biblioteca taskscheduleR
library(taskscheduleR)
#Especifica as datas de interesse
startDate = as.Date("2013-01-01") 
endDate = as.Date("2015-12-31")
#Obtêm os dados do ativo PETR4 e PETR3
getSymbols("PETR4.SA", src="yahoo",from=startDate,to=endDate)
#Faz o Candle Chart
candleChart(PETR4.SA,theme='white', type='candles') 
reChart(major.ticks='months',subset='first 16 weeks') 

O Candle Chart é apresentado a seguir:


Em seguida vamos treinar uma máquina para tentar apontar a direção do resultado futuro, isto é, se a ação irá apresentar um resultado positivo ou negativo:

#Retorno do Preço de Fechamento
ret<-na.omit(ClCl(PETR4.SA))
#Direção do mercado
y<-as.numeric(ifelse(ret<0,0,1))
#Cria a base de dados
df<-data.frame("Y"=c(y[-1],NA),"X"=ret)
#Renomeia as colunas
colnames(df)<-c("Y","X")
Nesse bloco a ideia é tentar prever a direção $Y=sinal(r_{t})$ usando o retorno do período anterior $X=r_{t-1}$. Supondo que o processo de treinamento tenha sido realizado e que tenhamos descobertos $C=0.1$ e $\sigma=16$ para o modelo C-SVC e kernel Gaussiano, a máquina é construída fazendo-se:
#Constrói a máquina
svm <- ksvm(Y~X,data=df, type="C-svc",C=0.1,
            kpar=list(sigma=16),cross=3)
#Faz a previsão
pred<- kernlab::predict(svm,df)
#Compara com os valores reais
table(pred,df$Y)
#Salva a máquina treinada
save.image("Maquina.RData")
Supondo que essa acurácia seja a desejada, agora vamos programar para que o R todo dia baixe a cotação do dia anterior e faça a previsão de qual deveria ser nossa ação no dia atual (vender se a previsão é que o retorno seja positivo ou comprar se a previsão seja do retorno negativo). As opções do pacote taskscheduleR são: ‘ONCE’, ‘MONTHLY’, ‘WEEKLY’, ‘DAILY’, ‘HOURLY’, ‘MINUTE’, ‘ONLOGON’, ‘ONIDLE’. O primeiro passo é montar um script geral que será executado todo dia:
#Chama a biblioteca
library(quantmod)
library(kernlab)
#Lê a máquina criada
load("Maquina.RData")
#Obtêm a cotação atual
getSymbols("PETR4.SA", src="yahoo")
#Último retorno observado
ret<-tail(ClCl(PETR4.SA),1)
#Faz a previsao para o dia
previsao<-kernlab::predict(svm,ret)
#Monta o arquivo de saida
fileConn<-file("Decisao.txt")
writeLines(ifelse(previsao==1,"Vender","Comprar"), fileConn)
close(fileConn)
Esse script deve ser salvo em um arquivo de extensão .R (por exemplo, ScriptPrevisao.R) e, no nosso exemplo, ele deverá ser executado todo dia as 8:00 AM. Após a execução, ele criará um arquivo denominado Decisao.txt que contêm a decisão do dia: Comprar ou Vender. O último passo é programar o computador para executar esse script todo dia no horário determinado, para isso, basta executarmos uma única vez no R:
#Faz o agendamento
library(taskscheduleR)
myscript <- system.file("saida", "ScriptPrevisao.R", package = "taskscheduleR")
#O computador irá executar todo dia as 8:00AM
taskscheduler_create(taskname = "DecisaoPETR4", rscript = myscript, 
                     schedule = "DAILY", starttime = "08:00")
Caso queira deletar o agendamento para que ele não se repita mais, basta fazer:
#Deleta o agendamento
library(taskscheduleR)
taskscheduler_delete(taskname = "DecisaoPETR4")




quinta-feira, 15 de outubro de 2015

Automação de tarefas usando rSelenium.


A automação de tarefas é uma maneira simples de evitar trabalhos repetitivos, em especial, desejamos coletar dados de sites e por algum motivo, cada observação (ou grupo de observações) precisa ser "manualmente" solicitada.

Essa solicitação pode ser exigida por meio de captchas ou outro mecanismo, impedindo assim muitas consultas ao servidor alvo e garantindo estabilidade ao serviço.

Entretanto, algumas ferramentas auxiliam na construção de bots para a coleta dessas informações, processo esse conhecido como Web scraping. Dentre as ferramentas mais utilizadas, destaco o iMacro e rSelenium (baseado na solução Selenium).

Nesse post trabalharemos com o driver do navegador Chrome, para isso, o primeiro passo é obter esse driver:

#Limpa o workspace
rm(list=ls())

#Define o  Working Directory
setwd("C:/Users/RSelenium")

#Instalação do RSelenium
library(RSelenium)

#Confere se o RSelenium está instalado
checkForServer()

#Baixa o driver: http://chromedriver.storage.googleapis.com/index.html
bool<-FALSE
bool<-file.exists("chromedriver.exe")
if(!bool)
{
  #Baixa o arquivo zip
  down<-"http://chromedriver.storage.googleapis.com/2.13/chromedriver_win32.zip"
  download.file(down,paste(getwd(),"/chromedriver.zip",sep=""))
  
  #Extrai o arquivo
  unzip(paste(getwd(),"/chromedriver.zip",sep=""))
  
  #Deleta o arquivo
  file.remove((paste(getwd(),"/chromedriver.zip",sep="")))
}
O código anterior obtêm o driver e armazena na pasta escolhida, em seguida, iniciamos o navegador:
#Inicia o servidor
startServer(args = c(paste("-Dwebdriver.chrome.driver=",getwd(),"/chromedriver.exe -Dwebdriver.chrome.args='--disable-logging'",sep="")), log = FALSE, invisible = FALSE)
remDr <- remoteDriver(browserName = "chrome")

#Abre o navegador
remDr$open()

#Maximiza a janela
remDr$maxWindowSize()
Nas etapas seguintes é possível navegar por páginas específicas e coletar as informações de interesse, por exemplo, um site muito útil para análise fundamentalista é o sítio http://fundamentus.com.br/. Se desejarmos obter os dados da PETR4, basta acessar:
#Vai para a pagina de interesse
site<-"http://fundamentus.com.br/balancos.php?papel=PETR4"
remDr$navigate(site)
Note que para obter os dados é necessário preencher o valor do captcha, para isso, podemos usar algum sistema de Optical character recognition (OCR) para reconhecer as letras indicadas no captcha. É necessário obter a imagem do captcha, uma solução é fazer um printscreen do site e editar a imagem:
#Faz um printscreen do site
library(base64enc)
img<-remDr$screenshot(display = FALSE, useViewer = TRUE, file = NULL)
writeBin(base64Decode(img, "raw"), 'site.png')
Uma vez obtido o valor do captcha, podemos passar o resultado para o site da seguinte forma:
#Exemplo de captcha solucionado
txt<-"TOWIT"
  
#Encontra o objeto da caixa de texto
webElem <- remDr$findElement(using = "name", "codigo_captcha")

#Manda o resultado do captcha
webElem$sendKeysToElement(list(txt))

#Encontra o objeto do botão de submit
webElem <- remDr$findElement(using = "name", "submit")

#Clica no botão
webElem$clickElement()

#Fecha as conexões
remDr$close()
remDr$closeServer()
Note que os comandos das linhas 5 e 11 precisam ser preenchidos com base nas características do objeto de interesse na página alvo, isso pode ser feito averiguando o código fonte da página por meio de qualquer navegador. Quanto a solução do captcha existem ferramentas de Optical character recognition (OCR) e também de serviços como o http://www.deathbycaptcha.com/ que realizam esse processo.