2012-01-11 8 views
6

Questa domanda è una continuazione di this one.come identificare i punti di svolta nei dati di prezzo delle azioni

Il mio obiettivo è trovare i punti di svolta nei dati di prezzo delle azioni.

Finora ho:

provato differenziare il prezzo stabilito lisciato, con l'aiuto di Dr. Andrew Burnett-Thompson utilizzando il metodo a cinque punti centrato, come spiegato here.

Uso l'EMA20 dei dati di spunta per livellare il set di dati.

Per ogni punto della tabella ottengo la prima derivata (dy/dx). Creo un secondo grafico per i punti di svolta. Ogni volta che dy/dx è tra [-some_small_value] e [+ some_small_value] - aggiungo un punto a questo grafico.

I problemi sono: Non ho i veri punti di svolta, ho qualcosa da vicino. Ottengo troppi o troppo piccoli punti - depenando su [some_small_value]

Ho provato un secondo metodo per aggiungere un punto quando dy/dx passa da negativo a positivo, che crea anche troppi punti, forse perché uso EMA di tick data (e non di 1 minuto prezzo di chiusura)

Un terzo metodo consiste nel dividere il set di dati in sezioni di n punti e trovare i punti minimo e massimo. Funziona bene (non ideale), ma è in ritardo.

Qualcuno ha un metodo migliore?

Ho attaccato 2 immagini dell'uscita (1 ° derivato e n punti min/max)

enter image description here enter image description here

+1

Perché questo taggato "algoritmo grafico"? – harold

+0

@harold La mia ipotesi è che vuole un algoritmo e che i dati di input possono essere rappresentati graficamente (vedi sopra). ; D Su una nota più seria, questo non è chiaramente un algoritmo grafico. Tag rimosso – Patrick87

+0

, ora hai un'idea di come risolvere questo? : D grazie – Yaron

risposta

4

Si potrebbe prendere la derivata seconda in considerazione, il che significa che dovrebbe ulteriormente (al derivata prima) valutare (y_{i-1} + y_{i+1} - 2y_i)/(dx)². Se questo è superiore a una certa soglia, hai un massimo, se è inferiore hai un minimo e puoi scartarlo. Questo dovrebbe eliminare molti punti che continui a utilizzare il tuo metodo di ricerca degli estremi (y' = 0), perché questa condizione è valida anche per i punti di sella.

1

Ecco solo un'idea, una specie di idea da una diversa angolazione, e probabilmente una pessima idea, ma poiché la differenziazione non funziona, qualcosa del genere potrebbe essere un pensiero.

In primo luogo, è necessario determinare un intervallo X minimo significativo. Nella tua figura, se la prendi troppo piccola, otterrai dei falsi positivi dai dossi. Questo è concettualmente simile all'idea di lisciare i tuoi dati. Chiama questo intervallo dx.

Successivamente, utilizzando una finestra scorrevole di dimensione dx, generare una curva media mobile corrispondente alla curva. Ci sono molti modi in cui puoi pensare di fare questo (rimuovere i valori statistici errati o usare più o meno punti nella finestra). Chiama questa curva g (x) e la tua curva originale f (x). Inoltre, crea una curva h (x) che dia una certa misura della variabilità dei dati nella finestra scorrevole che usi per calcolare g (x) (la deviazione standard dovrebbe funzionare bene se stai usando alcuni punti dell'intervallo).

Ora, iniziare a calcolare le curve del modulo c_m (x) = | f (x) - g (x) | - m * h (x). Puoi iniziare con m = 1.Qualsiasi punto x per il quale c_m (x) è positivo sono candidati per un min/max locale. A seconda di quanti colpi ottieni, puoi iniziare ad aumentare o a diminuire m. Puoi farlo in un modo simile alla ricerca binarys: se vuoi più punti, fai m = (min + m)/2, e se vuoi meno punti, m = (max + m)/2 (aggiustando min e max di conseguenza).

Quindi, ecco un esempio di ciò che sto suggerendo. Diciamo che abbiamo la seguente serie:

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

Noi scegliamo dx = 5. Costruiamo g (x) prendendo una media semplice dei punti intorno 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] 

con m = 1 abbiamo get:

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] 

Questo sembra aver funzionato abbastanza bene, in realtà. Sentiti libero di condividere pensieri. Si noti che questo potrebbe essere più o meno l'equivalente della differenziazione, dato il teorema del valore medio.

+0

Puoi approfondire come stai andando esattamente da f (x) a g (x)? f (x) eg (x) hanno lo stesso numero di punti dati, quindi non vedo come questa potrebbe essere una semplice media mobile? – Ivan

+0

Ah, capisco, è un mezzo mobile. – Ivan

1

Questo funziona Patrick87, grazie. Di seguito sono riportati la funzione del Java per implementare la stessa:

supponga StockPrices ha una mappa di data chiave e il valore StockPrice (prezzo, media dove x = 5)

private doppie getCx (StockPrices stockPrices, LocalDate executionDate, int x, double 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

Potresti fornire l'intera fonte? Ci sono alcune implementazioni mancanti. – endeffects

Problemi correlati