一千萬個為什麽

搜索

查找股票圖表的最小最大值

stock

是否有任何特定的算法可以讓我找到上圖中的最小和最大點?

我有文本格式的數據,所以我不需要在圖片中找到它。股票的問題在於它們擁有如此多的本地市場和最大的簡單衍生品將無法運作。

我正在考慮使用數字濾波器(z域),並平滑圖形,但我仍然留下太多的局部最小值和最大值。

我也試圖使用移動平均線來平滑圖形,但我又有太多的最大值和分鐘。

編輯:

我讀了一些評論,但我沒有偶然圈出一些最小值和最大值。

我想我想出了一個可行的算法。首先找到最低點和最高點(當天的高點和當天的低點)。然後繪制三條線,從開路到高位或低位,先從一條線到另一條線從低到高或從高到低,最後再閉合。然後在這三個區域中的每個區域中找到距離線最遠點的點作為我的高和低然後重復循環。

最佳答案

我通常使用移動平均線和指數移動平均線的組合。事實證明(經驗上)適合於任務(至少足以滿足我的需要)。僅使用兩個參數調整結果。這是一個示例:

enter image description here

修改

如果它對某人有用,這是我的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]
  ]

轉載註明原文: 查找股票圖表的最小最大值