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

 
Mihail Marchukajtes:
Sim, eu estava fazendo desfasamentos porque nas versões anteriores eles aumentam a potência envolvente, agora com algoritmo de pré-busca melhorado eu não acho que seja necessário, então estou tentando treinar sem eles. Estou a tentar treinar sem eles. Mais tarde, vou relatar os meus resultados.

Se eu falhar, ou seja, a generalizabilidade não aumenta sem atrasos, então a 13ª e a 14ª versões são muito provavelmente algumas não universais, destinadas a uma gama restrita de tarefas?

Nesse caso, você terá que rolar o GIT de volta para mover o jPrediction de uma maneira diferente e mais universal.

Embora exista uma segunda hipótese: a presença de desfasamentos na amostra é uma direção estreita e não universal, para a qual as versões anteriores foram aperfeiçoadas?

 
Yury Reshetov:

Se o truque falhar, ou seja, a generalizabilidade sem atrasos não melhora, então o mais provável é que as versões 13 e 14 sejam algumas não universais, afiadas para uma gama restrita de tarefas?

Nesse caso, teremos que fazer o GIT voltar para mover o jPrediction de uma forma diferente e mais universal.

Embora exista uma segunda hipótese: a presença de desfasamentos na amostra é uma direção estreita e não universal, para a qual as versões anteriores foram aperfeiçoadas?

Bem, vejamos o que se passa... Vou informar imediatamente, assim que praticar...
 
Dr. Trader:

Eu respondo aqui então.

#пара строк из той таблицы, не буду я всё текстом копировать, потом первая строка повторена ещё дважды
dat <- data.frame(cluster1=c(24,2,13,23,6), cluster2=c(5,15,13,28,12), cluster3=c(18,12,16,22,20), cluster4=c(21,7,29,10,25), cluster5=c(16,22,24,4,11), target.label=c(1,1,0,1,0))
dat <- rbind(dat, dat[1,], dat[1,])
#результат последней строки поменян на 0 для эксперимента
dat[7,"target.label"]=0

library(sqldf)
#для sqldf точек в названиях колонок быть не должно
colnames(dat)[6] <- "target"

dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )
dat1
dat1[ dat1$target_count>=10 & dat1$target_avg>0.63 , ]
dat1[ dat1$target_count>=10 & ( dat1$target_avg<0.37 | dat1$target_avg>0.63 ), ] #на случай если оба "0" или "1" встречаются чаще 70%

Obrigado, solução muito compacta!!!

Por favor, ajude com mais uma nuance na corda


dat1 <- sqldf( "select cluster1, cluster2, cluster3, cluster4, cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1, cluster2, cluster3, cluster4, cluster5" )

Como substituo os nomes dos clusters seletivos por uma variável, digamos

colnames_dat <- colnamed(dat) [-"target"]
dat1 <- sqldf( "select colnames_dat, avg(target) as target_avg, count(target) as target_count from dat group by colnames_dat" )

porque haverá 500 ou talvez até 1000 clusters na vida real, seria irrealista escrever cada nome de cluster manualmente, e a solução não funciona de cabeça para baixo.

 
Mihail Marchukajtes:
Bem, vamos ver como corre... Eu conto-te assim que tentar...

A questão é que antes da versão 13, aqueles preditores que estavam mais próximos do início da amostra eram processados com maior probabilidade. E aqueles no final da amostra (mais próximos da variável alvo) foram processados com menor probabilidade. Ou seja, se os preditores mais significativos são colocados à esquerda na amostra com antecedência e os menos significativos à direita, obtemos uma boa capacidade de generalização. Se vice-versa, então pobre. O problema era que isso exigia saber antecipadamente quais os preditores mais significativos, ou seja, pré-classificá-los na amostra por significância. Mas nesse caso, o próprio algoritmo de seleção do preditor não foi muito eficiente.

Na versão 14, a probabilidade de processamento para todos os preditores é praticamente a mesma. Mas isto cria outro problema. Afinal, o algoritmo de ajuste do preditor opera em um método de busca gradiente, mudando um passo a cada vez para aumentar a generalização. Ao mesmo tempo, tem um risco não nulo de ficar "preso" em um extremo local, como outros métodos de gradiente. Antes da versão 12, este risco era mitigado por preditores prévios na amostra.

Em geral, há problemas na primeira e segunda versões do algoritmo e precisamos analisá-los para eliminá-los. Por exemplo, para introduzir no algoritmo alguns saltos aleatórios para vários passos em diferentes direções a partir do estado atual, a fim de "saltar" sobre as "ravinas".

 
mytarmailS:

> clusternames <- paste(colnames(dat)[-ncol(dat)], collapse=",")
>
clusternames
[1] "cluster1,cluster2,cluster3,cluster4,cluster5"
> sql_query <- paste0("select ", clusternames, ", avg(target) as target_avg, count(target) as target_count from dat group by ", clusternames)
>
sql_query
[1] "select cluster1,cluster2,cluster3,cluster4,cluster5, avg(target) as target_avg, count(target) as target_count from dat group by cluster1,cluster2,cluster3,cluster4,cluster5"
> dat1 <- sqldf( sql_query )
>
dat1

 
Yury Reshetov:

para "saltar" sobre "ravinas".

Às vezes a otimização do L-BFGS é incorporada à neurônica, ela permite escalar para fora dos barrancos. O pacote neural nnet, por exemplo.

Há muita matemática lá, não sei como funciona, mas a idéia é descer não por gradiente, mas por gradiente de gradiente (derivado de derivado).

 
Vizard_:
1) Exemplo primitivo e corretamente entendido (se as redes ou etc. não estão em lugar nenhum, começa a "inventar")))
2) Somente por que procurar 70%, quando você pode encontrar e usar 100 (não pelo preço do curso).

1) sim, sim, eles têm esse pecado )) descrevi-o em parágrafos sobre as vantagens da "minha" abordagem

2) Vou procurar combinações em inversões, não é apenas uma direção ou cor da vela, mas uma inversão para cima, para baixo, não uma inversão

Inicialmente tenho muito menos observações do que preciso, mas se tudo funcionar ficarei feliz com 40% dos resultados, nem sequer preciso de 70%, pois o meu risco alvo será de 1 a 5

Dr. Trader:

Muito obrigado, prepararei lentamente os dados, depois vou me agrupar, depois procurarei padrões e informarei sobre os resultados.

 
Dr. Trader:

Às vezes a optimização da L-BFGS é incorporada nos neurónios, permite que você saia das ravinas. O pacote de neurónios nnet, por exemplo.

BFGS e seus derivados como o L-BFGS foram concebidos para resolver o problema que a jPrediction já resolveu, ou seja, encontrar extremos locais. Ou seja, estes algoritmos permitem "escalar" de "barrancos" na direcção do extremo mais próximo em vez de "saltar" sobre barrancos a fim de procurar extremos alternativos.

Precisamos de algoritmos "jumpers". E é desejável que eles "saltem" não aleatoriamente, mas em alguma direção potencialmente promissora. Teoricamente, isto pode ser implementado através da genética, onde tais "saltos" são feitos através de mutações. Mas os algoritmos genéticos são muito lentos e mais adequados para aquelas tarefas em que os descendentes potenciais podem ser testados para piolhos com um consumo mínimo de tempo. Treinar um neurónio para calcular a sua generalizabilidade é demorado, por isso a genética seria demasiado lenta aqui.

OK, por falta de um melhor, estou atualmente testando uma variante com "saltos" aleatórios.

 

Outro livro R. Vou prendê-lo aqui, pois não está claro para onde mais ir. Deixa estar.

S.E. Mastitsky, V.K. Shitikov

ANÁLISE ESTATÍSTICA E VISUALIZAÇÃO DE DADOS COM R

Arquivos anexados:
 

Se você procurar por padrões como mytarmailS, deslizando por barra, cada padrão conterá informações sobre quanto de um intervalo os valores em cada barra podem ser. Quanto mais padrões, menos intervalo será definido para cada barra.

Grosso modo, para que uma determinada janela com novos dados seja incluída em algum padrão encontrado anteriormente, ela deve cair em limites tão sérios inerentes a cada padrão.

Se você for e encontrar 1000 padrões, a largura do "canal" de cada padrão será pequena. E como os novos dados são sempre ligeiramente diferentes dos dados de treinamento - será difícil entrar em um canal tão estreito, isso levará a erros.

Eu seria guiado pelo britânico de Occam - se você pode reduzir o número de padrões e obter o mesmo resultado sem deterioração, é melhor que você o faça.

Razão: