2012-01-11 16 views
6

To pytanie jest kontynuacją this one.Jak rozpoznać punkty zwrotne w danych o cenach akcji

Moim celem jest znalezienie punktów zwrotnych w danych o cenach akcji.

tej pory:

Tried różnicowania wygładzonego zestaw cenę, z pomocą Dr. Andrew Burnett-Thompson wyśrodkowany przy użyciu metody pięć punktów, jak wyjaśniono here.

Używam EMA20 danych kleszcza do wygładzania zestawu danych.

Dla każdego punktu na wykresie otrzymuję pierwszą pochodną (dy/dx). Tworzę drugi wykres punktów zwrotnych. Za każdym razem, gdy dy/dx jest pomiędzy [-some_small_value] i [+ some_small_value] - dodaję punkt do tego wykresu.

Problemy są następujące: Nie dostaję prawdziwych zwrotów, dostaję coś bliskiego. mam zbyt dużo lub zbyt mało punktów - depening na [some_small_value]

Próbowałem drugi sposób dodawania temperaturę podczas dy/dx zmienia się z ujemnego na dodatni, co stwarza również zbyt wiele punktów, może dlatego używam EMA danych tickowych (a nie 1-minutowej ceny zamknięcia)

Trzecią metodą jest podzielenie zbioru danych na n-plasterki oraz znalezienie punktów minimalnych i maksymalnych. To działa dobrze (nie idealne), ale jest opóźnione.

Ktoś ma lepszą metodę?

I załączeniu 2 zdjęć wyjściu (1st pochodna i n punktów min/max)

enter image description here enter image description here

+1

Dlaczego jest to oznaczone jako "algorytm graficzny"? – harold

+0

@harold Domyślam się, że chce algorytmu, a dane wejściowe można wykreślić (patrz wyżej). ; D W bardziej poważny ton, to oczywiście nie jest algorytm wykresu. – Patrick87

+0

tag usunięty, teraz masz pomysł, jak rozwiązać ten problem? : D dziękuje – Yaron

Odpowiedz

4

Można podjąć drugą pochodną pod uwagę, co oznacza, że ​​należy dodatkowo (do pierwszej pochodnej) oceń (y_{i-1} + y_{i+1} - 2y_i)/(dx)². Jeśli jest powyżej pewnego progu, masz maksimum, jeśli jest poniżej, masz minimum, a możesz go odrzucić. To powinno wyrzucić wiele punktów, które nadal używasz metody znalezienia extremy (y' = 0), ponieważ ten warunek jest również ważny dla punktów siodłowych.

1

Oto tylko pomysł, rodzaj pomysłu z innej perspektywy i prawdopodobnie bardzo zły pomysł, ale ponieważ zróżnicowanie nie działa, coś takiego może być myślą.

Najpierw należy określić minimalny znaczący interwał osi X. Na twojej figurze, jeśli uznasz to za zbyt małe, dostaniesz fałszywe pozytywne sygnały z guzów. Jest to koncepcyjnie podobne do idei wygładzania danych. Nazwij ten interwał dx.

Następnie, korzystając z przesuwanego okna o wymiarach dx, wygeneruj krzywą średniej ruchomej odpowiadającą krzywej. Istnieje wiele różnych sposobów na zastanowienie się nad tym (usunięcie statystycznych wartości odstających lub użycie większej lub mniejszej liczby punktów w oknie). Nazwij tę krzywą g (x) i oryginalną krzywą f (x). Dodatkowo, utwórz krzywą h (x), która daje pewną miarę zmienności danych w oknie przesuwnym, której używasz do obliczenia g (x) (odchylenie standardowe powinno działać poprawnie, jeśli używasz kilku punktów z przedziału).

Rozpocznij teraz krzywe obliczeniowe w postaci c_m (x) = | f (x) - g (x) | - m * h (x). Możesz zacząć od m = 1.Punkty x, dla których c_m (x) jest dodatnie, są kandydatami do lokalnego minimum/maksimum. W zależności od liczby trafień, możesz zacząć zwiększać lub zmniejszać m. Możesz to zrobić w sposób podobny do wyszukiwania binarnego: jeśli chcesz więcej punktów, ustaw m = (min + m)/2, a jeśli chcesz mniej punktów, ustaw m = (max + m)/2 (dostosowując min i max odpowiednio).

Oto przykład tego, co sugeruję. Powiedzmy, że mamy następujące serie:

f(x) = [ 1, 2, 4, 3, 2, 3, 6, 7, 8, 7, 
      5, 4, 3, 2, 2, 3, 2, 3, 5, 8, 9] 

zdecydujemy dx = 5. Budujemy g (x), biorąc średnią arytmetyczną punktów wokół X:

g(x) = [2.3, 2.5, 2.4, 2.8, 3.6, 4.2, 5.2, 6.2, 6.6, 6.2, 
     5.4, 4.2, 3.2, 2.8, 2.4, 2.4, 3.0, 4.2, 5.4, 6.3, 7.3] 

h(x) = [1.2, 1.1, 1.0, 0.7, 1.4, 2.4, 2.3, 1.7, 1.0, 1.5, 
     1.9, 1.7, 1.2, 0.7, 0.5, 0.6, 1.1, 2.1, 2.7, 2.4, 1.7] 

Przy m = 1 my dostaniesz:

c(x) = [0.1, xxx, 0.6, xxx, 0.2, xxx, xxx, xxx, 0.4, xxx, 
     xxx, xxx, xxx, 0.1, xxx, 0.0, xxx, xxx, xxx, xxx, 0.0] 

Wygląda na to, że działa całkiem dobrze. Zapraszam do dzielenia się myślami. Zauważ, że może to być mniej więcej równowartość różniczkowania, biorąc pod uwagę twierdzenie o wartości średniej.

+0

Czy możesz rozwinąć, jak dokładnie idziesz od f (x) do g (x)? f (x) i g (x) mają taką samą liczbę punktów danych, więc nie widzę, w jaki sposób może to być prosta średnia krocząca? – Ivan

+0

Ah, widzę, to jest poruszający środek. – Ivan

1

To działa Patrick87, dzięki. Oto funkcja Java, aby wdrożyć taki sam:

Załóżmy StockPrices ma map kluczowe daty i wartości StockPrice (cena, średnia gdzie x = 5)

prywatne podwójne getCx (StockPrices stockPrices, LOCALDATE executionDate, int x, podwójne m) { return Math.abs (getFx (stockPrices, executionDate) - getGx (stockPrices, executionDate)) - m * getHx (stockPrices, executionDate, x); }

private double getGx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getAvg(executionDate, 5); 
} 

private double getFx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getPrice(executionDate); 
} 

public double getHx(StockPrices stockPrice, LocalDate localDate, int x) { 
    //standard deviation 
    return Math.sqrt(getVariance(stockPrice, localDate, x)); 
} 

private double getVariance(StockPrices stockPrice, LocalDate localDate, int x) { 
    double sum = 0; 
    int count = 0; 
    for (int i = - (x/2); i <= (x/2) ; i++) { 
     LocalDate date = localDate.with(BusinessDay.add(localDate, i, stockPrice.getPriceMap(), 2)); 
     double avg = stockPrice.getAvg(date, 5); 
     double price = stockPrice.getPrice(date); 
     if (price != 0.0) { 
      sum += Math.pow((price - avg), 2); 
      count++; 
     } 
    } 
    return sum/count; 
} 
+0

Czy możesz podać pełne źródło? Brak niektórych implementacji. – endeffects