[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