[R-br] Ticktest - Código lento

Luciano Ramos Gonçalves lrg.financas em gmail.com
Segunda Junho 20 17:09:09 BRT 2011


Colaboradores do grupo, realizei um teste de financas em R, conhecido 
como TICKTEST, porém meu código ficou muito lento. Talvez alguém possa 
ajudar a torná-lo mais ágil.

Grato,
Luciano

Resumidamente:
1 - Prentende-se classificar mudanças de preço em uma ação.
2 - O primeiro negócio do dia não é classificado. Os negócios 
subsequentes em que haja estabilidade no preço tb não são classificados.
3 - Classifica-se as restantes conforme o movimento do preço. Se sobe, 
UPTICK. Se desce, DOWNTICK. Se é estável e a última variação foi 
positiva, ZERO.UPTICK. Se é estável e a última variação foi positiva, 
ZERO.DOWNTICK.

Um exemplo dos dados:

Data 	Operação 	Preço 	Classificação
1/1/2011 	10 	$10.00 	NC
1/1/2011 	20 	$9.90 	DOWNTICK
1/1/2011 	30 	$9.90 	ZERO.DOWNTICK
1/1/2011 	40 	$10.10 	UPTICK
1/1/2011 	50 	$10.20 	UPTICK
1/2/2011 	10 	$9.80 	NC
1/2/2011 	20 	$9.80 	NC
1/2/2011 	30 	$9.90 	UPTICK
1/2/2011 	30 	$9.90 	ZERO.UPTICK


_*O CÓDIGO EM SI:*_
*#* Abre o arquivo de dados, cria um novo objeto "y" com uma coluna vazia.
x <- read.table("dados.txt",sep=";",header=F,skip=1)
y <- cbind(x,(rep(NA,nrow(x))))

*# 1º Loop:* Se a operação foi nº 10 não classifica, o resto classifica.
z <- 1:nrow(x)
for (t in z)
{
     if (y[t,2]==10)
         y[t,4]<-"NC"
     else y[t,4] <-"C"
}

*# 2º Loop:* Se a operação anterior não foi classificada e o preço não 
mudou na atual, desclassifica esta também.
w <- 1:(nrow(x)-1)
for (i in w)
{
     if (y[i,4]=="NC" & y[i,3]==y[i+1,3])
         y[i+1,4]<-"NC"
}
*# 3º Loop:* divide as operações classificadas em quatro classes:
for (i in w)
{
*#*Se o preço diminuiu, DOWNTICK;
     if (y[i+1,4]=="C" & y[i,3]>y[i+1,3])
         y[i+1,4]<-"DOWNTICK"
*#*Se o preço aumentou, UPTICK;
     if (y[i+1,4]=="C" & y[i,3]<y[i+1,3])
         y[i+1,4]<-"UPTICK"
*#* Se o preço permaneceu constante, mas a ultima variação foi positiva, 
ZERO.UPTICK;
     if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] &
             (y[i,4]=="UPTICK" | y[i,4]=="ZERO.UPTICK"))
         y[i+1,4]<-"ZERO.UPTICK"
*#*Se o preço permaneceu constante, mas a ultima variação foi negativa, 
ZERO.DOWNTICK;
     if (y[i+1,4]=="C" & y[i,3]==y[i+1,3] &
             (y[i,4]=="DOWNTICK" | y[i,4]=="ZERO.DOWNTICK"))
         y[i+1,4]<-"ZERO.DOWNTICK"
}
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20110620/40524968/attachment.html>


Mais detalhes sobre a lista de discussão R-br