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

 
mytarmailS:

1) Sim, você pode estar certo, mas esta rede é capaz de aprender a tomar decisões, não é a classificação habitual sem um professor, e por isso você pode implementar nela o conceito sobre o qual eu tenho falado há muito tempo - você pode ensiná-lo não o alvo padrão na forma de buy-sel-buy ou 000111010101011, mas mais abstratamente, como uma condição simples como: "Net! Não me importa como você negocia, mas quero que o seu lucro seja pelo menos 1% de 0,5% de drawdown por dia, e ele vai procurar as regras e combinações para resolver este problema. Se eu estiver errado e a dizer disparates aqui, por favor corrige-me para o meu próprio bem).

Certo, não pensei nisso, é verdade. Então é melhor condicionar a rede neural para maximizar a sharpe ratio (ou fator de recuperação), e fazer em R algo como um simples testador forex em cotações reais para testar o modelo para avaliar a evolução. Mas um milagre não acontecerá por si só, o problema da reciclagem permanecerá, os dados ainda devem ser divididos em treinamento e amostras de teste, e as validações cruzadas devem ser realizadas para a estimativa final do modelo durante sua evolução. Como trabalhar com sharpe ratio na validação cruzada não consegui pensar rapidamente, na minha opinião não será possível remover barras aleatórias na amostra de teste, porque não é importante a precisão em cada barra, mas sim a própria troca contínua, com todos os drawdowns, spreads e comissões para cada novo negócio.

Alexey Burnakov:

Eles parecem estar a preparar um pacote para o R. Devíamos tomar nota disso.

Eu já tenho o pacote, mas não sei quantos por cento está pronto, por enquanto no githab. Aqui está um exemplo mais simples, uma continuação do artigo. Eles ensinam a rede a extrair a raiz.

http://gekkoquant.com/2016/07/17/rneat-square-root-neural-net-trained-using-augmenting-topologies-simple-example/

Acabei-o mais tarde:

Fiz uma classificação de íris, codifiquei em atachamento por exemplo (o modelo falhou na classificação, substituí todas as classes por números para regressão, e arredondei os resultados para o nível numérico mais próximo. Provavelmente, poderia ter sido feito de alguma forma mais fácil).
Eu levei apenas 50% dos dados para treinamento, na validação o sucesso foi de 95%, bastante bom. A julgar pelo gráfico, o modelo até removeu o primeiro preditor por si só.

Forex é mais complicado do que Iris :) o resultado será muito pior lá.

Notei também que as partes 3 e 4 do artigo utilizam funções diferentes para treinar o modelo.
A parte 3 é para simular qualquer processo dinâmico, por exemplo, o modelo pode observar o gráfico de forex e abrir/fechar negociações em tempo real.
A parte 4 é simplesmente para treinar o modelo usando exemplos prontos e prever o resultado

Arquivos anexados:
 
Dr. Trader:

1) Certo, não pensei nisso, está certo. Então é melhor dar à rede neural uma condição para maximizar a sharpe ratio (ou fator de recuperação), e fazer em R algo como um simples testador forex em cotações reais

2) Notei também que as partes 3 e 4 do artigo utilizam funções diferentes para treinar o modelo.
A parte 3 é para simular alguns processos dinâmicos, por exemplo, o modelo pode observar o gráfico forex, e abrir/fechar negociações em tempo real.
A parte 4 é apenas para treinar o modelo em exemplos prontos e prever o resultado

1) Absolutamente certo! era exatamente isso que eu queria dizer, lucro/perda só por exemplo, eu estava pensando em tomar o fator recuperação, mas sharpe não é basicamente pior

2) Tem razão, no 4º artigo o autor já fez algo como um pacote, por todos os padrões "R", é o máximo que se tem um modelo - um vector alvo - previsão através de "prever" - mas esta abordagem não vai funcionar para nós, porque todas as funções já estão escondidas no pacote... Precisamos entender o código fonte e escrever tudo para nós mesmos, por isso eu disse ajuda para entender, pois tudo aqui é muito mais complicado do que com o "pacote pronto com exemplos para ele" eu acho que mesmo as funções da Parte 3 não serão suficientes para o que precisamos. Então seria fabuloso se todos nós entrássemos

 
mytarmailS:

1) Absolutamente certo! É exatamente isso que eu quis dizer, o lucro/perda é apenas um exemplo, eu estava pensando em tomar o fator de recuperação, mas sharpe é basicamente tão bom quanto ele fica

2) Tem razão, no 4º artigo o autor já criou algo como um pacote, por todos os padrões "R", que é tão simples como um modelo - um vector alvo - previsão através de "prever" - mas esta abordagem não vai funcionar para nós, porque todas as funções já estão escondidas no pacote... Precisamos entender o código fonte e escrever tudo para nós mesmos, por isso eu disse ajuda para entender, pois tudo aqui é muito mais complicado do que com o "pacote pronto com exemplos para ele" eu acho que mesmo as funções da Parte 3 não serão suficientes para o que precisamos. Então seria fabuloso se todos nós nos envolvêssemos

Quem vos ensinará senão vocês mesmos? Põe as tuas mãos no código fonte. Estuda-o. E também sobre a diferenciação da função. Você precisa alimentar a rede com algumas funções suaves. E você vai nos dizer - e nós lhe daremos nossos conselhos.
 
Alexey Burnakov:
Você precisa alimentar a rede com algumas funções suaves. E você vai dizer-nos ), e nós vamos dar-lhe os nossos conselhos.

Desculpe-me por interferir, mas não apenas suavemente, mas também normalizada.

Para que a NS nunca vá além das suas áreas conhecidas.

Algo parecido com isto.

 

Não consigo entender porque é que estas redes estão a ser apanhadas?

Afinal de contas, eles foram além das embalagens de queijo para a imensidão do R! Mas não, os pecados antigos continuam a arrastar e a arrastar...

Tomemos o caret, por exemplo. Não só há aí cento e cinquenta modelos, mas também um monte de funções úteis de pré-processamento, de previsão...

Então não, redes e redes...

 
SanSanych Fomenko:

Não consigo entender porque é que estas redes estão a ser apanhadas?

Afinal de contas, eles foram além das embalagens de queijo para a imensidão do R! Mas não, os pecados antigos continuam a arrastar e a arrastar...

Tomemos o caret, por exemplo. Não só há aí cento e cinquenta modelos, mas também um monte de funções úteis de pré-processamento, de previsão...

Então não, redes e redes...

Então, mostre-nos o seu caret e cento e cinquenta modelos em acção! :)

 
Vadim Shishkin:

Então mostre-nos o seu caret e cento e cinquenta modelos em acção em breve! :)

A propósito, eu mesmo uso o caret e obtenho resultados satisfatórios em forex.

Eu tenho uma amostra de código das minhas experiências:

####
##########
############## start experiment
##########
####

library(caret)
library(gbm)
library(doParallel)

        
# tuning GBM - перебор параметров обучения по сетке
gbmGrid <- expand.grid(interaction.depth = seq(from = 3, to = 9, by = 2)
                  , n.trees = seq(from = 600, to = 1200, by = 300)
                  , shrinkage = seq(from = 0.01, to = 0.02, by = 0.005)
                  , n.minobsinnode = seq(from = 30, to = 60, by = 30))

######################
# start training cycle - ввод основных переменных и массива для результатов

validating_arr <- data.frame()
max_best_models <- 1
counter <- 1
max_inputs <- 15
max_cv_folds <- 5
max_bag_fract <- 1
distributions <- c('gaussian', 'laplace')
start <- Sys.time()
        
for (best_inp_num in seq(from = 3, to = max_inputs, by = 3)){
        
        for (cv_folds in 2:max_cv_folds){
                
                for (bag_frac in seq(from = 0.2, to = max_bag_fract, by = 0.2)){

#########################
# prepare training scheme - параметры caret
                                        gbmControl <- trainControl(method = 'cv'
                                                                      , number = cv_folds
                                                                      , verboseIter = F
                                                                      , returnData = F
                                                                      , returnResamp = 'all'
                                                                      , savePredictions = 'none'
                                                                      , summaryFunction = mymetrics
                                                                      , search = 'grid'
                                                                      , allowParallel = T)

########################
# initiate paralleling
                        cores <- 4 #detectCores()
                        cl <- makePSOCKcluster(cores)
                        registerDoParallel(cl)
                        
                        # train the model - обучение моделей с кроссвалидацией. Используется GBM.
                        best_models <- train(training[, ncol(training)] ~.
                                                , data = training[, 1:(ncol(training) - 1)]
                                                , method = 'gbm'
                                                , distribution = distributions[2]
                                                , bag.fraction = bag_frac
                                                , metric = 'mae_improve'
                                                , maximize = T
                                                , trControl = gbmControl
                                                , tuneGrid = gbmGrid)
                        
                        # stop paralleling
                        stopCluster(cl)
                        
                        # summarize the model - сохранение n лучших моделей
                        best_models_arr <- as.data.frame(cbind(best_models[[4]][1]
                                                                    , best_models[[4]][2]
                                                                    , best_models[[4]][3]
                                                                    , best_models[[4]][4]
                                                                    , best_models[[4]][5]
                                                                    , best_models[[4]][6]
                                                                    , best_models[[4]][7]
                                                                    , best_models[[4]][8]))
                        
                        rm(best_models)
                        
                        best_models_arr_ordered <- best_models_arr[order(best_models_arr$mae_improve, decreasing = T), ]

# далее - обучение лучших моделей и их валидация


 
Obrigado. :)
 
SanSanych Fomenko:

Não consigo entender porque é que estas redes estão a ser apanhadas?

Afinal de contas, eles foram além das embalagens de queijo para a imensidão do R! Mas não, os pecados antigos continuam a arrastar e a arrastar...

Tomemos o caret, por exemplo. Não só há aí cento e cinquenta modelos, mas também um monte de funções úteis de pré-processamento, previsão...

Então, não, redes e redes...

Normalmente uma biblioteca pode fazer muito, mas média, ou apenas uma coisa com boa qualidade. O Caret é o primeiro caso, é fácil testar dezenas de modelos e comparar resultados, mas é difícil melhorar algo para a sua tarefa. Tive enormes dificuldades ao selecionar os preditores de acordo com minhas regras - o carpete pode simular o recozimento para enumerá-los (e a genética), mas não posso simplesmente levar a minha função de aptidão para estimação. Tenho de criar um novo modelo de carpete com funções de treino, validação e fitness; mas o carpete irá ainda assim controlar o treino e testar amostras de dados pelas suas próprias regras, com as suas próprias validações cruzadas.
É mais fácil para mim pegar o pacote GA ou GenSA para enumerar preditores, e escrever apenas uma função de adequação, que criará tanto o modelo quanto a validação cruzada de acordo com as regras que eu preciso.

O Neuronka não é pior que a floresta, os meus resultados com ele são positivos ou, no pior dos casos, apenas sem perder um depósito. Devido aos diferentes algoritmos, os neurónios preferem preditores diferentes aos da floresta, mas todas as regras de selecção dos preditores são completamente as mesmas que para a floresta.

Para transferir o neurônio para o mt5 EA é uma questão de alguns minutos (salvar pesos de R para csv, leia-os para o EA). Transferir floresta para o mt5 será muito mais difícil, é por isso que prefiro neuronka.

 

Eu experimentei um pouco mais com o RNeat e cheguei à conclusão de que ele não pode ser tratado da mesma maneira que as redes neurais convencionais.

1) Ao contrário dos modelos convencionais, o treinamento RNeat não utiliza dados de entrada. O modelo é uma espécie de gerado aleatoriamente, melhorado e só no final é testado em dados brutos. Tipicamente, os modelos usam dados brutos, constroem sua lógica sobre eles e depois usam a amostragem de validação para ver se a lógica do modelo está correta, ou se ele simplesmente aprendeu os exemplos brutos. Ao contrário dos outros, o RNeat não é capaz de memorizar os dados em bruto, pois não sabe nada sobre eles, tudo o que o modelo sabe são os resultados necessários e o quão próximo está deles.

2) A validação cruzada não vai ajudar a melhorar os resultados da frente. Todos nós parecemos concordar que é possível treinar um modelo normal, executar algumas validações cruzadas e, de alguma forma, lidar com os erros em todas as amostras para a pontuação final de aptidão física do modelo. Como o RNeat não conhece os dados brutos, não se importa se os dados estão em um treinamento ou em uma amostra de teste, ele ajustará sua lógica para o resultado desejado em qualquer caso. Teoricamente, ele "aprenderá" (mais precisamente, mude :) ) com todas as amostras que são usadas na função de fitness. Tudo o que você pode fazer é treinar o modelo com a precisão certa e esperar que ele não treine demais, uma abordagem bastante arriscada para forex. A validação cruzada só pode ser utilizada após o treino, como estimativa final de um possível resultado no fronttest, e de forma alguma utilizar esta amostra de validação dentro da função fitness.