Here is how I would solve the problem using xts:

library(quantmod)

getSymbols("SPY")

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)

Best,

--

Joshua Ulrich | FOSS Trading: www.fosstrading.com

R/Finance 2012: Applied Finance with R

www.RinFinance.com

On Fri, Mar 23, 2012 at 5:07 AM, Paolo Giusti <

[hidden email]> 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

>

> _______________________________________________

>

[hidden email] 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.

_______________________________________________

[hidden email] 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.