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.

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")