una strategia di trading basata sulla teoria dell'onda di Elliott - pagina 287

 
a olyakish


Buona sera a tutti.
Potresti dire ai figli di questo algoritmo?

Grazie in anticipo


Ve lo dico io.

Applichiamo un filtro mediano multiplo alla curva dei prezzi. Che cos'è? Prendiamo una finestra di dimensioni dispari (>=3) e la facciamo passare attraverso tutti i valori della curva originale. Ad ogni punto corrente, ordina per valore i punti inclusi nella finestra. Al punto corrente viene assegnato un valore medio (nel senso che si trova al centro della matrice) dalla matrice ordinata. Ancora una volta applichiamo lo stesso filtro al risultato ottenuto. Lo ripetiamo molte volte (di solito 20-30 volte sono sufficienti).
Per ottenere i livelli di resistenza invertiamo la curva dei prezzi al contrario e facciamo lo stesso. Poi capovolgiamo il risultato ottenuto al contrario.
Questo è tutto!
...



Una domanda veloce.
Supponiamo di avere una storia di 1000 rapporti (barre)
finestra 3
non calcoliamo i risultati per 1000.999 finestre ed eseguiamo il primo calcolo quando arriviamo al 998° rapporto (abbiamo i dati di 998.999 e 1000 rapporti)
il nostro primo passaggio ci dà 998 risultati
per il secondo passaggio, arriviamo a 996 rapporti usando l'array formato durante l'esecuzione precedente
nella terza corsa, otteniamo 994 ...
e così via ...
Cioè, se abbiamo eseguito 30 volte, abbiamo ottenuto un array di 960 valori

Forse non ho capito bene?
 
a olyakish

<br/ translate="no"> Una domanda veloce
Supponiamo di aver preso uno storico di 1000 rapporti (barre)
finestra 3
si scopre che per 1000,999 non si conta perché è più piccolo della finestra e il primo calcolo lo facciamo solo quando arriviamo a 998 rapporti (abbiamo dati di 998,999 e 1000 rapporti)
otteniamo il primo passaggio con 998 risultati
il secondo passaggio arriviamo a 996 rapporti già formati dalla corsa precedente dell'array
la terza corsa arriviamo a 994 ...
e così via ...
Cioè, se si esegue 30 volte, si ottiene un array di 960 valori

Forse ho capito male?



Non esattamente. Tecnicamente si fa un po' diversamente. Prima di applicare un filtro, si espande la matrice originale di metà della larghezza della finestra del filtro in entrambe le direzioni. Si riempiono gli spazi vuoti nella nuova matrice con una costante, cioè l'ultimo valore dal bordo della matrice originale, o simmetricamente con i valori estremi della matrice originale. In questo caso otterrete di nuovo 1000 punti dopo aver applicato il filtro all'array originale di 1000 punti. La volta successiva che si filtra, tutto si ripete.
Naturalmente, in questo caso possono verificarsi distorsioni ai bordi. Ma questo non può essere evitato perché qualsiasi filtro a finestra (e qualsiasi filtro in generale) ha un ritardo di fase, compreso quello mediano. In generale - la natura funziona così.
Possiamo farlo nel modo che descrivi, ma allora non arriveremo al bordo dell'array originale; oppure possiamo usare un'estensione, ma allora non arriveremo al bordo del risultato.
Questa è la cattiva notizia.
La buona notizia è che il filtro mediano non è così sensibile agli effetti dei bordi come i filtri lineari. I pochi esempi che ho avuto il tempo di guardare mostrano che le distorsioni dei bordi sono piccole o, in alcuni casi, assenti del tutto.

PS. Sì... Un'idea mi è venuta in mente proprio ora. Il filtro potrebbe essere applicato ricorsivamente. Non so cosa farebbe, non l'ho provato, ma conterebbe più velocemente.
 
Andre69, ho implementato l'algoritmo del filtro mediano che hai suggerito. Si scopre che dopo la terza corsa, la forma della curva smussata non cambia. Ho testato questo effetto in una vasta gamma di dimensioni di finestre (fino a 10000 campioni).
Per quanto riguarda le applicazioni nel commercio, è corretto usare "finestra sinistra" quando al punto corrente viene assegnato un valore dal centro della finestra che si trova COMPLETAMENTE a sinistra del valore corrente. Naturalmente, questo introduce un ritardo di fase (lag), ma questo è il modo del mondo:-)
 
a Neutron

Andre69, ho implementato l'algoritmo del filtro mediano che hai suggerito. Si scopre che dopo la terza corsa, la forma della curva smussata non cambia. Ho controllato questo effetto in una vasta gamma di dimensioni di finestre (fino a 10000 campioni). <br/ translate="no"> Per quanto riguarda le applicazioni nel trading, è corretto usare la "finestra di sinistra" quando al punto corrente viene assegnato un valore dal centro della finestra che è COMPLETAMENTE a sinistra del valore corrente. Naturalmente, questo introduce un ritardo di fase (lag), ma questo è il modo del mondo:-)


Sì... Non ha senso. Ha iniziato a controllare. Finalmente ho dato un'occhiata al mio codice, che uso per il filtraggio mediano. L'ho scritto N anni fa (N>5) per un piccolo programma di output grafico. Ora ho iniziato a usare questo programma come poligono per ogni tipo di ricerca. È comodo, e non ho nemmeno guardato le vecchie parti del codice. Funziona tutto e bene... Ora lo sto guardando... e improvvisamente ho scoperto che la funzione che pensavo fosse il filtraggio mediano - non fa esattamente quello! Mi dispiace moltissimo per l'involontaria disinformazione! Chino la mia testa colpevole.
Il perché e il percome l'ho fatto all'epoca - Dio ce ne scampi e liberi - non lo ricordo.
La classica mediana è quando si prende il valore centrale di una matrice ordinata. In questo caso particolare ho preso la media tra il valore centrale e quello precedente. Forse ne avevo bisogno molto tempo fa per qualche motivo. Ho anche ottenuto un filtro non lineare, anche se, naturalmente, non era la mediana in senso stretto. Quando sono tornato alla versione classica, si è rivelato come hai descritto. Nella mia variante la curva cambia ogni volta che il filtro viene applicato e alla fine tende ad essere dritta (dopo diverse centinaia di filtraggi). Più grande è la finestra del filtro, più velocemente avviene.
Per evitare ulteriori ambiguità, fornisco un frammento di codice C.
È semplice, spero che chiunque possa capirlo.
//---------------------------------------------------------------------------
void __fastcall TPlotForm2D_WL::FilterCurveMedian(int Flen)
{
 //количество точек кривой
 int NN=Chart1->Series[IndexUpDown->Position-1]->Count();
 
 //объявляем временные массивы и выделяем память под них
 double* TempArray=new double[NN+(Flen/2)*2];
 double* ResultArray= new double[NN];
 double* XArray=new double[NN];
 double* MedArray=new double[Flen];

 //заполняем массив значений Х точками текущей кривой
 for(int i=0;i<NN;++i)
  XArray[i]=Chart1->Series[IndexUpDown->Position-1]->
                           XValues->Value[i];

 double Start=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[0];
 double End=2*Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[NN-1];

 int k=0;

 //заполняем временный массив значениями Y точками текущей кривой
 for(int i=Flen/2;i>0;--i) //симметричное расширение влево
  TempArray[k++]=Start-Chart1->Series[IndexUpDown->Position-1]->
                                      YValues->Value[i];
 for(int i=0;i<NN;++i)
  TempArray[k++]=Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];
 for(int i=NN-1;i>=NN-Flen/2;--i)//симметричное расширение вправо
  TempArray[k++]=End-Chart1->Series[IndexUpDown->Position-1]->
                                YValues->Value[i];

 //собственно фильтрация
 for(int i=Flen/2;i<NN+Flen/2;++i)
  {
   for(int j=-Flen/2;j<=Flen/2;++j)
    MedArray[j+Flen/2]=TempArray[i+j];
   ::sort(MedArray,MedArray+Flen);
   //Это то, что я написал когда-то. Уже не помню, почему так.
   //Но это работает!!!!!!!!!!
   ResultArray[i-Flen/2]=(MedArray[Flen/2]+MedArray[Flen/2-1])/2;
   //А эта строчка - классический медианный фильтр.
   //И это не работает, так как хотелось бы. ???? Sorry
   //ResultArray[i-Flen/2]=MedArray[Flen/2];
  }


 //дальше вывод и удаление временных массивов
 AddFastLine();

 for(int i=0;i<NN;++i)
  Chart1->Series[Chart1->SeriesCount()-1]->
          AddXY(XArray[i],ResultArray[i],"",clBlue);

 SwitchOnCurve(PlotForm2D_WL->Chart1->SeriesCount()-1);

 delete [] TempArray;
 delete [] ResultArray;
 delete [] XArray;
 delete [] MedArray;

 if(PlotForm2D_WL->Visible)
  PlotForm2D_WL->Visible = false;
 PlotForm2D_WL->Show();

}
//---------------------------------------------------------------------------



Sulla "finestra di sinistra" - tutto vero, sono d'accordo. Ma per ora, penso che siano i dettagli.

Ancora una volta, le mie scuse.

 
a Northwind
...Ma se siete seriamente interessati a ottenere questo documento di ricerca, inviateci una e-mail (info@disserr.ru) e vi consegneremo il lavoro richiesto dall'archivio, se possibile...


Forse c'è qualche notizia su questo lavoro?
 
a Северный Ветер
...Ma se siete seriamente interessati ad ottenere questo documento di ricerca, scriveteci (info@disserr.ru) e vi consegneremo il lavoro richiesto dall'archivio, se possibile...


Ci sono state novità su questo lavoro?

Non ho fatto altri passi dopo la pubblicazione della loro risposta.
Ti ho appena mostrato un modo per cercare di trovare il materiale della tesi.
Vi avverto che il materiale potrebbe essere a pagamento.
 
2 Andre69

Facendo alcune pesanti battaglie di posizione con MatLab.
Per cominciare ho deciso di guardare solo la decomposizione wavelet dei valori delle serie dei prezzi e delle serie degli indicatori. Per DWT non ho trovato sorprese, tutto è più o meno comprensibile.
Anche per la CWT la decomposizione dell'indicatore era abbastanza chiara. Tuttavia, la serie dei prezzi ha prodotto il seguente quadro:


La struttura di questa immagine in generale differisce significativamente, per esempio, dall'immagine nel post di Andre69 del 28.06.07 20:43 a pagina. 141. Vorrei capire perché.
D'altra parte ha una struttura troppo regolare. Perché?
Questa analisi è stata eseguita per una serie di 1024 campioni.
Impostazioni della scala: Min=1, Step=1, Max=512. DMeyer wavelet

PS A proposito, il post di cui sopra era l'ultimo di una serie infinita sulle wavelet. :-)
Mi piacerebbe sapere della continuazione. Dovrebbe?
 
a Yurixx
La struttura di questa immagine in generale è abbastanza diversa, per esempio, dall'immagine nel post Andre69 28.06.07 20:43 a pagina 141. 141. Vorrei capire perché.
D'altra parte ha una struttura troppo regolare. Perché?


Yura, tale struttura regolare è inerente alla natura degli effetti di bordo che inevitabilmente si verificano alle estremità della BP studiata. È impossibile evitare tali effetti. Ma se le condizioni del problema da risolvere lo permettono, si possono lasciare alcuni termini della serie da ogni estremità della VR (il numero di termini è uguale alla larghezza della finestra di campionamento) che parteciperanno ai calcoli, ma non saranno utilizzati nella visualizzazione. Dopo questa procedura l'immagine sarà adeguata e isotropa.
 
<br / translate="no"> Ma se la condizione del problema da risolvere lo permette, potete lasciare alcuni membri della fila ad ogni estremità della BP, che prenderanno parte ai calcoli, ma non saranno utilizzati nella visualizzazione. Dopo questa procedura l'immagine sarà adeguata e isotropa.


Grazie, Sergey, per il chiarimento. Non resta che capire come fare ciò di cui si scrive.
Parsing Wavelet Toolbox non vi ho trovato tali caratteristiche. Forse ho trascurato qualcosa o può essere fatto solo manualmente?
 
Questo effetto può essere minimizzato soddisfacendo la condizione: n/N<<1, dove n è la dimensione della finestra (nel tuo caso, come ho capito, n = Max), N è il numero di membri del BP (1024). Assumendo 0,01<<1, abbiamo Mach<10 per la serie disponibile.
In questo caso i risultati presentati saranno corretti.