Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 2065

 
Evgeniy Chumakov:

Assumindo que não há lacunas na história e que há 1440 minutos em todos os dias (menos na sexta-feira), o código deve ser assim

lacunas mesmo no eurusd. Trabalhar com o tempo do bar
 
elibrarius:
As lacunas ocorrem mesmo em eurusd. Trabalhar com tempo de bar


É compreensível, se o fizesse, era o que eu faria. Isto é só para tornar mais fácil de explicar.

 

De alguma forma, parece funcionar) Para economizar, uma nova linha é coletada em taxas[i].altas

#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:

De alguma forma, parece funcionar) Para salvar, a nova linha é recolhida em taxas[i].altas

Você normaliza barras passadas, por exemplo, a partir de 2020.5.1 00:00 para barras do futuro, c 2020.10.1 00:00 e as que estão no meio.
Não se pode fazer isso no mercado real.
Você tem que fazer o mesmo cálculo para cada barra, mas apenas para as barras passadas.

 
Aleksey Nikolayev:

De alguma forma, parece funcionar) Para salvar, uma nova linha é coletada em taxas[i].altas

Mesmo que o faça correctamente, pode reconstruir com muita precisão as alturas normalizadas das velas com rede/floresta.
Como fetches alimentamos 60 alturas de candelabros com offset diário, e ensinamos alturas normalizadas obtidas no seu código.
O treinamento deve ser quase 100% preciso.

Isto é, os castiçais normalizados não contêm nenhuma informação nova.
O único benefício é não ser necessário passar 60 recursos extras para o treinamento de modelos.
É improvável que alguém se submeta como barras de fichas com 2 meses, ou seja, novas informações para aqueles que não as arquivaram, ainda há).

É claro que devemos verificar se estas alturas normalizadas dos castiçais melhoram a eficiência do modelo, e claro que devemos usá-lo (ou uma das suas fichas, que é mais preferível, ou a 60ª de que é composto).

 
Vamos já verificar uma coisa, senão já foram escritas três páginas, energia desperdiçada e o incremento no erro Deus proíbe que seja meio por cento.
 
elibrarius:

Isso é estranho. Pergunto-me como poderia ser explicado?
Eu tenho outra versão comentada, mas não gostei por razões lógicas:

Qual RandomInteger() você usa? Eu sou XOR.

Eu não sei como explicar :)

Eu assumi esta função.

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

Maxim, tenho uma suspeita de que o modelo para C++ não está correctamente descarregado do CatBoost - pode comparar com o modelo para python?

Eu tenho uma discrepância entre os valores de interpretação do modelo em MQL5 onde os valores são retirados do modelo CPP e os valores do modelo binário. O delta é por volta de 0,15 - o que é muito.

 
elibrarius:

Você normaliza barras passadas, por exemplo, a partir de 2020.5.1 00:00 para barras futuras, a partir de 2020.10.1 00:00 e as que se encontram no meio.
Não se faz isto no mundo real.
Você tem que fazer o mesmo cálculo de cada barra, mas apenas das barras passadas para isso.

Sim, olhar para o futuro está lá, assim como outros problemas que não são imediatamente óbvios. Não é totalmente aplicável para negociação direta, mas é insubstituível para análise preliminar. Por exemplo, a correlação entre os incrementos não-relativos não faz sentido.

 
Aleksey Nikolayev:

Sim, há um vislumbre do futuro, bem como outros problemas que não são imediatamente óbvios. Directamente, para o comércio directo não é bem aplicável, mas para uma análise preliminar é indispensável. Por exemplo, não faz sentido calcular a correlação entre os incrementos não-relativos.

Vou levá-lo em conta e talvez um dia eu o refaça para barras anteriores e verifique se melhora a treinabilidade.
Se alguém o verificou antes, por favor, avise-me.

Qual é a análise preliminar? Você alimenta o modelo com a entrada e compara-o com ou sem este recurso.

Acho que é melhor normalizá-lo nos últimos 30 minutos.
Como alternativa, 30 últimos minutos deste dia e 5 dias anteriores de 30 minutos.

Pela forma como a volatilidade mudou em março, sua variante levará muito tempo para se adaptar, um mês ou um mês e meio de valores atuais serão muito mais altos do que eram há um ou dois meses atrás. Como resultado, o modelo funcionará em uma zona desconhecida. Simplesmente não terá exemplos de tal trabalho com base no qual possa fazer previsões.

Com a normalização durante a última semana, aprenderá as novas regras do jogo mais rapidamente.