Re: Time series minima and maxima
- To: mathgroup at smc.vnet.net
- Subject: [mg115942] Re: Time series minima and maxima
- From: Ray Koopman <koopman at sfu.ca>
- Date: Wed, 26 Jan 2011 05:30:38 -0500 (EST)
- References: <ihm4nf$kgv$1@smc.vnet.net>
On Jan 25, 1:21 am, Jagra <jagra24... at mypacks.net> wrote: > Working on some code to find minima and maxima of time series data I > came across this earlier discussion on the forum: > > http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_frm/thread/99f97cb1f11391f6/5527f47b63c7cdbb?lnk=gst&q=local+minima+maxima#5527f47b63c7cdbb > > In it, Ray Koopman posted a neat way to do it, but I have some > questions about what I need to do next. > > I took Ray's code and wrapped it in a function: > > findMinimaMaxima[data_, window_] := With[{k = window}, > minmaxdata[[k + Flatten[Position[Partition[data[[All, 2]], 2 k + 1, 1], > x_List /; x[[k + 1]] < Min[Delete[x, k + 1]] || [[k + 1]] > > Max[Delete[x, k + 1]]]]]]] There's a typo: after the || you should have x[[k+1]] > ... . Also, shouldn't minmaxdata[[...]] be data[[...]] > > The findMinimaMaxima[] function has a window parameter, which I hoped > would enable the function to look further left and right and thereby > identify fewer minima and maxima, but more major ones (relative to > the length of the window). > I grab some time series data using FinancialData, strip off the > associated date fields and replaced them with integer positions to > make things easier to debug: > > data = FinancialData["SPY", {"May 1, 2006", "Jan. 21, 2011"}][[All, > 2]];data = Transpose[{Range[Length@data], data}]; > > Now. > > minimamaxima = findMinimaMaxima[data, 50]; > ListLinePlot[{data, minimamaxima}, Joined -> True, ImageSize -> 500] > > When you look at the plot, you'll see that with a 50 interval window > (and probably almost any other lengths) and data from "SPY" some > problems appear. > > (Note: You can run a couple of other instruments to see things that > move up and down different ways at different times. Try "GLD" or > "TLT") > > Two minor problems. The function doesn't identify the first point > as either a minima or maxima and it doesn't identify what one would > expect to be the last minima or maxima. The window contains 2k+1 points. The first k points and last k points are never considered as possible extrema. Also, the algorithm will miss an extremum if there is more than one point with that value in the window. > > More important, one would want the function to return a list which > alternates between minima and maxima, but the chart shows that a > couple of times, it returns 2 minima in a row or 2 maxima in a row. > In some case it might return even more. So, clearly expanding the > window left and right more than the original value of 2 the Ray used > introduces some problems. > > I first thought to add some code to get rid of the extra point after > the calculation, but everything I thought of seemed clumsy and drifted > away from the clarity of Ray's original solution. > > I haven't downloaded Mathematica 8 yet. Any chance it has a way to > do this sort of thing? This relates to data compression too I think, > in getting rid of the extraneous data. > > Thanks in advance for any suggestions or directions pursue.