[R-br] Ticktest - Código lento
Benilton Carvalho
beniltoncarvalho em gmail.com
Segunda Junho 20 21:16:40 BRT 2011
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>
> **
> 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>
>
>> 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>
>>
>>> 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
>>> 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 listR-br em listas.c3sl.ufpr.brhttps://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
>> 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 listR-br em listas.c3sl.ufpr.brhttps://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
> 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)
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20110621/223aa891/attachment.html>
Mais detalhes sobre a lista de discussão R-br