[R-SIG-Finance] Vectorized local min/max finding

Joshua Ulrich josh.m.ulrich at gmail.com
Fri Mar 23 13:27:10 CET 2012

Here is how I would solve the problem using xts:

SPY$ma <- SMA(Cl(SPY),50)
SPY$diff <- (Cl(SPY)-SPY$ma)
SPY$diff[1:50] <- 0
SPY$group <- cumsum(c(0,diff(SPY$diff>0,na.pad=FALSE)) != 0)
SPY$grpLen <- ave(SPY$diff, SPY$group, FUN=length)
SPY$grpMin <- ave(SPY$diff, SPY$group, FUN=min)
SPY$grpMax <- ave(SPY$diff, SPY$group, FUN=max)

Joshua Ulrich  |  FOSS Trading: www.fosstrading.com

R/Finance 2012: Applied Finance with R

On Fri, Mar 23, 2012 at 5:07 AM, Paolo Giusti <gommoskipper at gmail.com> wrote:
> I am trying to find a vectorized solution (if there is one) to a simple problem.
> I have a vector of values representing the close prices of a security
> and another vector of their moving average.
> I construct a simple "distance" object of their difference:
> diff <- close - ma
> Now I would like to calculate some simple statistics like:
> 1. The number of times the diff crosses the '0' line
> 2. The duration between each cross (number of samples)
> 3. The min and max values of diff between each cross.
> This is easy to do using "for loops" but really slow. Given this is a
> really basic problem I'm hoping that there a faster solution.
> Thank you
> Paolo
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions should go.

More information about the R-SIG-Finance mailing list