[R-br] Ticktest - Código lento

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


A correção foi acertada. Mas não era o problema que eu havia mencionado.
Por exemplo:

Data 	Operação 	Preço 	Classificação
1/1/2011 	10 	$10.00 	NC
1/1/2011 	20 	$10.00
	NC
1/1/2011 	30 	$10.00 	NC
1/1/2011 	40 	$10.00 	NC
1/1/2011 	50 	$10.20 	UPTICK
1/1/2011 	60 	$10.20 	ZERO.UPTICK
1/1/2011 	70 	$10.20 	ZERO.UPTICK
1/1/2011 	80 	$10.20 	ZERO.UPTICK
1/1/2011 	90 	$10.20 	ZERO.UPTICK


Assim é que a seguinte sequencia deveria ser classificada,
Mas o código tem dado essa resposta:
Data 	Operação 	Preço 	Classificação
1/1/2011 	10 	$10.00 	NC
1/1/2011 	20 	$10.00
	NC
1/1/2011 	30 	$10.00 	C
1/1/2011 	40 	$10.00 	C
1/1/2011 	50 	$10.20 	UPTICK
1/1/2011 	60 	$10.20 	ZERO.UPTICK
1/1/2011 	70 	$10.20 	C
1/1/2011 	80 	$10.20 	C
1/1/2011 	90 	$10.20 	C


O código olha apenas para o imediatamente anterior, o que atrapalha o 
resultado.

Luciano.

Em 6/20/2011 8:29 PM, Benilton Carvalho escreveu:
> os sinais nos diffs pro loop 3 estavam invertidos (essa era a parte do 
> 'nao-testado'):
>
> dy = diff(y[,3])
> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'DOWNTICK', y[-1, 4])
> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'UPTICK', y[-1, 4])
> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in% 
> c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4])
> y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] 
> %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
>
> adicionalmente, os resultados que agora passo batem com aqueles 
> providos pelo seu codigo original.
>
> sobre o primeiro item nao ser classificado no loop 2, e' um reflexo do 
> que o seu codigo faz, pois ele comeca a classificar em y[i+1,4] com 
> 'i' comecando em 1...
>
> b
>
> 2011/6/21 Luciano Ramos Gonçalves <lrg.financas em gmail.com 
> <mailto:lrg.financas em gmail.com>>
>
>     Fiz uns testes e realmente ficou muito mais rápido. Apenas três
>     problemas apareceram, todos com a mesma provável resolução.
>     No loop 2:
>     O primeiro negócio não é classificado, e os próximos, digamos, 6,
>     mantém o mesmo preço, logo, todos estes deveriam ser não
>     classificados. O código apenas desclassifica o subsequente. Para
>     que estivesse ok, teria que ser repetido.
>     No loop 3:
>     Acontece algo semelhante. Se havia um Zero.DOWNTICK, e o próximo
>     negócio também não mudou este tb deveria ser ZERO.DOWNTICK, mas o
>     código está mantendo "C".
>
>     Grato,
>
>     Luciano.
>
>
>     Em 6/20/2011 5:34 PM, Benilton Carvalho escreveu:
>>     abaixo, nao testado, deve estar bem proximo do q vc precisa. b
>>
>>     loop 1:
>>
>>     y[,4] = ifelse(y[,2] == 10, 'NC', 'C')
>>
>>     loop 2:
>>
>>     n = nrow(y)
>>     y[-1, 4] = ifelse(diff(y[,3]) == 0 & y[-n, 4] == 'NC', 'NC',
>>     y[-1, 4])
>>
>>     loop 3:
>>
>>     dy = diff(y[,3])
>>     y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy > 0, 'DOWNTICK', y[-1, 4])
>>     y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy < 0, 'UPTICK', y[-1, 4])
>>     y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in%
>>     c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 4])
>>     y[-1, 4] = ifelse(y[-1, 4] == 'C' & dy == 0 & y[-n, 4] %in%
>>     c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 4])
>>
>>
>>     2011/6/20 Luciano Ramos Gonçalves <lrg.financas em gmail.com
>>     <mailto:lrg.financas em gmail.com>>
>>
>>         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"
>>         }
>>
>>         _______________________________________________
>>         R-br mailing list
>>         R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>>         https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>         Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e
>>         forneça código mínimo reproduzível.
>>
>>
>>
>>
>>     -- 
>>     Successful people ask better questions, and as a result, they get
>>     better answers. (Tony Robbins)
>>
>>
>>     _______________________________________________
>>     R-br mailing list
>>     R-br em listas.c3sl.ufpr.br  <mailto:R-br em listas.c3sl.ufpr.br>
>>     https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>     Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
>
>
>     _______________________________________________
>     R-br mailing list
>     R-br em listas.c3sl.ufpr.br <mailto:R-br em listas.c3sl.ufpr.br>
>     https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>     Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e
>     forneça código mínimo reproduzível.
>
>
>
>
> -- 
> Successful people ask better questions, and as a result, they get 
> better answers. (Tony Robbins)
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20110620/115e62f7/attachment-0001.html>


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