Etiqueta de mercado ou boas maneiras em um campo minado - página 16

 
paralocus писал(а) >>

Neutron, vou fazer um curto intervalo de tempo. Tenho que repensar tudo novamente e colocá-lo em códigos para pelo menos um neurônio. De qualquer forma, um ou dois dias, e então continuaremos.

Eu realmente aprecio isso!

Ok.

 
Neutron >> :

Ok.

Olá Neutron. Aqui, eu fiz algo.

Eu fiz uma grade tão pequena para o algoritmo ORO:



Na verdade, aqui está o código da própria grade (este é o arquivo de cabeçalho Neyro_test.mqh):

extern int neyrons = 3;
extern int in = 5;

double Data[3][5] = {0.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,1.0 };

double W[4][5] = {-0.786, 0.359,-0.186, 0.891, 0.238,
0.711,-0.923, 0.088, 0.417,-0.112,
-0.867,-0.229, 0.321, 0.921,-0.941,
0.995,-0.712, 0.012,-0.625, 0.0 };

//----------------------------
double OUT(int bar = 1)
{
int i;
double res = 0.0;

GetInd(bar);
res = W[3,0]*RSI_1() + W[3,1]*RSI_2() + W[3,2]*RSI_3() + W[3,3];

return(res);
}

double RSI_1()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[0,i] * Data[0,i];

return(th(res));
}

double RSI_2()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[1,i] * Data[0,i];

return(th(res));
}

double RSI_3()
{
int i;
double res = 0.0;

for(i = 0; i < 5; i++)
res += W[2,i] * Data[0,i];

return(th(res));
}

//----------

void OPO(double de)
{
int i;
for(i = 0; i < 4; i++)
W[3,i] += de;
}

//---------------------------------------------------------------------

void GetInd(int i)
{
int dt = 7,per = 14, prc = 0;
double ue_in = 0.02,kf = 3.0;

Data[0,0] = th((iRSI(NULL,0,per,prc,i)*ue_in - 1.0)*kf);
Data[0,1] = th((iRSI(NULL,0,per,prc,i+dt)*ue_in - 1.0)*kf);
Data[0,2] = th((iRSI(NULL,0,per,prc,i+dt*2)*ue_in - 1.0)*kf);
Data[0,3] = th((iRSI(NULL,0,per,prc,i+dt*3)*ue_in - 1.0)*kf);
}
//-------------------------------------------

double th(double x)
{
double sh,ch;
sh = MathExp(x) - MathExp(-x);
ch = MathExp(x) + MathExp(-x);
return(sh/ch);
}



Eis como eu tentei ensiná-lo em um Expert Advisor vazio:

extern int cikl = 10;
static int prevtime = 0;


#include <Neyro_test.mqh>
//-----------------------------------
int init()
{
return(0);
}

int deinit()
{
return(0);
}
//-------------------------------------
int start()
{
static double test, control;

if(Time[0] == prevtime)
return(0);
prevtime = Time[0];

int pr = 14, pc = 0, i;
double in = 0.02, k = 3.0;


for(i = cikl; i > 2; i--)
{
test = OUT(i);
control = th((iRSI(NULL,0,pr,pc,i-1)*in - 1.0)*k);
OPO(test - control);
}

Comment("\r\n ВЕСА ВЫХОДНОГО НЕЙРОНА : ",W[3,0],", ",W[3,1],", ",W[3,2],", ",W[3,3]);
return(0);

}



Basicamente, esta grade fica "fora de moda". Os coeficientes de ponderação tornam-se ridiculamente altos após 10 passos (barras). Procurei por muito tempo por um erro no código e descobri que ele funciona como deveria.

Isto é, se simplesmente adicionarmos um erro obtido na saída da grade a todos os pesos da camada de saída, então estes coeficientes tendem a crescer muito rapidamente.

O escalímetro não consegue segurar... -:) Até agora eu só tentei propagar o erro para os pesos da camada de saída.

Primeira pergunta: O que eu fiz de errado?

Segunda pergunta:

Quero ter a probabilidade de sucesso de compra/venda na saída da grade ou uma recomendação para fumar bambu. Mas esta grade é treinada para prever o valor do RSI em n+1 barras.

O que eu ganho com isso?

 

na função ORO, os pesos não são modificados corretamente

Leia a teoria, pelo menos aqui

 
maxfade >> :

na função ORO, os pesos não são modificados corretamente

leia a teoria, pelo menos aqui

Obrigado, mas não entendo nada disso.

 

erro na camada de saída deve ser calculado usando a fórmula e=OUT*(1-OUT)*(TEST-OUT) (isto é para a função de transferência logística, para tangente hiperbólica a fórmula parece ser um pouco diferente, mas também não muito complicada)

o peso do neurônio deve ser modificado de acordo com w+=nju*e*OUT, onde nju é um passo de aprendizado

se o passo for muito grande - a rede será instável e haverá um aumento infinito de pesos (como no seu caso, você está usando (TEST-OUT) sem todos os outros multiplicadores)

Se for muito pequena - a rede levará muito tempo para aprender e pode atingir um mínimo local

 
maxfade >> :

erro na camada de saída deve ser calculado usando a fórmula e=OUT*(1-OUT)*(TEST-OUT) (isto é para a função de transferência logística, para tangente hiperbólica a fórmula parece ser um pouco diferente, mas também não muito complicada)

o peso do neurônio deve ser modificado de acordo com w+=nju*e*OUT, onde nju é um passo de aprendizado

se o passo for muito grande - a rede será instável e haverá um aumento infinito de pesos (como no seu caso, você está usando (TEST-OUT) sem todos os outros multiplicadores)

Se for muito pequeno, levará muito tempo para aprender e poderá atingir um mínimo local.


Obrigado, vou tentar agora.

 
maxfade >> :

Se a etapa for muito grande - a rede será instável e haverá um aumento infinito de pesos (como no seu caso, você usa (TEST-OUT) sem todos os outros multiplicadores)

Se for muito pequeno, levará muito tempo para aprender e poderá atingir um mínimo local.


Estou ligeiramente confuso com o fato de que a modificação resulta na "posição relativa" dos pesos que permanecem inalterados. Isto porque todos os pesos recebidos, como resultado da modificação, mudam na mesma quantidade. Neste caso, a relação de pesos original foi definida aleatoriamente. Deveria ser este o caso?

 

Olá, paralocus.

Vamos dar um passo de cada vez. Você tem um vetor de treinamento de comprimento n-contagens, e precisamos gerar um vetor de erro para corrigir todos os pesos da rede. É claro que o comprimento do vetor será igual ao número de pesos , contando os pesos de nível constante. O vetor de erro será gerado somente ao final da primeira (segunda, terceira, etc.) época de treinamento. O método de sua formação é o seguinte:

1. Na primeira etapa do treinamento (há um total de n em cada época), formamos um erro individual para cada peso e não corrigimos os pesos. Em seguida, na segunda etapa, tendo formado uma correção semelhante, adicioná-la à anterior, etc. n-times. Você obtém uma correção total (levando em conta o sinal de cada termo) para cada peso. Este é um ponto importante. Esta correção final não deve ser usada - os pesos se desfazem em pedaços! Ela deve ser dividida pela norma vetorial de correção. Para fazer isso, conte a soma dos quadrados de cada correção dentro de uma época de treinamento para cada peso separadamente. Assim que terminamos uma época(n-cycles dentro dela), pegamos a raiz quadrada da soma dos quadrados para cada peso separadamente, e dividimos pessoalmente cada correção por esta norma. Nós corrigimos cada peso.

2. 10 a 1000 épocas de treinamento, dependendo da finalidade do treinamento (sinal ou amplitude). Proceder da mesma forma. Ponto importante: ao proceder de época em época, você deve observar estritamente uma diminuição monotônica na amplitude da correção dos pesos. A Grade não deve ser preguiçosa para procurar um mínimo cada vez mais profundo no potencial da função de erro. É realizado de forma simples. No final de uma época, antes da correção de peso, multiplique o corretor pelo valor 1-j/N, onde N é o número de épocas de treinamento e j é o número da época atual.

3. Para evitar o efeito inevitável da saturação de alguns pesos do CETI durante seu treinamento, é necessário afetar todos os pesos com uma tangente hiperbólica imediatamente após a próxima correção dos pesos. Este procedimento não é óbvio, mas extremamente eficaz. Devido à suavidade e monotonicidade do FA usado, todos os pesos permanecerão sempre na faixa +/-1 e o próprio ato de agir não causa "histeria" à garota.

Isso é tudo por enquanto. Digerir e fazer perguntas.

Quanto à questão de como passar da RSI para Comprar/Vender, essa é mais uma pergunta para você - afinal de contas, você mesmo se propôs a fazer a mudança. Por exemplo, o que eu "prevejo", eu também uso para entrar (e estou prevendo exatamente para comprar/vender). É por isso que não há contradição. E você está tentando prever a cor do papel de parede em um plano arbitrário pela cor de um carro na frente de sua janela da cozinha...

 

Enquanto escrevia o post recordando os detalhes da implementação, havia algumas imprecisões.

Eu olhei para o código e descobri que estava influenciando a FA sobre pesos uma vez ao mudar para uma nova previsão, ou seja, não a cada época, mas quando era necessário reciclar a rede quando novos dados chegavam.

Mais uma coisa. A correção do peso é o produto do erro da saída do neurônio pela derivada FA e pela saída do neurônio (amplitude, levando em conta o sinal) a partir da qual o sinal é inserido.

Eis o que parece para um perseptron com uma produção não-linear (por exemplo):

Aqui as épocas são numeradas pelo índice L. Eu o mostro de propósito no MathCad, é mais claro. Em - número de entradas, x - vetor de entrada. O resto parece ser claro.

 
Neutron >> :

Quanto a como mudar da RSI para Comprar/Vender, isso é mais uma pergunta para você - você mesmo inventou essa mudança. Eu, por exemplo, o que eu prevejo, eu também entro (e prevejo exatamente a compra/venda). É por isso que não há contradição. E você está tentando prever a cor do papel de parede em um apartamento arbitrário pela cor do carro em frente à janela da cozinha daquele apartamento...

Olá, Neutron.

Estou lidando com o que você escreveu neste momento. É que a matemática está realmente rangendo na minha cabeça. A programação é um pouco mais fácil. E sobre o papel de parede - você está absolutamente certo - mas ainda não sei o que colocar na grade, além de todo o mesmo papel de parede, mas outra fábrica (acho que o resultado será o mesmo). Aqui no fórum eu li este artigo, ele começou meu interesse em redes neurais. E nesse artigo, como você sabe, em uma entrada, os pobres perceptron, espertos companheiros do fórum empurram o índice AO (ou AC - eu os confundo constantemente), e para ter algo para assistir, eles o dividiram em "clusters", compartilhando entradas de Perceptron no gráfico do índice mencionado(dt/dl ). Eles chamam tudo de "NEUROSETTING" ou mesmo "TRADING WITHIN THE NETHERLANDS O... (não, não era isso que eu queria dizer) AUTOMATIZAÇÃO SLIVA". Isso é muito dinheiro... em um testador.

Muito bem... que foi uma digressão.

Assim, depois desse artigo e de alguns outros semelhantes (pelos links dele) comecei a experimentar perceptrons de diferentes maneiras. De qualquer forma, é como aquela canção:

"Vanka senta-se no banco, batendo três kopecks com seu pinto.

Quer fazer três rublos - Nada sai"!

Entretanto, meu interesse em não cultivadores com o propósito de utilizá-los no comércio tem permanecido e até mesmo crescido com o tempo. O fato de eu ainda não conseguir pensar em nada melhor do que o agrupamento do RSI - não é culpa do meu tio, mas é "um bastão com duas pontas". Isto é, para saber o que e como colocar em malhas de entrada, preciso saber como essas malhas estão dispostas e não apenas saber, mas também ser capaz de fazê-las. Pelo menos em algumas formas não muito complicadas, mas o suficiente para um trabalho estável sobre o real. É por isso que me dirigi a vocês.


P.S. Nada que eu tenha ido em um "você"? É mais gentil assim.

Razão: