2011-08-15 89 views
18

stock尋找最小值最大值股票圖表

都在那裏,讓我發現上面圖片中的最小值和最大值點的任何特定的算法?

我有文本格式的數據,所以我不需要在圖片中找到它。股票的問題是,他們有這麼多的本地分鐘和最大的簡單衍生品將無法正常工作。

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

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

編輯:

我看了一些評論,我只是沒有意外圈一些最小值和最大值及的。

我想我想出了一個算法,可能工作。首先找到最低點和最高點(當天的高點和低點)。然後畫三條線,從開放到高或低,以先到者爲準,然後從低到高或從高到低,最後關閉。然後在這三個區域的每一箇中找到距離該線最遠的點作爲我的高和低,然後重複循環。

+1

相關問題:http://stackoverflow.com/questions/6836409/finding-local-maxima-and-minima-in-r – yasouser

+4

如果有太多的最大值和最小值,你需要一個明確的標準來區分最大值和分鐘。這個標準將是應用程序和數據集特定的。例如,我不確定你爲什麼沒有在圖的最左邊圈出局部最小值。我建議你考慮一個因素來區分局部極小值,然後循環這些因素以達到數據集的預期結果。 – Mikhail

+1

問候,請主持你的數據文件,以便我們可以玩這個原型算法。 – tomdemuyt

回答

10

我通常使用移動平均值和指數移動平均值的組合。它證明(經驗上)適合於這項任務(至少足以滿足我的需求)。結果僅用兩個參數進行調整。下面是一個示例:

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] 
    ] 
+0

+1。 MA + EWMA(甚至簡單的MA)確實是這項工作的正確工具。不要試圖對這樣的任務過於精明,簡單的低通濾波器是你最好的朋友,因爲你無法正確定義這裏的最小和最大值。 –

+0

@Alexandre我懷疑這個「正確的工具」是否存在:)這些情節總是由圖解藝術大師們的「解釋」 –

-2

Fermat's Theorem將幫助您找到當地的最小值和最大值。

+2

我引用OP:「許多本地分鐘和最大值簡單衍生物都不起作用。」 – huitseeker

4

我不知道你的意思是「簡單的衍生物」。我明白這意味着你已經測試了一個gradient descent,並且發現它不令人滿意,因爲當地的極值豐富。如果是這樣,你想看看simulated annealing

退火是一種冶金過程,用於通過加熱和冷卻處理來調節金屬。 (......)。這些不規則性是由於原子卡在結構的錯誤位置。在退火過程中,金屬被加熱,然後緩慢冷卻。升溫可以讓原子獲得不需要的能量,緩慢的冷卻時間可以讓它們移動到結構中正確的位置。

(...) 然而,爲了逃避局部最優,算法將有采取在一個糟糕的方向一個步驟的概率:換句話說,採取增加值的一步最小化問題或降低最大化問題的價值。爲了模擬退火過程,這個概率將部分取決於算法中的「溫度」參數,該參數在高值時被初始化並且在每次迭代時被降低。因此,算法最初很有可能從附近的(可能是本地的)最優的移開。在迭代過程中,概率會降低,算法將收斂於(希望全局的)最佳值,但它沒有機會逃脫。 (source,削減&,重點煤礦)

知道是局部最優正是您的繪圖中的圓圈代表,上面,因此你想找到的東西。但是,正如我對「」的引用解釋那麼多本地分鐘和最大值的簡單衍生物不起作用,「,這也正是你所發現的。我假設你在所有「曲折」曲線使在兩個圓圈點之間產生了困難。

所有這一切似乎來區分你從曲線的點的其餘圈的最優解是他們整體性,準確的說:尋求更低的點比你圈左側你必須第一點進入進一步遠離無論在x座標方式比你需要爲其近鄰做同樣的事情。這就是退火給你的:取決於溫度參數,你可以控制你自己製造的跳躍的大小。有是一個價值,你趕上「大」本地最優,但錯過「小」的。我所建議的並不是革命性的:有幾個例子(例如12),人們從這些嘈雜的數據中獲得了很好的結果。

+0

模擬退火的重點是*避免*局部最優化,這正是OP *想要*找到的。 –

+0

我注意到他想跳過一些局部最優化,並且從他的圓圈曲線看起來像,我明白他想找到其他人。我認爲我的建議與這個問題高度相關,並且對我的答案進行了長時間的編輯,以爭論和解釋這個問題。請看一看。 – huitseeker

+0

+1取得的積分。調整溫度參數是關鍵。 –

2

只需以精確但可調的方式定義最小值和最大值即可,然後對其進行調整直至找到最小值和最大值的正確值。例如,您可以先通過將每個值替換爲該值的平均值以及左側和右側的N值來平滑圖表。通過增加N,可以減少找到的最小值和最大值的數量。

然後,您可以將最小值定義爲一個點,如果您左右忽略A值,則接下來的B值都會顯示一致的增加趨勢。通過增加B,你可以找到更少的最小值和最大值。通過調整A,你可以調整最小或最大允許的'平坦'。

一旦你使用可調算法,你可以調整它,直到它看起來是正確的。

1

我經常發現人類主觀感受到的極值(閱讀:股票圖表中唯一的極值,主要是隨機噪聲)通常是在傅里葉帶通濾波後找到的。你可以試試這個算法:

  1. 執行FFT
  2. 不要在頻率空間帶通。根據您希望極值看起來不錯的數據範圍,即感興趣的時間刻度,選擇「帶通」參數。
  3. 執行逆FFT。
  4. 選擇結果曲線的局部最大值。

第二步的參數似乎很主觀的,但同樣的,主觀是股票圖表分析的本質。

2

您可以使用Spline method創建contenous approximation polynom到您的原始功能[與期望的程度]。在獲得這個多項式後,在它上面[生成的多項式]尋找一個局部最小值/最大值[使用基本微積分]。

請注意,樣條方法給出了一個近似的多項式,它既'平滑' - 因此很容易找到局部最小/最大值,並且儘可能接近原始函數,因此局部最小/最大值應該在原始功能中非常接近真實值。

爲了提高準確性,在找到生成的多項式中的局部分鐘數/最大值之後,對於代表局部最小/最大值的每個x0,應查找所有x,使得x0-delta < x < x0 + delta找到真正的最小/最大此點代表。

3

您會注意到很多答案都是針對具有某種低通濾波的衍生產品。某種移動平均線,如果你願意的話。 fft,方形窗口移動平均線和指數移動平均線在基本面上都非常相似。但是,考慮到所有移動平均線的選擇,哪一個最好?

答案:高斯移動平均值;正常分佈的情況,你知道的。

原因:高斯濾波器是唯一不會產生「假」最大值的濾波器;最大的不是開始。這已經在連續數據和離散數據兩方面得到了理論證明(確保您對離散數據使用離散高斯!)。當你增加高斯西格馬時,局部最大值和最小值將以最直觀的方式合併。因此,如果您希望每天不超過一個本地最大值,則將西格瑪設置爲一個ET等值。

0

正如belisarius所提到的,最好的方法似乎涉及到數據平滑過濾。在足夠平滑的情況下,尋找斜率的變化應該找出局部分鐘和最大值(這裏的派生值將有所幫助)。我會使用一個居中的滑動窗口來運行中值/平均值,或者正在進行的EMA(或類似的IIR濾波器)。