[R-br] Ticktest - Código lento

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


Peço desculpas pela falta de clareza, ela é em razão do pouco 
conhecimento sobre o R.
Entretanto, a indicação do laço while foi suficiente para resolver a 
questão da seguinte forma:
obs.: talvez ainda haja maneira mais rápida:
#Loop 2
n = nrow(y)
while (any ( (diff(y[,5]) == 0 & y[(-n), 13] == 'NC' & y[-1, 13] !='NC' )))
{
y[-1, 13] = ifelse(diff(y[,5]) == 0 & y[-n, 13] == 'NC', 'NC', y[-1, 13])
}
})
#Loop 3:
dy = diff(y[,5])
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy < 0,
  'DOWNTICK', y[-1, 13])
y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy > 0,
  'UPTICK', y[-1, 13])
while (any(y[,13]=="C"))
{
     y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n, 13]
      %in% c('UPTICK', 'ZERO.UPTICK'), 'ZERO.UPTICK', y[-1, 13])
     y[-1, 13] = ifelse(y[-1, 13] == 'C' & dy == 0 & y[-n, 13]
      %in% c('DOWNTICK', 'ZERO.DOWNTICK'), 'ZERO.DOWNTICK', y[-1, 13])
}
})

Muito agradecido,
Luciano.




Em 6/20/2011 9:16 PM, Benilton Carvalho escreveu:
> Luciano,
>
> por gentileza, de uma descricao precisa e um exemplo reproduzivel do 
> codigo ao qual vc se refere como lento para que possamos tentar ajudar.
>
> O exemplo que te dei reproduz exatamente o codigo que voce passou... 
> mas entendo que, alem da eficiencia do codigo, vc se refere a um outro 
> problema, que me parece poder ser resolvido com a execucao do codigo 
> que passei em um laco while (no qual vc armazena o estado anterior da 
> sua tabela e suspende a execucao quando voce obtiver duas tabelas 
> identicas).
>
> Dito isso, passe-nos um exemplo detalhado das condicoes necessarias 
> para cada caso possivel, incluindo uma tabela inicial (que possa ser 
> preferencialmente lida sem maiores trabalhos por quem se propoe a te 
> ajudar) e a tabela final correta, a ser obtida no fim da execucao da 
> rotina.
>
> b
>
> 2011/6/21 Luciano Ramos Gonçalves <lrg.financas em gmail.com 
> <mailto:lrg.financas em gmail.com>>
>
>     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  <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/93d3415c/attachment.html>


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