我通常使用移動平均值和指數移動平均值的組合。它證明(經驗上)適合於這項任務(至少足以滿足我的需求)。結果僅用兩個參數進行調整。下面是一個示例:
編輯
在情況下,它是爲別人有用的,這是我的Mathematica代碼:
f[sym_] := Module[{l},
(*get data*)
l = FinancialData[sym, "Jan. 1, 2010"][[All, 2]];
(*perform averages*)
l1 = ExponentialMovingAverage[MovingAverage[l, 10], .2];
(*calculate ma and min positions in the averaged list*)
l2 = {#[[1]], l1[[#[[1]]]]} & /@
MapIndexed[If[#1[[1]] < #1[[2]] > #1[[3]], #2, Sequence @@ {}] &,
Partition[l1, 3, 1]];
l3 = {#[[1]], l1[[#[[1]]]]} & /@
MapIndexed[If[#1[[1]] > #1[[2]] < #1[[3]], #2, Sequence @@ {}] &,
Partition[l1, 3, 1]];
(*correlate with max and mins positions in the original list*)
maxs = First /@ (Ordering[-l[[#[[1]] ;; #[[2]]]]] + #[[1]] -
1 & /@ ({4 + #[[1]] - 5, 4 + #[[1]] + 5} & /@ l2));
mins = Last /@ (Ordering[-l[[#[[1]] ;; #[[2]]]]] + #[[1]] -
1 & /@ ({4 + #[[1]] - 5, 4 + #[[1]] + 5} & /@ l3));
(*Show the plots*)
Show[{
ListPlot[l, Joined -> True, PlotRange -> All,
PlotLabel ->
Style[Framed[sym], 16, Blue, Background -> Lighter[Yellow]]],
ListLinePlot[ExponentialMovingAverage[MovingAverage[l, 10], .2]],
ListPlot[{#, l[[#]]} & /@ maxs,
PlotStyle -> Directive[PointSize[Large], Red]],
ListPlot[{#, l[[#]]} & /@ mins,
PlotStyle -> Directive[PointSize[Large], Black]]},
ImageSize -> 400]
]
相關問題:http://stackoverflow.com/questions/6836409/finding-local-maxima-and-minima-in-r – yasouser
如果有太多的最大值和最小值,你需要一個明確的標準來區分最大值和分鐘。這個標準將是應用程序和數據集特定的。例如,我不確定你爲什麼沒有在圖的最左邊圈出局部最小值。我建議你考慮一個因素來區分局部極小值,然後循環這些因素以達到數據集的預期結果。 – Mikhail
問候,請主持你的數據文件,以便我們可以玩這個原型算法。 – tomdemuyt