[R] Newbie code to count runs of up or down moves

Newbie1234 larry at riskengineer.com
Tue Mar 26 07:06:28 CET 2013


I hope this text does not come out unreadable as before.  It is readable in R
Studio..  What I am trying to do is take a time-series of prices and create
a histogram of the run lengths, where a run is a sequence of all up moves or
all down moves.  

Arun of length k is sequence of k moves all in the same direction followed
by a move in the opposite direction.
To do this I first difference the time series.  

Two first differences of the same sign followed by a first difference of
opposite sign is a run length 2. 

The outer loop is on the run length denoted by k. The middle loop is over
the date the run starts denoted by i.  The inner most loop is on dates from
date i  +1 through date i + k. indexed by j.

At each j , I test to see if the price change at date j has the same sign as
that on date j-1.  If after testing that the run has a length of at least k
and that is not more than k to determine if starting on date i there was a
run that was exactly of length k, then I increment y[k].

********************************

The code follows, then after the next ********, is the output with error
messages.

z<-c(3,1,4,5,2,1,0,3,5,8)
z
length(z)
y<-c(0,0,0,0,0,0,0,0,0,0)
y
length(y)
zdiff = diff(z)
zdiff
n<-length(zdiff)
n
x<-zdiff

f<-function(x,y) 
        {
            for (k in 1:n){
                for (i in 1:n-k){
                  endOfRun<-FALSE
                  anotherRunStep<-TRUE
                  if(i == (n-k)) endofrun<-TRUE
                  else if(x[i+k+1]*x[i+k] > 0) endOfRun<-FALSE
                  for(j in i+1:i+k){
                    if ((x[j] * x[j-1] < 0){
                      anotherRunStep<-FALSE
                      break
                    } # endif
                    
                  } # endforj
                  if (endOfRun && anotherRunStep) y[k]<-y[k]+1   
            } # endfori
         } #e endfork
        return(y)
}
f(x,y)

************************

[1] 3 1 4 5 2 1 0 3 5 8
> length(z)
[1] 10
> y<-c(0,0,0,0,0,0,0,0,0,0)
> y
 [1] 0 0 0 0 0 0 0 0 0 0
> length(y)
[1] 10
> zdiff = diff(z)
> zdiff
[1] -2  3  1 -3 -1 -1  3  2  3
> n<-length(zdiff)
> n
[1] 9
> x<-zdiff
> 
> f<-function(x,y) 
+         {
+             for (k in 1:n){
+                 for (i in 1:n-k){
+                   endOfRun<-FALSE
+                   anotherRunStep<-TRUE
+                   if(i == (n-k)) endofrun<-TRUE
+                   else if(x[i+k+1]*x[i+k] > 0) endOfRun<-FALSE
+                   for(j in i+1:i+k){
+                     if ((x[j] * x[j-1] < 0){
Error: unexpected '{' in:
"                  for(j in i+1:i+k){
                    if ((x[j] * x[j-1] < 0){"
>                       anotherRunStep<-FALSE
>                       break
Error: no loop for break/next, jumping to top level
>                     } # endif
Error: unexpected '}' in "                    }"
>                     
>                   } # endforj
Error: unexpected '}' in "                  }"
>                   if (endOfRun && anotherRunStep) y[k]<-y[k]+1   
Error: object 'endOfRun' not found
>             } # endfori
Error: unexpected '}' in "            }"
>          } #e endfork
Error: unexpected '}' in "         }"
>         return(y)
Error: no function to return from, jumping to top level
> }
Error: unexpected '}' in "}"
> f(x,y)
 [1] 6 5 6 5 5 6 5 6 0 0



--
View this message in context: http://r.789695.n4.nabble.com/Newbie-code-to-count-runs-of-up-or-down-moves-tp4662423p4662459.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list