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

 
SanSanych Fomenko:
A coisa do "objeto" em R é muito mais complicada do que em muitas linguagens de programação.
Os objetos não são diferentes, apenas as funções str str, plot, resumo e similares são sobrecarregadas muitas vezes, cada tipo tem sua própria implementação
 
Alexey Burnakov:
Não entendo bem porque demora tanto tempo. Qual era o número_var_optimizado? Deve estar dentro de 10. Ajuste-o para 1200 segundos e deve ser alguma coisa.

Eu tenho muitos preditores (9602) e é por isso que leva tanto tempo. Eles são retirados para 2015 de eurusd d1, todos os tipos de preços, horários e indicadores lá. Eu ainda não saí do d1, então o número de exemplos de treinamento é de apenas 250+, pelo número de dias de negociação em um ano. Sem saltos.

optim_var_number = 0,8662363

Arquivos anexados:
trainData.zip  14378 kb
 
Dr. Trader:

Eu tenho muitos preditores (9602) e é por isso que leva tanto tempo. Eles são retirados para 2015 de eurusd d1, todos os tipos de preços, horários e indicadores lá. Eu ainda não saí do d1, então o número de exemplos de treinamento é de apenas 250+, pelo número de dias de negociação em um ano. Sem saltos.

optim_var_number = 0,8662363

Eu vou brincar com o teu cenário. Tudo deve voar.
 
SanSanych Fomenko:

O último tem a 1ª coluna dizendo que se você tomar apenas o PC1 então 0,9761 de variabilidade é explicado (Proporção acumulada) , se você tomar DOIS componentes - PC1 e PC2 então 0,99996 é explicado, etc.

PC1 PC2 PC3 PC4 PC5

Desvio padrão 2,2092 0,34555 0,01057 0,008382 0,004236

Proporção de variação 0,9761 0,02388 0,00002 0,000010 0,000000

Proporção acumulada 0,9761 0,99996 0,99996 0,99998 1,000000 1,000000

Acabou por ser uma pequena confusão - este método só funciona se você trabalhar com todos os componentes possíveis. A função prcomp tem um parâmetro "tol", que é NULL por padrão. Mas pode ser-lhe atribuído qualquer valor de 0 a 1, para reduzir o número de componentes encontrados. Funciona assim: na busca de novos componentes sdev do primeiro é tomado e multiplicado pela portagem. Quando o sdev do novo componente ficar abaixo deste produto, não serão gerados novos componentes. Por exemplo, se tol = 0.1, então todos os componentes com sdev <0.22 serão descartados, então você terá apenas os dois componentes principais. Se tol=0,003, então apenas os componentes com sdev > 0,0066276 permanecerão, ou seja, apenas quatro. Se a função tol=NULL (padrão) irá gerar o número máximo de componentes, mas isso leva muito tempo, então eu quero encurtar esse processo. Se eu usar a portagem então tudo funciona mais rápido e há menos componentes, mas neste caso ele quebra. É de alguma forma calculado apenas com base em componentes encontrados. A proporção acumulada do último componente encontrado será sempre 1. Mesmo que apenas 2 componentes sejam encontrados em vez de milhares - a propagação cumulativa do segundo componente mudará para 1 (por exemplo, de 0,1 no caso de todos os componentes serem gerados) e, consequentemente, a propagação cumulativa do PC1 também aumentará. É possível que aProporção Cumulativa também mude incorretamente ao se peneirar os preditores.

Então a Proporção cumulativa não é confiável, se você trabalha seriamente com o y-aware pca então você deve escrever sua própria função para calcular a variabilidade explicada.

 
Dr. Trader:

Acabou por ser um pouco mau - este método só funciona se você trabalhar com todos os componentes possíveis. A função prcomp tem um parâmetro "tol", que é NULL por padrão. Mas você pode defini-lo para qualquer valor de 0 a 1, para reduzir o número de componentes encontrados. Funciona assim: na busca de novos componentes sdev do primeiro é tomado e multiplicado pela portagem. Assim que o sdev do novo componente ficar abaixo deste produto, não serão gerados novos componentes. Por exemplo, se tol = 0.1, então todos os componentes com sdev <0.22 serão descartados, então você terá apenas os dois componentes principais. Se tol=0,003, então apenas os componentes com sdev > 0,0066276 permanecerão, ou seja, apenas quatro. Se a função tol=NULL (padrão) irá gerar o número máximo de componentes, mas isso leva muito tempo, então eu quero encurtar esse processo. Se eu usar a portagem então tudo funciona mais rápido e há menos componentes, mas neste caso ele quebra. É de alguma forma calculado apenas com base em componentes encontrados. A proporção acumulada do último componente encontrado será sempre 1. Mesmo que apenas 2 componentes sejam encontrados em vez de milhares - a propagação cumulativa do segundo componente mudará para 1 (por exemplo, de 0,1 no caso de todos os componentes serem gerados) e, consequentemente, a propagação cumulativa do PC1 também aumentará. É possível que aProporção Cumulativa também mude incorretamente ao se peneirar os preditores.

Então a Proporção cumulativa não deve ser confiável, se você trabalha seriamente com o y-aware pca então você deve escrever sua própria função para calcular a variabilidade explicada.

Essa é uma ideia interessante, não é por nada que te tenho agitado para dar uma vista de olhos.
 
Dr. Trader:

Eu tenho muitos preditores (9602) e é por isso que leva tanto tempo. Eles são retirados para 2015 de eurusd d1, todos os tipos de preços, horários e indicadores lá. Eu ainda não saí do d1, então o número de exemplos de treinamento é de apenas 250+, pelo número de dias de negociação em um ano. Sem saltos.

optim_var_number = 0,8662363

Eu olhei para o teu conjunto. Ou eu não entendo algo, por exemplo, nem todas as variáveis estão a entrar, ou estás a cometer um grande erro. Você tem muitos valores de preço em bruto, por exemplo, 1.1354 (MA e outros). Não há como você fazer isso, pois são dados completamente não-estacionários. Todos os dados devem ser DIFERENTES ou indicadores oscilantes, e ser omnidirecionais. Encontrar dependências em tais dados é um trabalho completamente inútil.
 

Certo, eu esqueci, você já disse que os dados tinham que ser especialmente preparados. Tirei os dados em bruto. Também há osciladores entre os indicadores, vou tentar tomar apenas eles.

A propósito, o modelo PCA funciona com esses dados, mas precisa de muita centralização, escalas e alguma rotação dos dados de origem. Para a neurônica é mais fácil, ela só precisa de normalização dos dados em [0...1].

 
Dr. Trader:

Certo, eu esqueci, você já disse que os dados tinham que ser especialmente preparados. Tirei os dados em bruto. Também há osciladores entre os indicadores, vou tentar tomar apenas eles.

A propósito, o modelo PCA funciona com esses dados, mas precisa de muita centralização, escalas e alguma rotação dos dados de origem. Para a neurônica é mais fácil, ela só precisa de normalização dos dados em [0...1].

Não, você definitivamente não entende a importância da não-estacionariedade. Não importa se é um modelo NS ou linear ou o meu modelo, se os seus dados não são estacionários, as dependências encontradas sobre eles são garantidas de não ocorrer fora da amostra. Todos os dados que você tem na forma de: preço bruto, MA(preço bruto), abertura de barras(preço bruto), etc. precisam ser removidos do modelo. Você tem que pegar a diferença deles em relação ao último preço conhecido.

Não é possível escalar para um intervalo aqui.

 
Alexey Burnakov:

Se você tiver dados não estacionários, então é garantido que as dependências encontradas não ocorrerão fora da amostra.

Há apenas uma nuance interessante que semeia dúvidas sobre a adequação da reprodução de tais dados (diferenças em relação aos valores anteriores)

1) por exemplo, se tivermos um preço,

2) nós geramos a sua diferença

3) tomamos dois segmentos de diferenças que estão muito próximos um do outro por estrutura (que seja Euclidiano)

4) essas áreas pertencem quase 100% a um cluster em RF ou aos mesmos neurônios e são consideradas situações idênticas

5) pegamos então nestas duas secções (diferenças) e reduzimo-las novamente aos preços iniciais, ou seja, acumulamo-las

E vemos que estas secções são totalmente diferentes, muitas vezes uma secção tem tendência para cima e a outra para baixo, ou seja, não há semelhanças, enquanto o algoritmo pensa que estas secções são idênticas...

O que achas disto, Alexey? Os teus comentários são interessantes como um homem com experiência.

 
mytarmailS:

Há apenas uma nuance interessante que semeia dúvidas sobre a adequação da reprodução de tais dados (diferenças em relação ao valor anterior)

1) por exemplo, se tivermos um preço,

2) nós geramos a sua diferença

3) tomamos dois segmentos de diferenças que estão muito próximos um do outro por estrutura (que seja Euclidiano)

4) essas áreas são quase 100% pertencentes a um cluster em RF ou à mesma neurônica e são consideradas como situações idênticas

5) pegamos então nestas duas secções (diferenças) e reduzimo-las novamente aos preços iniciais, ou seja, acumulamo-las

E vemos que estas secções são totalmente diferentes, muitas vezes uma secção tem tendência para cima e a outra para baixo, ou seja, não há qualquer semelhança, enquanto o algoritmo pensa que estas são secções idênticas...

O que achas disto, Alexei? É interessante ouvir os teus comentários como homem com experiência.

Por que seria assim? Se as diferenças forem as mesmas, então a série integral coincidirá completamente. Se forem apenas semelhantes, as séries integrais serão semelhantes (por tendência).

Eu queria dizer ao Trader para ler o básico da preparação dos dados. Ninguém submete preços em bruto para entrada. Isto já foi jogado cem mil vezes. Dados imprevisíveis levam a dependências instáveis.