English Русский 中文 Español Deutsch 日本語 Português 한국어 Français Türkçe
Introduzione al metodo di decomposizione empirica

Introduzione al metodo di decomposizione empirica

MetaTrader 5Statistiche e analisi | 11 gennaio 2022, 15:31
263 0
Victor
Victor

Introduzione

Tutti i processi reali che dobbiamo affrontare in pratica sono complessi e, di regola, costituiti da un gran numero di componenti. Ad esempio, il tempo. Quando analizziamo i grafici delle precipitazioni, dobbiamo tenere presente che rappresentano l'interazione tra molti vari processi come i cambiamenti stagionali, i processi di riscaldamento / raffreddamento globale, i cambiamenti della corrente oceanica, la dinamica dei cicloni e degli anticicloni, la quantità di anidride carbonica emessa nell'atmosfera, i cicli di attività solare, ecc. L'elenco potrebbe continuare all'infinito.

Un grafico di questo tipo è quindi abbastanza difficile da analizzare in quanto i suoi componenti, quando interagiscono tra loro, mascherano e distorcono le regolarità che vorremmo identificare. Ciò dà origine a un legittimo desiderio di suddividere il processo in esame in singoli componenti e analizzare ciascuno dei componenti separatamente. L'analisi dei singoli componenti e la considerazione del contributo che apportano al processo in questione ci aiuta a comprendere meglio il processo in corso, nonché, ad esempio, ad aumentare l'affidabilità delle previsioni.

E non c'è eccezione quando si tratta di varie informazioni sul trading, comprese le quotazioni valutarie che si formano anche in base a un gran numero di fattori diversi. Questo è il motivo per cui è abbastanza naturale aspettarsi che una rottura anticipata in singoli componenti possa facilitare notevolmente la loro ulteriore analisi.

Il termine "decomposizione" indica formalmente la scomposizione di un processo composto o di un materiale composito in componenti costitutivi separati. Ma in molte aree relative all'analisi di diversi processi, all'analisi dei segnali, all'analisi di vari tipi di sequenze, ecc., questo termine è stato a lungo usato in un significato più ampio, molto spesso suggerendo non una scomposizione in componenti iniziali reali, ma piuttosto una ripartizione in determinate funzioni che non erano effettivamente presenti quando i dati iniziali si stavano formando. Queste funzioni sono in qualche modo formate artificialmente nel processo di decomposizione dei dati ma, nonostante la loro origine "artificiale", consentono un'analisi più approfondita dei dati aiutando a identificare modelli nascosti.

La stragrande maggioranza dei metodi utilizzati nell'analisi di mercato può essere attribuita esplicitamente o implicitamente a metodi che individuano determinati componenti dal processo analizzato, ovvero metodi di decomposizione. Esaminiamo brevemente alcuni di essi.


1. Decomposizione

Esistono molti metodi di decomposizione che possono essere applicati in pratica a una determinata sequenza in esame. Questi metodi possono avere diversi approcci matematici o empirici sottostanti, diversi gradi di complessità e diverse aree di applicazione.

Ad esempio, anche un'analisi di mercato fondamentale può, a un certo punto, essere considerata uno dei metodi di decomposizione. Questa analisi si occupa dell'effetto prodotto da una serie di eventi iniziali che influenzano direttamente le condizioni di mercato. In altre parole, un processo di mercato analizzato viene implicitamente scomposto in una serie di eventi che lo compongono.

Le questioni relative all'analisi fondamentale non saranno toccate in seguito. Assumeremo che qualsiasi ulteriore informazione sul processo in esame non sia disponibile; ciò che abbiamo è solo una sequenza che rappresenta il comportamento di un dato processo

L'esempio di decomposizione più semplice può essere illustrato da una decomposizione di una sequenza in più componenti utilizzando i soliti metodi ben noti. Ad esempio, tracciamo un MA su un grafico per qualsiasi coppia di valute. Quindi, sottraiamo la curva risultante dalla sequenza iniziale. Di conseguenza, otterremo due componenti della sequenza iniziale, la curva MA e il residuo. La stessa procedura, utilizzando solo un MA di periodo più lungo, quando applicato al residuo ottenuto, si tradurrà in tre componenti: due curve MA e il residuo della trasformata. Come puoi vedere, il processo di decomposizione può essere facilmente organizzato utilizzando qualsiasi mezzo disponibile. L'intero punto sta nelle proprietà dei risultati di un tale processo.

Tra i ben noti metodi di decomposizione e analisi spettrale, la trasformata di Fourier è sicuramente degna di nota qui. La trasformata di Fourier appartiene alla classe delle trasformazioni ortogonali che utilizza funzioni di base armoniche fisse. Il risultato della trasformata di Fourier può essere mostrato come una decomposizione del processo iniziale in funzioni armoniche con frequenze e ampiezze fisse. Nota due punti di particolare importanza per noi.

In primo luogo, la trasformazione viene sempre eseguita in una base fissa e precedentemente impostata di funzioni ortogonali. Cioè, una base di trasformazione non dipende dalla natura di una sequenza trasformata.

In secondo luogo, i valori di ampiezza e frequenza delle componenti armoniche risultanti sono costanti. Ovvero, i loro valori sono costanti su tutta la sequenza iniziale. Ciò significa che se la natura di una determinata sequenza iniziale cambiava in un intervallo in esame, tali modifiche non si rifletteranno nei risultati della trasformazione. I risultati ottenuti in questo caso rifletteranno solo un certo stato medio del processo in quanto questa trasformazione si basa sull'assunzione di stazionarietà dei dati iniziali.

Per evitare vincoli associati alla non stazionarietà della sequenza iniziale, possiamo passare dalla trasformata di Fourier a una trasformata wavelet. Una trasformata wavelet, come la trasformata di Fourier, esegue la decomposizione in una base fissa di funzioni. A differenza della trasformata di Fourier, questa base deve essere preimpostata, cioè deve essere selezionata una wavelet utilizzata in trasformazione.

Inoltre, a differenza della trasformata di Fourier, ogni componente risultante da una trasformata wavelet ha parametri che ne determinano la scala e il livello nel tempo, il che risolve il problema associato a una possibile non stazionarietà di un processo analizzato.

La trasformata di Fourier e la trasformata wavelet hanno entrambe ricevuto un ampio riconoscimento grazie alle tecniche matematiche ben consolidate utilizzate e agli efficaci algoritmi di implementazione disponibili. Inoltre, entrambe le trasformazioni sembrano essere abbastanza versatili e possono essere applicate con successo in diverse aree.

Ma per scopi pratici, sarebbe bene avere una trasformazione che non solo consenta di gestire processi non stazionari, ma utilizzi anche una base di trasformazione adattiva determinata dai dati iniziali. Questo tipo di trasformazione esiste e sarà brevemente considerato di seguito, affrontando così l'argomento principale di questo articolo.


2. Decomposizione empirica della modalità

La decomposizione empirica della modalità (EMD) è stata proposta come parte fondamentale della trasformata di Hilbert-Huang (HHT). La trasformata di Hilbert Huang viene effettuata, per così dire, in 2 fasi. In primo luogo, utilizzando l'algoritmo EMD, otteniamo funzioni di modalità intrinseca (FMI).

Quindi, al secondo stadio, lo spettro di frequenza istantaneo della sequenza iniziale si ottiene applicando la trasformata di Hilbert ai risultati del passaggio precedente. L'HHT permette di ottenere lo spettro di frequenza istantaneo di sequenze non lineari e non stazionarie. Queste sequenze possono quindi essere trattate anche usando la decomposizione empirica.

Tuttavia, questo articolo non tratterà il grafico dello spettro di frequenze istantanee usando la trasformata di Hilbert. Ci concentreremo solo sull'algoritmo EMD.

In contrasto con la trasformata di Fourier e la trasformata wavelet precedentemente menzionate, l'EMD scompone qualsiasi dato dato in funzioni di modo intrinseco (FMI) che non sono impostate analiticamente e sono invece determinate da una sequenza analizzata da sola. Le funzioni di base sono in questo caso derivate in modo adattivo direttamente dai dati di input. Un FMI risultante dalla EMD deve soddisfare solo i seguenti requisiti:

  1. Il numero di extrema dell’FMI (la somma dei massimi e dei minimi) e il numero di incroci zero devono essere uguali o differire al massimo di uno;
  2. In qualsiasi punto di un FMI, il valore medio dell'involucro definito dai massimi locali e l'involucro definito dai minimi locali è pari a zero.

La decomposizione si traduce in una famiglia di componenti FMI ordinati con frequenza. Ogni FMI successivo contiene oscillazioni di frequenza inferiori rispetto al precedente. E sebbene il termine "frequenza" non sia del tutto corretto se usato in relazione ai campi di ricerca delle comunità di ricerca, è probabilmente più adatto a definirne la natura. Il fatto è che anche se un FMI è di natura oscillatoria, può avere ampiezza e frequenza variabili lungo l'asse del tempo.

È abbastanza difficile visualizzare i risultati delle prestazioni dell'algoritmo EMD in base alla sola descrizione, quindi procediamo alla sua implementazione software che ci darà l'opportunità di conoscere le peculiarità dell'algoritmo.


3. Algoritmo EMD

L'algoritmo proposto da Huang si basa sulla produzione di inviluppi lisci definiti da massimi e minimi locali di una sequenza e successiva sottrazione della media di questi inviluppi dalla sequenza iniziale. Ciò richiede l'identificazione di tutti gli estremi locali che sono ulteriormente collegati da linee di spline cubiche per produrre gli inviluppi superiore e inferiore.

La procedura di stampa delle buste è illustrata nella Figura 1.


Fig.1. Traccia delle buste e la loro media.

Fig.1. Traccia delle buste e la loro media.


La Figura 1 fornisce la sequenza analizzata nella sottile linea blu. I massimi e i minimi della sequenza sono mostrati rispettivamente in rosso e blu. Le buste sono fornite in verde.

La media viene calcolata in base alle due buste ed è mostrata nella Figura 1 come linea tratteggiata. Il valore medio così calcolato viene ulteriormente sottratto dalla sequenza iniziale.

I passaggi precedenti comportano l'estrazione della funzione empirica richiesta nella prima approssimazione. Per ottenere l'FMI definitivo, devono essere nuovamente identificati nuovi massimi e minimi e devono essere ripetuti tutti i passaggi precedenti. Questo processo ripetuto è chiamato setacciatura. Il processo di setacciatura viene ripetuto fino a quando non viene soddisfatto un determinato criterio di arresto. La selezione dei criteri di arresto della vagliatura è uno dei punti chiave che influenzano il risultato della decomposizione nel suo complesso. Torneremo dopo sulla discussione di questo problema.

Se il processo di setacciatura è completato con successo, otterremo il primo FMI. Il prossimo FMI può essere ottenuto sottraendo l’FMI precedentemente estratto dal segnale originale e ripetendo ancora una volta la procedura sopra descritta. Questo continua fino a quando tutti i campi di garanzia vengono estratti. Il processo di setacciatura di solito si interrompe quando il residuo, ad esempio, contiene non più di due extrema.

Come si può vedere, la procedura di decomposizione empirica descritta non si basa su rigorosi calcoli matematici, ma è piuttosto veramente empirica, giustificando così pienamente il suo nome. Nonostante la semplicità e la chiarezza dell'algoritmo di cui sopra come proposto da Huang, ci sono alcuni punti che possono essere considerati i suoi lati negativi.

Varie pubblicazioni su questo argomento forniscono recensioni dettagliate dei suoi punti deboli, nonché modi per modernizzare l'algoritmo di Huang. Questo articolo non si concentrerà su possibili modernizzazioni di questo metodo, ma dimostrerà semplicemente un tentativo di creare la sua implementazione software. Le peculiarità di implementazione saranno brevemente delineate di seguito.


4. Classe CEMDecomp

La classe CEMDecomp che implementa l'algoritmo EMD è stata creata sulla base delle pubblicazioni Internet dedicate alla trasformata di Hilbert-Huang e alla decomposizione del modo empirico. L'algoritmo implementato è sostanzialmente molto simile all'algoritmo inizialmente proposto da Huang e non contiene modifiche importanti.

Di seguito è riportato uno snippet del codice sorgente, il quale può essere trovato nel file CEMDecomp.mqh alla fine dell'articolo.

//------------------------------------------------------------------------------------
// The Empirical Mode Decomposition (EMD).
//------------------------------------------------------------------------------------
class CEMDecomp:public CObject
  {
public:
  int     N;                 // Input and output data size
  double  Mean;              // Mean of input data
  int     nIMF;              // IMF counter
  int     MaxIMF;            // Maximum number of IMF
  int     MaxIter;           // Maximum number of iterations
  int     FixedIter;         // 0-variable number of sifting iterations;
                             // 1-always ten sifting iterations.
  double  IMFResult[];       // Result
private:
  double  X[];
  double  Imf[];
  double  XMax[];            // x of local maxima
  double  YMax[];            // y of local maxima
  double  XMin[];            // x of local minima
  double  YMin[];            // y of local minima
  double  EnvUpp[];          // Upper envelope
  double  EnvLow[];          // Lower envelope
  double  Eps;               // Accuracy comparison of floating-point numbers
  double  Tol;               // Accuracy of calculation IMF
public:  
  void    CEMDecomp(void);
  int     Decomp(double &y[]);          // Decomposition
  void    GetIMF(double &x[], int nn);  // Get IMF number nn
private:
  int     arrayprepare(void);
  void    extrema(double &y[],int &nmax,double &xmax[],double &ymax[], int &nmin,double &xmin[],double &ymin[]);
  int     SplineInterp(double &x[],double &y[],int n,double &x2[], double &y2[],int btype=0);
  };

Diamo un'occhiata alle variabili e ai metodi pubblici dichiarati nella classe CEMDecomp.

Nè il numero di elementi nella sequenza. Il valore della variabile N viene generato dopo aver chiamato il metodo Decomp() ed è uguale alla lunghezza della sequenza di input. Gli estratti FMI avranno le stesse dimensioni.

Media è il valore medio della sequenza di input. Il valore viene generato dopo aver chiamato il metodo Decomp().

nFMI è il contatore dell’FMI. Dopo aver chiamato Decomp(), contiene il numero di FMI estratti più due. Pertanto, questo valore indica quanti componenti possono essere letti utilizzando il metodo GetFMI(). Detto questo, un componente con indice 0 conterrà sempre la sequenza iniziale da cui viene sottratto il suo valore medio, mentre un componente con indice nFMI conterrà il residuo di decomposizione.

MaxFMI è il numero massimo consentito di FMI. La scomposizione della sequenza di input in FMI separati si interromperà quando il numero di FMI raggiungerà il valore MaxFMI. Il valore di questa variabile può essere impostato prima di chiamare il metodo Decomp(). Il valore predefinito è 16.

MaxIter è il numero massimo di iterazioni consentite nel processo di setacciatura. Se il numero di iterazioni nel processo di setacciatura raggiunge questo valore, la vagliatura si interromperà indipendentemente dal fatto che sia stata raggiunta o meno la precisione richiesta. Il valore di questa variabile può essere impostato prima di chiamare il metodo Decomp(). Il valore predefinito è 2000.

FixedIter è il flag che imposta un criterio di arresto nella vagliatura. Se il valore FixedIter è zero, il processo di setacciatura per ogni FMI si interromperà una volta raggiunta l'accuratezza data. Il numero di iterazioni necessarie per ottenere l'accuratezza data per l'estrazione di diversi FMI può variare. Se FixedIter è impostato su uno, un FMI verrà sempre estratto in 10 iterazioni. Il valore di questa variabile può essere impostato prima di chiamare il metodo Decomp(). Il valore predefinito è 0.

Decomp(double &y[]) è il metodo di classe principale che esegue la decomposizione. Riceve un riferimento a un array contenente dati di input come parametro di input. Al completamento, la variabile N sarà uguale alla lunghezza dell'array di input. Gli estratti FMI avranno le stesse dimensioni. La variabile Media sarà uguale al valore medio della sequenza di input, mentre la variabile nFMI sarà uguale al numero di componenti che possono essere letti utilizzando il metodo GetFMI().

GetFMI(double &x[], int nn) serve a garantire l'accesso ai risultati ottenuti utilizzando il metodo Decomp(). L'indirizzo dell’array in cui verrà copiato il componente con il numero impostato da nn viene passato come parametro di input. Detto questo, un componente con indice 0 conterrà sempre la sequenza iniziale da cui viene sottratto il suo valore medio, mentre un componente con indice nFMI conterrà il residuo di decomposizione. Se la lunghezza dell’array passata come parametro risulta essere inferiore alla lunghezza dei componenti risultanti, l’array verrà riempita per quanto la sua lunghezza lo consente.

L'utilizzo della classe CEMDecomp può essere dimostrato dall'esempio seguente:

#include "CEMDecomp.mqh"
//------------------------------------------------------------------------------------
// Script program start function
//------------------------------------------------------------------------------------
void OnStart()
  {
  int n,ret;
  double yy[],imf2[];
  
  n=400;                                    // Input sequence length
  ArrayResize(yy,n);                         // Array of input data
  ArrayResize(imf2,n);                       // Array for reading the results
  
  CopyOpen(_Symbol,PERIOD_CURRENT,0,n,yy);      // Generation of input data
  
  CEMDecomp *emd=new CEMDecomp();           // Creation of the CEMDecomp class instance
  ret=emd.Decomp(yy);                       // Decomposition of the input sequence
  
  if((ret==0)&&(emd.nIMF>3))                // If there is no error and the sufficient
                                            // number of components was extracted,
    emd.GetIMF(imf2,2);                     // copy component number 2 into
                                            // array imf2[].
  delete(emd);                              // Deletion of the CEMDecomp class instance
  
  // One of the extracted components in array imf2[].
  }
//------------------------------------------------------------------------------------

Un esempio completo di decomposizione che visualizza FMI estratti tramite interfaccia Web può essere trovato nell'archivio CEMDecomposition.zip alla fine dell'articolo. Per eseguire questo esempio è necessario decomprimere l'archivio specificato e posizionare l'intera directory \CEMDecomposition insieme al relativo contenuto nella directory \Indicators o \Scripts del terminale. Successivamente, è possibile compilare ed eseguire lo script EMDecomp_Test.mq5. Tieni presente che l'uso di librerie esterne nel terminale deve essere consentito.

La Figura 2 mostra un altro esempio con la decomposizione delle quotazioni giornaliere USDJPY con la lunghezza della sequenza di 100 elementi. Si può vedere che la decomposizione di questa sequenza ha portato all'estrazione di quattro FMI e del residuo.


Fig.2. Scomposizione della sequenza di quotazioni giornaliere USDJPY, dove N= 100.

Fig.2. Scomposizione della sequenza delle quotazioni giornaliere USDJPY, dove N=100


Tutti i grafici della Figura 2 sono visualizzati nella stessa scala che consente di valutare il contributo apportato da ciascuno degli estratti FMI. Tuttavia, questo modo di tracciare non può fornire un quadro sufficientemente chiaro per vedere le peculiarità di ciascuno dei fondi di pagamento. Nella Figura 3 vengono illustrati gli stessi risultati, utilizzando solo la modalità di ridimensionamento automatico per ciascuno dei grafici.


Fig.3. Scomposizione della sequenza di quotazioni giornaliere USDJPY, dove N= 100. Modalità di ridimensionamento automatico.

Fig.3. Scomposizione della sequenza di quotazioni giornaliere USDJPY, dove N= 100. Modalità di ridimensionamento automatico

E sebbene la Figura 3 non mostri l'effettiva correlazione delle ampiezze dei singoli componenti, l'uso della modalità di ridimensionamento automatico consente una visualizzazione più dettagliata di ciascuno di essi.


5. Note alla proposta di implementazione dell'algoritmo EMD

La prima cosa su cui vorrei attirare la vostra attenzione è il metodo per l'identificazione dei massimi e dei minimi della sequenza iniziale. In questo caso, ci sono due opzioni disponibili.

La Figura 4 mostra i risultati delle prestazioni dell'algoritmo per l'identificazione di extrema.

Fig.4. Identificazione dell'extrema. La prima opzione.

Fig.4. Identificazione dell'extrema. La prima opzione

Quando si tratta di identificare i massimi o i minimi di una funzione, l'algoritmo più comunemente usato è il seguente:

  1. Il valore dell'elemento corrente della sequenza viene confrontato con i valori precedenti e successivi;
  2. Se il valore corrente è maggiore del valore precedente e del valore successivo, viene identificato come il valore massimo della funzione;
  3. Se il valore corrente è inferiore al valore precedente e al valore successivo, viene identificato come la funzione minima;

Per le sequenze con extrema chiaramente definito, l'identificazione di massimi e minimi non comporta alcuna difficoltà. L'algoritmo fornito funziona bene. Questo caso è dimostrato nella prima metà del grafico mostrato nella Figura 4. Tuttavia, questo algoritmo non risponderà alle cime piatte in cui i valori più vicini della sequenza sono uguali.

Se fosse stato utilizzato l'algoritmo fornito, l'ultimo massimo e gli ultimi due minimi mostrati nella Figura 4 non sarebbero mai stati identificati. Da un lato, questo risultato sarebbe stato previsto e corretto. Ma dall'altro, disegnando l'analogia con i processi oscillatori, se si fossero verificati incroci zero, questi estremi sarebbero stati trascurati. Non è del tutto chiaro se le cime piatte di una sequenza rettangolare o sezioni di valori di sequenza uguali possano essere considerate extrema.

Tuttavia, l'algoritmo utilizzato per l'identificazione di extrema durante l'implementazione della classe EMDecomp è una versione migliorata dell'algoritmo fornito sopra. I suoi risultati prestazionali possono essere osservati nella Figura 4. Questo algoritmo identifica gli intervalli con valori di sequenza uguali come extrema e posiziona i punti dell'estremo nel mezzo di questi intervalli.

L'algoritmo per l'identificazione di massimi e minimi, i cui risultati prestazionali sono mostrati nella Figura 4, viene utilizzato nella classe CEMDecomp per il calcolo del numero di extrema nel determinare il punto in cui il ciclo di decomposizione deve fermarsi. Ad esempio, se un FMI estratto non ha alcun estremo, la decomposizione si ferma e tale FMI viene cacciato.

Se questo algoritmo di identificazione viene utilizzato quando si tracciano gli inviluppi, nei casi in cui la sequenza di input, ad esempio, assume la forma mostrata in Fig.4, gli inviluppi risultanti saranno rappresentati da due linee parallele rette. Il processo di setacciatura non riuscirà ulteriormente a trasformare la sequenza di input e questa sequenza di input, a sua volta, non sarà adatta per la decomposizione in componenti.

Una via d'uscita da questa situazione può essere trovata nell'uso di un algoritmo un po' diverso per l'identificazione di extrema per tracciare le buste.

La Figura 5 illustra i risultati ottenuti utilizzando questo algoritmo alternativo per l'identificazione dell'extrema.

Figura 5. Identificazione dell'extrema. La seconda opzione.

Fico.  5. Identificazione dell'extrema. La seconda opzione


Diamo un'occhiata più da vicino alla Figura 5. A differenza della Figura 4, mostra che i punti verdi sono massimi e minimi allo stesso tempo. Se gli inviluppi sono tracciati in base a questi estremi, non saranno più linee parallele rette e i componenti nascosti della sequenza rettangolare saranno disponibili per un'ulteriore estrazione nel processo di setacciatura. Una buona illustrazione di quanto sopra può essere un caso di test situato nell'archivio CEMDecomposition.zip alla fine dell'articolo.

Sfortunatamente, questo approccio non risolve tutti i problemi relativi all'estrazione di componenti nascosti. Ad esempio, i componenti nascosti non possono essere estratti in questo modo per una sequenza triangolare. Questo fatto può essere uno degli aspetti negativi di questa implementazione dell'algoritmo EMD. Questa difficile situazione può probabilmente essere affrontata passando all'algoritmo CEEMD (The Complementary Ensemble Empirical Mode Decomposition Method) per la decomposizione la cui revisione non è trattata in questo articolo.

Oltre alle peculiarità associate all'implementazione di algoritmi per l'identificazione degli estremi, l'attenzione deve essere data anche al problema degli effetti finali tipici di questo tipo di algoritmi. Per approfondire quanto sopra, passiamo alla Fig.1. La Figura 1 mostra chiaramente che i massimi sono collegati da una funzione di spline interpolante cubica come inviluppo superiore.

Detto questo, l'inviluppo deve essere definito per le sezioni situate sia a sinistra del primo massimo che a destra dell'ultimo massimo. Il modo in cui tale involucro è allungato è suscettibile di determinare la natura dei FPF estratti vicino alle sue estremità. Senza entrare nei dettagli dell'implementazione software della correzione dell'effetto finale, questo fatto viene semplicemente portato qui all'attenzione del lettore.

Va inoltre notato che la natura e il numero di FMI estratti possono dipendere e dipenderanno dal metodo selezionato per interrompere il ciclo di setacciatura. La classe CEMDecomp utilizza il calcolo del rapporto, il quale indica l'entità della differenza nell'attuale FMI come determinato dall'ultimo ciclo di setacciatura, come metodo principale che serve a fermare il processo di setacciatura.

Se la vagliatura non ha quasi alcun effetto su un FMI sconosciuto, il processo di setacciatura si interrompe e l’FMI è considerato prodotto. Un valore limite per impostazione predefinita che determina l'accuratezza dell'estrazione FMI è impostato nel costruttore della classe. Dopo aver impostato il valore limite predefinito, il numero di iterazioni di setacciatura può talvolta raggiungere 200 e persino 300. Nelle pubblicazioni su questo argomento, molti autori mettono in guardia contro l'uso di un numero così elevato di iterazioni di setacciatura. È stato tuttavia deciso di utilizzare questo valore limite predefinito in questa implementazione dell'algoritmo EMD.

Questa implementazione dell'algoritmo EMD consente di utilizzare un altro criterio di arresto. A tale scopo, la variabile FixedIter deve essere impostata su 1 prima di chiamare il metodo Decomp(). In questo caso, tutti gli FMI verranno sempre estratti in 10 iterazioni di setacciatura. Ed è facile vedere che i risultati di decomposizione ottenuti utilizzando questo criterio di arresto saranno in qualche modo diversi rispetto a quelli del metodo predefinito.


6. Applicazione dell'algoritmo EMD

Poiché l'algoritmo EMD era inizialmente una parte della trasformata di Hilbert-Huang, il calcolo dello spettro di frequenza istantaneo di una sequenza può servire come esempio dimostrando l'applicazione di questo algoritmo. Ciò comporta l'esecuzione della trasformata di Hilbert su componenti FMI estratti utilizzando l'EMD. Questa procedura non è tuttavia considerata in questo articolo.

Oltre a calcolare lo spettro, l'algoritmo EMD può essere utilizzato per lo smoothing delle sequenze.

La Figura 6 mostra un esempio di tale smoothing.


Fig.6. Smoothing della sequenza di input.

Fig.6. Smoothing della sequenza di input


Un frammento arbitrario di quotazioni giornaliere USDCHF composte da 100 valori di prezzo "Aperti" è stato selezionato per lo smoothing. Nel processo di decomposizione sono stati ottenuti quattro FMI e il residuo. Tutti i fondi di sicurezza, ad eccezione del primo, sono stati ulteriormente aggiunti al residuo.

Pertanto, la componente a frequenza più alta trovata è stata esclusa dalla sequenza di input. Se ignorassimo i primi due componenti quando li sommiamo, la curva risultante sarebbe ancora più liscia.

Un altro esempio dell'applicazione EMD può essere la generazione di una previsione basata su FMI estratti dalla sequenza di input. Per generare una previsione, è possibile utilizzare qualsiasi estrapolatore in cui viene generata una previsione per ciascuno dei campi di pagamento istantanei e il residuo separatamente.

Le previsioni generate in questo modo vengono quindi sommate per produrre il risultato di previsione richiesto per la sequenza di input. Considerando la natura oscillatoria dei singoli FMI, possiamo supporre che per generare una previsione sarebbe ragionevole utilizzare gli estrapolatori, ma tenendo conto del comportamento periodico delle sequenze di previsione.

Nel nostro caso, esamineremo un esempio di funzionamento di un estrapolatore più semplice in cui verrà generata una previsione per ciascuno dei fondi istantanei utilizzando l'estrapolazione lineare a 10 fasi avanti. Il risultato di questa previsione è mostrato nella Figura 7.


Fig.7. Generazione di una previsione per usdCHF, quotazioni H4.

Fig.7. Generazione di una previsione per usdCHF, quotazioni H4


Va notato che, quando si genera una previsione, uno o più componenti a frequenza più alta possono essere scartati. Pertanto, l'effetto del rumore ad alta frequenza sulla previsione può essere mitigato. Il risultato della previsione che esclude il primo FMI è dimostrato nella Figura 7. La prevedibilità di questo metodo non è stata in questo caso valutata. Un'analisi dettagliata dei metodi di previsione basati sulla decomposizione empirica della modalità non è fornita qui, in quanto questo argomento esula dallo scopo di questo articolo.

Non possiamo non menzionare anche il detrending. Dopo che i singoli componenti della sequenza sono stati ottenuti utilizzando l'EMD, è possibile sviluppare un algoritmo abbastanza flessibile per il detrending. Il residuo di decomposizione o il residuo aggiunto a uno o più degli ultimi FMF estratti può essere considerato come una tendenza. Il numero di FMI coinvolti nella creazione di una linea di tendenza insieme al residuo può variare a seconda del numero di componenti a bassa frequenza necessari per rimanere nella sequenza dopo il detrending.

Pertanto, per procedere con il detrending, è sufficiente sommare tutti gli FMI estratti a seguito della decomposizione, ad eccezione dell'ultimo componente o di più ultimi componenti. Questa procedura può essere facilmente combinata con lo smoothing del risultato ottenuto, anche se la componente a frequenza più alta è esclusa dal processo di somma dei componenti. La Figura 8 mostra un esempio di detrending utilizzando la tecnica di cui sopra.


Fig.8. Detrending combinato con smoothing.

Fig.8. Detrending combinato con smoothing


Una sequenza di EURUSD, quotazioni giornaliere, è stata presa come dato iniziali. Dopo la decomposizione, sono stati sommati tutti i componenti estratti, escluso il residuo di decomposizione, l'ultimo e il primo FMI. Ciò ha portato non solo al detrending, ma anche a un certo smoothing della curva risultante.

L'ambito di applicazione del metodo di decomposizione empirica non si limita certo ai semplici esempi riportati nell'articolo. Ma poiché questo articolo si concentra maggiormente sulle questioni di implementazione del metodo EMD in quanto tale piuttosto che sulla sua applicazione, consideriamo gli esempi forniti di seguito.

La Figura 9, la quale illustra il risultato della decomposizione ottenuto utilizzando i parametri impostati in CEMDecomp.mqh per impostazione predefinita, può servire come ulteriore illustrazione delle funzionalità offerte da questa implementazione del metodo EMD. Questo esempio si basa sull'uso di virgolette XAUUSD H4. La lunghezza della sequenza è di 150 elementi.


Fig.9. Esempio di scomposizione utilizzando le virgolette XAUUSD H4.

Fig.9. Esempio di scomposizione con virgolette XAUUSD H4

Il ridimensionamento automatico è stato applicato a ciascuno dei componenti nella Figura 9.


Conclusione

Ricorda che il metodo di decomposizione empirica, così come la trasformata di Hilbert-Huang, è destinato all'analisi dei dati provenienti da processi non stazionari e non lineari. Ciò non significa che questo approccio non possa essere applicato a sequenze lineari e stazionarie.

Alcuni approcci utilizzati negli algoritmi di decomposizione sono stati brevemente toccati all'inizio dell'articolo. Ed è stato detto che la maggior parte di questi algoritmi scompone una sequenza in componenti che in realtà non rappresentano i processi iniziali che compongono effettivamente la sequenza in esame.

Questi componenti sono in qualche modo sintetici; la loro estrazione aiuta semplicemente a comprendere meglio la struttura di una sequenza di input e in molti casi permette di facilitarne l'analisi. Il metodo EMD non fa eccezione. Non si deve mai pensare che i componenti ottenuti utilizzando questo metodo riflettano i processi fisici effettivi da cui sono stati originariamente formati i dati analizzati iniziali.

L'implementazione proposta in questo articolo potrebbe probabilmente richiedere ulteriori test e miglioramenti in quanto difficilmente può essere considerata ideale.

L'obiettivo principale di questo articolo è stato comunque quello di far familiarizzare il lettore con il metodo EMD e alcune peculiarità legate alla sua implementazione.

Riassumendo.

  1. L'articolo tocca molto brevemente alcune questioni generali relative alla decomposizione;
  2. In poche parole, espone l'essenza del metodo di decomposizione empirica;
  3. Vengono introdotti l'elenco e una breve descrizione dell'interfaccia della classe CEMDecomp in cui viene implementato il metodo EMD;
  4. Viene fornito anche l'esempio di interazione con la classe CEMDecomp, la quale dimostra come vengono chiamati i suoi metodi;
  5. Vengono delineate alcune peculiarità della proposta di implementazione del metodo EMD;
  6. Vengono forniti alcuni semplici esempi che dimostrano l'applicazione del metodo EMD nell'analisi dei dati;
  7. Alla fine dell'articolo, puoi trovare il file CEMDecomp.mqh che implementa il metodo EMD così come l'archivio EMDecomposition.zip contenente il test case completo con l'uso della classe CEMDecomp.


Fonti

  1. Hilbert-Huang transform.
  2. Hilbert-Huang transform.
  3. Empirical Mode Decomposition.


Allegati

L'articolo originale è stato pubblicato il 28 giugno 2012. Questo allegato è stato offerto il 5 luglio 2012.

Un'implementazione alternativa del metodo EMD è offerta come aggiunta all'articolo. Tale implementazione viene visualizzata come classe CEMD e inserita nel file CEMD_2.mqh allegato di seguito.

Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/439

File allegati |
cemdecomp.mqh (33.83 KB)
emdecomposition.zip (89.17 KB)
cemd_2.mqh (33.03 KB)
MetaQuotes ID nel terminale mobile MetaTrader MetaQuotes ID nel terminale mobile MetaTrader
I dispositivi Android e iOS ci offrono molte funzionalità che non conosciamo nemmeno. Una di queste funzionalità sono le notifiche push che ci consentono di ricevere messaggi personali, indipendentemente dal nostro numero di telefono o dall'operatore di rete mobile. Il terminale mobile MetaTrader può già ricevere tali messaggi direttamente dal tuo robot di trading. Devi conoscere solo l'ID MetaQuotes del tuo dispositivo. L'hanno già ricevuto più di 9.000.000 di terminali mobile.
Applicazione del metodo delle auto-coordinate all'analisi strutturale di distribuzioni statistiche non estensive Applicazione del metodo delle auto-coordinate all'analisi strutturale di distribuzioni statistiche non estensive
Il problema principale della statistica applicata è il problema dell'accettazione di ipotesi statistiche. È stato a lungo considerato impossibile da risolvere. La situazione è cambiata con l'emergere del metodo delle auto-coordinate. È uno strumento buono e potente per uno studio strutturale di un segnale che consente di vedere più di quanto è possibile utilizzando i metodi della moderna statistica applicata. L'articolo si concentra sull'uso pratico di questo metodo e illustra i programmi in MQL5. Tratta anche il problema dell'identificazione delle funzioni utilizzando come esempio la distribuzione introdotta da Hilhorst e Schehr.
Esplorazione delle classi di strategia di trading della libreria standard. Personalizzazione delle strategie Esplorazione delle classi di strategia di trading della libreria standard. Personalizzazione delle strategie
In questo articolo mostreremo come esplorare la libreria standard delle classi di strategia di trading e come aggiungere strategie personalizzate e filtri/segnali utilizzando la logica Pattern-and-Models del Wizard MQL5. Alla fine sarai in grado di aggiungere facilmente le tue strategie utilizzando gli indicatori standard di MetaTrader 5 e il Wizard MQL5 creerà un codice pulito e potente e un Expert Advisor completamente funzionale.
Ottieni 200 USD per il tuo articolo per il trading algoritmico! Ottieni 200 USD per il tuo articolo per il trading algoritmico!
Scrivi un articolo e contribuisci allo sviluppo del trading algoritmico. Condividi la tua esperienza nel trading e nella programmazione e ti pagheremo $200. Inoltre, la pubblicazione di un articolo sul popolare sito web MQL5.com offre un'eccellente opportunità per promuovere il proprio marchio personale in una comunità professionale. Migliaia di trader leggeranno il tuo lavoro. Puoi discutere le tue idee con persone che la pensano allo stesso modo, acquisire nuova esperienza e monetizzare le tue conoscenze.