L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2065

 
Evgeniy Chumakov:

Supponendo che non ci siano vuoti nella storia e che ci siano 1440 minuti in tutti i giorni (meno il venerdì), il codice dovrebbe essere come questo

Ci sono lacune anche in eurusd. Lavorare con il tempo del bar
 
elibrarius:
I gap si verificano anche su eurusd. Lavora con il tempo del bar


È comprensibile, se fosse così, è quello che farei. Questo è solo per rendere più facile la spiegazione.

 

In qualche modo, sembra funzionare) Per salvare, una nuova riga viene raccolta in rates[i].high

#property script_show_inputs
//+------------------------------------------------------------------+
input datetime tstart = D'2020.5.1 00:00';  // начало промежутка исследуемого времени
input datetime tstop = D'2020.10.1 00:00';   // конец промежутка исследуемого времени
string zztn = "dvol\\" + _Symbol + ".txt"; // text file name
//+------------------------------------------------------------------+
#define  NM 1440
ulong NSM = 60;
ulong NSD = 60 * 1440;
//+------------------------------------------------------------------+
void OnStart()
{
  MqlRates rates[];
  double vol[NM] = {0.0}, d;
  int n[NM] = {0}, t;
  int nprice = CopyRates(Symbol(), PERIOD_M1, tstart, tstop, rates);
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    d = rates[i].close - rates[i].open;
    ++n[t];
    vol[t] += d * d;
  }
  for(int i = 0; i < NM; ++i)
  {
    if(n[i] > 1) vol[i] /= n[i];
    vol[i] = sqrt(vol[i]);
  }
  for(int i = 0; i < nprice; ++i)
  {
    t = (int)((((ulong)rates[i].time) % NSD) / NSM);
    if(vol[t] > 0) rates[i].high = (rates[i].close - rates[i].open) / vol[t];
    if(i > 0) rates[i].high += rates[i - 1].high;
  }
  int ft = FileOpen(zztn, FILE_WRITE | FILE_COMMON | FILE_ANSI | FILE_TXT);
  FileWriteString(ft, "t p");
  for(int i = 0; i < nprice; ++i)
    FileWriteString(ft, "\n" + (string)((ulong)rates[i].time) + " "  + (string)rates[i].high);
  FileClose(ft);
}
 
Aleksey Nikolayev:

In qualche modo, sembra funzionare) Per salvare, la nuova riga è raccolta in rates[i].high

Si normalizzano le barre del passato, ad esempio da 2020.5.1 00:00 alle barre del futuro, c 2020.10.1 00:00 e quelle in mezzo.
Non si può fare nel mercato reale.
Devi fare lo stesso calcolo per ogni barra, ma solo per le barre passate.

 
Aleksey Nikolayev:

In qualche modo, sembra funzionare) Per salvare, la nuova riga viene raccolta in rates[i].high

Anche se lo fai bene, puoi ricostruire molto accuratamente quelle altezze normalizzate delle candele con net/forest.
Come fetches alimentiamo 60 altezze di candele con l'offset del giorno, e insegniamo le altezze normalizzate ottenute nel tuo codice.
La formazione dovrebbe essere accurata quasi al 100%.

Cioè le altezze delle candele normalizzate non contengono alcuna nuova informazione.
L'unico vantaggio è che non c'è bisogno di passare 60 caratteristiche extra per la formazione del modello.
È improbabile che qualcuno presenterà come fiches bar 2 mesi vecchi, cioè nuove informazioni per coloro che non li hanno depositati, c'è ancora).

Naturalmente, dovremmo controllare se le altezze di questi candelieri normalizzati miglioreranno le prestazioni del modello, e naturalmente dovremmo usarlo (o uno dei vostri chip, che è più preferibile, o il 60° di cui è composto).

 
Controlliamo già qualcosa, altrimenti sono state scritte tre pagine, energia sprecata, e l'incremento dell'errore Dio non voglia che sia mezzo per cento.
 
elibrarius:

Questo è strano. Mi chiedo come si possa spiegare?
Ho un'altra versione commentata, ma non mi piaceva per ragioni logiche:

Quale RandomInteger() usate? Io sono XOR.

Non so come spiegare :)

Ho preso questa funzione

int RandomInteger(int max_vl)
{
   return (int)MathFloor((MathRand()+MathRand()*32767.0)/1073741824.0*max_vl);  //случайное Int от 0 до  1073741824
}
 

Maxim, ho il sospetto che il modello per C++ non sia scaricato correttamente da CatBoost - puoi fare un confronto con il modello per python?

Ho una discrepanza tra i valori di interpretazione del modello in MQL5 dove i valori sono presi dal modello CPP e i valori dal modello binario. Il delta è di circa 0,15 - che è molto.

 
elibrarius:

Si normalizzano le barre passate, per esempio da 2020.5.1 00:00 a quelle future, da 2020.10.1 00:00 e quelle in mezzo.
Non si fa così nel mondo reale.
Dovete fare circa lo stesso calcolo da ogni barra, ma solo dalle barre passate per essa.

Sì, guardare al futuro c'è, così come altri problemi che non sono immediatamente evidenti. Non è del tutto applicabile per il trading diretto, ma è insostituibile per l'analisi preliminare. Per esempio la correlazione tra incrementi irrilevanti non ha senso.

 
Aleksey Nikolayev:

Sì, c'è uno sguardo al futuro, così come altri problemi che non sono immediatamente evidenti. Direttamente, per il trading diretto non è del tutto applicabile, ma per l'analisi preliminare è indispensabile. Per esempio, non ha senso calcolare la correlazione tra incrementi non relativi.

Ne terrò conto e forse un giorno lo rifarò per le barre precedenti e verificherò se migliora l'allenabilità.
Se qualcuno ha controllato prima, per favore fatemelo sapere.

Qual è l'analisi preliminare? Si alimenta il modello all'input e lo si confronta con o senza questa caratteristica.

Penso che sia meglio normalizzarlo per gli ultimi 30 minuti.
In alternativa, 30 ultimi minuti di questo giorno e 5 giorni precedenti di 30 minuti.

Per il modo in cui la volatilità è cambiata a marzo, la vostra variante impiegherà molto tempo per adattarsi, un mese o un mese e mezzo i valori attuali saranno molto più alti di quelli di un mese o due fa. Di conseguenza, il modello lavorerà in una zona sconosciuta. Semplicemente non avrà esempi di tali lavori sulla base dei quali fare previsioni.

Con la normalizzazione dell'ultima settimana, imparerà più rapidamente le nuove regole del gioco.
Motivazione: