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 <[email protected] <mailto:[email protected]>>

    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 <[email protected]
    <mailto:[email protected]>>

        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
        [email protected] <mailto:[email protected]>
        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
    [email protected]  <mailto:[email protected]>
    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
    [email protected] <mailto:[email protected]>
    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
[email protected]
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
[email protected]
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.

Responder a