Melhores estratégias 4: Aprendizado de máquinas.
Deep Blue foi o primeiro computador que ganhou um campeonato mundial de xadrez. Isso foi em 1996 e levou 20 anos até que outro programa, o AlphaGo, pudesse derrotar o melhor jogador Go humano. Deep Blue era um sistema baseado em modelo com regras de xadrez hardwired. O AlphaGo é um sistema de mineração de dados, uma rede neural profunda treinada com milhares de jogos Go. Hardware não melhorado, mas um avanço no software foi essencial para o passo de vencer os melhores jogadores de xadrez para vencer os melhores jogadores Go.
Nesta 4ª parte da mini-série, analisaremos a abordagem de mineração de dados para o desenvolvimento de estratégias comerciais. Este método não se preocupa com os mecanismos de mercado. Ele apenas verifica curvas de preços ou outras fontes de dados para padrões preditivos. Aprendizagem de máquina ou "Inteligência Artificial" e # 8221; nem sempre está envolvido em estratégias de mineração de dados. Na verdade, o mais popular & # 8211; e surpreendentemente lucrativo & # 8211; O método de mineração de dados funciona sem redes neurais sofisticadas ou máquinas de vetor de suporte.
Princípios de aprendizado da máquina.
Um algoritmo de aprendizagem é alimentado com amostras de dados, normalmente derivadas de algum modo de preços históricos. Cada amostra consiste em n variáveis x 1 .. x n, comumente designadas preditores, recursos, sinais ou simplesmente entrada. Esses preditores podem ser os retornos de preços das últimas barras n, ou uma coleção de indicadores clássicos, ou qualquer outra função imaginável da curva de preços (I & # 8217; até mesmo visto os pixels de uma imagem de gráfico de preços usada como preditor para uma neural rede!). Cada amostra também inclui normalmente uma variável alvo y, como o retorno do próximo comércio depois de tirar a amostra, ou o próximo movimento de preços. Na literatura, você pode encontrar também o nome do rótulo ou objetivo. Em um processo de treinamento, o algoritmo aprende a prever o alvo y a partir dos preditores x 1 .. x n. A memória aprendida & # 8216; & # 8217; é armazenado em uma estrutura de dados chamada modelo que é específico para o algoritmo (não deve ser confundido com um modelo financeiro para estratégias baseadas em modelos!). Um modelo de aprendizagem de máquina pode ser uma função com regras de predição no código C, gerado pelo processo de treinamento. Ou pode ser um conjunto de pesos de conexão de uma rede neural.
Os preditores, características, ou o que quer que você os chama, devem conter informações suficientes para prever o alvo e com alguma precisão. Eles também cumprem com freqüência dois requisitos formais. Primeiro, todos os valores de preditores devem estar no mesmo intervalo, como -1 ... +1 (para a maioria dos algoritmos R) ou -100 ... +100 (para algoritmos Zorro ou TSSB). Então você precisa normalizá-los de alguma forma antes de enviá-los para a máquina. Em segundo lugar, as amostras devem ser equilibradas, ou seja, distribuídas igualmente em todos os valores da variável alvo. Então, deve haver quase tantos como ganhar amostras. Se você não observar estes dois requisitos, você se perguntará por que você está obtendo resultados ruins do algoritmo de aprendizado da máquina.
Os algoritmos de regressão prevêem um valor numérico, como a magnitude e o sinal do próximo movimento de preços. Os algoritmos de classificação prevêem uma classe de amostra qualitativa, por exemplo, se ela está precedendo uma vitória ou uma perda. Alguns algoritmos, como redes neurais, árvores de decisão ou máquinas de vetor de suporte, podem ser executados em ambos os modos.
Alguns algoritmos aprendem a dividir amostras em classes sem necessidade de qualquer alvo y. A aprendizagem sem supervisão desse tipo, em oposição à aprendizagem supervisionada usando um alvo. Somewhere inbetween é o aprendizado de reforço, onde o sistema se treina executando simulações com os recursos fornecidos e usando o resultado como alvo de treinamento. AlphaZero, o sucessor do AlphaGo, usou a aprendizagem de reforço ao jogar milhões de jogos Go contra si. Em finanças, há poucas aplicações para aprendizagem sem supervisão ou reforço. 99% das estratégias de aprendizagem de máquinas usam a aprendizagem supervisionada.
Independentemente dos sinais que usamos para preditores em finanças, eles provavelmente contêm muito ruído e pouca informação, e não serão estacionários além disso. Portanto, a previsão financeira é uma das tarefas mais difíceis na aprendizagem por máquinas. Algoritmos mais complexos não conseguem necessariamente melhores resultados. A seleção dos preditores é fundamental para o sucesso. Não é bom usar muitos preditores, uma vez que isso simplesmente causa superação e falha na operação da amostra. Portanto, as estratégias de mineração de dados geralmente aplicam um algoritmo de pré-eleição que determina um pequeno número de preditores de um grupo de muitos. A pré-seleção pode basear-se na correlação entre preditores, na significância, no conteúdo da informação ou simplesmente no sucesso da previsão com um conjunto de testes. Experimentos práticos com seleção de recursos podem ser encontrados em um artigo recente sobre o blog Robot Wealth.
Aqui é uma lista dos métodos de mineração de dados mais populares usados em finanças.
1. Sopa indicadora.
A maioria dos sistemas de negociação que nós estamos programando para clientes não são baseados em um modelo financeiro. O cliente só queria sinais comerciais de certos indicadores técnicos, filtrado com outros indicadores técnicos em combinação com indicadores mais técnicos. Quando perguntado como essa mistura de indicadores poderia ser uma estratégia rentável, ele normalmente respondeu: "Confie em mim". Eu negocie-o manualmente e funciona. & # 8221;
Certamente. Pelo menos às vezes. Embora a maioria desses sistemas não tenha passado um teste WFA (e alguns nem mesmo um backtest simples), um número surpreendentemente grande. E esses também foram geralmente lucrativos no comércio real. O cliente havia experimentado sistematicamente indicadores técnicos até encontrar uma combinação que funcionasse em negociação ao vivo com certos ativos. Esta maneira de análise técnica de teste e erro é uma abordagem clássica de mineração de dados, apenas executada por um ser humano e não por uma máquina. Eu realmente não posso recomendar este método # 8211; e muita sorte, para não falar de dinheiro, provavelmente está envolvido & # 8211; mas posso testemunhar que às vezes leva a sistemas lucrativos.
2. Padrões de velas.
Não deve ser confundido com os padrões japoneses de velas que tiveram a melhor data antes, há muito tempo. O equivalente moderno é a negociação de ações de preço. Você ainda está olhando o aberto, alto, baixo e fechado de velas. Você ainda espera encontrar um padrão que preveja uma direção de preço. Mas você agora está curando curvas de preços contemporâneas para coleta desses padrões. Existem pacotes de software para esse fim. Eles procuram padrões que são lucrativos por algum critério definido pelo usuário, e usá-los para criar uma função de detecção de padrões específica. Poderia parecer este (do analisador de padrão Zorro & # 8217; s):
Esta função C retorna 1 quando os sinais correspondem a um dos padrões, caso contrário, você pode ver do longo código que esta não é a maneira mais rápida de detectar padrões. Um método melhor, usado pelo Zorro quando a função de detecção não precisa ser exportada, é classificar os sinais por sua magnitude e verificar a ordem de classificação. Um exemplo desse sistema pode ser encontrado aqui.
O mercado de ações de preços pode realmente funcionar? Assim como a sopa de indicadores, ela não é baseada em nenhum modelo financeiro racional. Pode-se, na melhor das hipóteses, imaginar que as seqüências de movimentos de preços levem os participantes do mercado a reagirem de uma certa maneira, estabelecendo assim um padrão preditivo temporário. No entanto, o número de padrões é bastante limitado quando você olha apenas as seqüências de algumas velas adjacentes. O próximo passo é comparar velas que não são adjacentes, mas arbitrariamente selecionadas dentro de um período de tempo mais longo. Desta forma, você está obtendo um número quase ilimitado de padrões & # 8211; mas à custa de deixar finalmente o reino do racional. É difícil imaginar como um movimento de preços pode ser previsto por alguns padrões de velas de semanas atrás.
Ainda assim, há muito esforço para isso. Um colega de blogueiro, Daniel Fernandez, administra um site de inscrição (Asirikuy) especializado em padrões de vela de dados minerados. Ele refinou o padrão de negociação até os menores detalhes, e se alguém conseguisse algum lucro desta forma, seria ele. Mas para seus assinantes & # 8217; desapontamento, trocando seus padrões ao vivo (QuriQuant) produziu resultados muito diferentes do que seus maravilhosos backtests. Se os sistemas de ação de preço rentáveis realmente existem, aparentemente ninguém já os encontrou.
3. Regressão linear.
A base simples de muitos algoritmos complexos de aprendizagem de máquina: Prever a variável alvo y por uma combinação linear dos preditores x 1 .. x n.
Os coeficientes a n são o modelo. Eles são calculados para minimizar a soma de diferenças quadradas entre os valores verdadeiros de y das amostras de treino e seus i preditos a partir da fórmula acima:
Para amostras distribuídas normais, a minimização é possível com alguma aritmética da matriz, portanto, nenhuma iteração é necessária. No caso n = 1 & # 8211; com apenas uma variável preditor x & # 8211; a fórmula de regressão é reduzida para.
que é uma regressão linear simples, em oposição à regressão linear multivariada onde n & gt; 1. A regressão linear simples está disponível na maioria das plataformas de negociação, f. i. com o indicador LinReg no TA-Lib. Com y = preço e x = tempo, muitas vezes usado como alternativa para uma média móvel. A regressão linear multivariada está disponível na plataforma R através da função lm (...) que vem com a instalação padrão. Uma variante é a regressão polinomial. Como regressão simples, ele usa apenas uma variável preditor x, mas também seus graus quadrados e superiores, de modo que x n == x n:
Com n = 2 ou n = 3, a regressão polinomial é freqüentemente usada para prever o próximo preço médio a partir dos preços suavizados das últimas barras. A função polyfit de MatLab, R, Zorro e muitas outras plataformas podem ser usadas para regressão polinomial.
4. Perceptron.
Muitas vezes referido como uma rede neural com apenas um neurônio. Na verdade, um perceptron é uma função de regressão como acima, mas com um resultado binário, assim chamado de regressão logística. Não é regressão, é um algoritmo de classificação. A função de recomendação do Zorro (PERCEPTRON, & # 8230;) gera código C que retorna 100 ou -100, dependendo se o resultado previsto está acima de um limite ou não:
Você pode ver que a matriz sig é equivalente às características x n na fórmula de regressão, e os fatores numéricos são os coeficientes a n.
5. Redes nacionais.
A regressão linear ou logística só pode resolver problemas lineares. Muitos não se enquadram nessa categoria & # 8211; um exemplo famoso é prever a saída de uma função XOR simples. E provavelmente também previsão de preços ou retornos comerciais. Uma rede neural artificial (ANN) pode enfrentar problemas não-lineares. É um monte de perceptrons que estão conectados em uma série de camadas. Qualquer perceptron é um neurônio da rede. Sua saída vai para as entradas de todos os neurônios da próxima camada, como esta:
Como o perceptron, uma rede neural também aprende determinando os coeficientes que minimizam o erro entre a previsão da amostra e o alvo da amostra. Mas isso exige agora um processo de aproximação, normalmente com backpropagating o erro da saída para as entradas, otimizando os pesos a caminho. Este processo impõe duas restrições. Primeiro, as saídas do neurônio devem agora ser continuamente funções diferenciáveis em vez do limiar de perceptron simples. Em segundo lugar, a rede não deve ser muito profunda e # 8211; não deve ter muitas camadas escondidas & # 8217; de neurônios entre entradas e saída. Esta segunda restrição limita a complexidade dos problemas que uma rede neural padrão pode resolver.
Ao usar uma rede neural para previsão de negociações, você tem muitos parâmetros com os quais você pode brincar e, se você não for cuidadoso, produza muitos tipos de seleção:
Número de camadas ocultas Número de neurônios por camada oculta Número de ciclos de backpropagation, épocas nomeadas Taxa de aprendizado, a largura do passo de uma Momência de época, um fator de inércia para a função de ativação da adaptação de pesos.
A função de ativação emula o limite de perceptron. Para o backpropagation você precisa de uma função continuamente diferenciável que gere um & # 8216; soft & # 8217; passo com um certo valor x. Normalmente, é utilizada uma função sigmoide, tanh ou softmax. Às vezes, também é uma função linear que apenas retorna a soma ponderada de todas as entradas. Nesse caso, a rede pode ser usada para regressão, para prever um valor numérico em vez de um resultado binário.
As redes neurais estão disponíveis na instalação R padrão (nnet, uma única rede de camada oculta) e em muitos pacotes, por exemplo RSNNS e FCNN4R.
6. Aprendizagem profunda.
Métodos de aprendizado profundo usam redes neurais com muitas camadas ocultas e milhares de neurônios, que não podem ser treinados de forma efetiva por backpropagation convencional. Vários métodos tornaram-se populares nos últimos anos para treinar tais redes enormes. Eles costumam pré-treinar as camadas do neurônio escondido para alcançar um processo de aprendizagem mais eficaz. Uma Máquina Boltzmann Restrita (RBM) é um algoritmo de classificação não supervisionado com uma estrutura de rede especial que não possui conexões entre os neurônios ocultos. Um auto-codificador esparso (SAE) usa uma estrutura de rede convencional, mas pré-treina as camadas ocultas de forma inteligente, reproduzindo os sinais de entrada nas saídas da camada com o menor número possível de conexões ativas. Esses métodos permitem redes muito complexas para lidar com tarefas de aprendizagem muito complexas. Como bater o melhor jogador humano do mundo.
As redes de aprendizagem profunda estão disponíveis nos pacotes Deepnet e Darch R. Deepnet fornece um autoencoder, Darch uma máquina Boltzmann restrito. Eu ainda não experimentei com o Darch, mas aqui é um exemplo de script R usando o autoencoder Deepnet com 3 camadas ocultas para sinais comerciais através da função neural () do Zorro & # 8217;
7. Suporte máquinas vetoriais.
Como uma rede neural, uma máquina de vetor de suporte (SVM) é outra extensão da regressão linear. Quando olhamos novamente para a fórmula de regressão,
podemos interpretar os recursos x n como coordenadas de um espaço de recursos n-dimensional. Definir a variável de destino y para um valor fixo determina um plano nesse espaço, chamado de hiperplane, pois possui mais de duas dimensões (na verdade, n-1). O hiperplane separa as amostras com y & gt; o das amostras com y & lt; 0. Os coeficientes a n podem ser calculados de forma a que as distâncias do plano para as amostras mais próximas # 8211; que são chamados de & # 8216; vetores de suporte & # 8217; do plano, daí o nome do algoritmo & # 8211; é o máximo. Desta forma, temos um classificador binário com a separação ideal de amostras vencedoras e perdidas.
O problema: normalmente, essas amostras não são linearmente separáveis e # 8211; Eles estão espalhados irregularmente no espaço de recursos. Nenhum avião plano pode ser espremido entre vencedores e perdedores. Se pudesse, tínhamos métodos mais simples para calcular esse avião, f. i. análise discriminante linear. Mas, no caso comum, precisamos do truque SVM: adicionando mais dimensões ao espaço de recursos. Para isso, o algoritmo SVM produz mais recursos com uma função kernel que combina dois preditores existentes para um novo recurso. Isso é análogo ao passo acima, desde a regressão simples até a regressão polinomial, onde também são adicionados mais recursos, levando o único preditor ao n-ésimo poder. Quanto mais dimensões você adiciona, mais fácil é separar as amostras com um hiperplano plano. Este plano é então transformado de volta para o espaço n-dimensional original, ficando enrugado e amassado no caminho. Através da seleção inteligente da função kernel, o processo pode ser executado sem realmente calcular a transformação.
À semelhança das redes neurais, os SVMs podem ser utilizados não apenas para classificação, mas também para regressão. Eles também oferecem alguns parâmetros para otimizar e possivelmente superar o processo de previsão:
Função Kernel. Você normalmente usa um kernel RBF (função de base radial, um kernel simétrico), mas você também tem a escolha de outros kernels, como sigmoid, polynomial e linear. Gamma, a largura do kernel RBF Custo parâmetro C, & # 8216; penalidade & # 8217; para classificações erradas nas amostras de treino.
Um SVM usado frequentemente é a biblioteca libsvm. Ele também está disponível em R no pacote e1071. Na próxima e última parte desta série, planejo descrever uma estratégia comercial usando este SVM.
8. K-vizinho mais próximo.
Comparado com as coisas pesadas de ANN e SVM, esse é um bom algoritmo simples com uma propriedade única: não precisa de treinamento. Então as amostras são o modelo. Você poderia usar esse algoritmo para um sistema comercial que aprenda permanentemente simplesmente adicionando mais e mais amostras. O algoritmo vizinho mais próximo calcula as distâncias no espaço de recursos dos valores de recurso atuais para as amostras mais próximas do k. Uma distância no espaço n-dimensional entre dois conjuntos de recursos (x 1 .. x n) e (y 1 .. y n) é calculada exatamente como em 2 dimensões:
O algoritmo simplesmente prediz o alvo da média das k variáveis alvo das amostras mais próximas, ponderadas por suas distâncias inversas. Pode ser usado para classificação, bem como para regressão. Os truques de software emprestados a partir de gráficos de computador, como uma árvore binária adaptativa (ABT), podem fazer com que o vizinho mais próximo busque muito rápido. Na minha vida passada como programador de jogos de computador, usamos esses métodos em jogos para tarefas como inteligência inimiga de auto-aprendizagem. Você pode chamar a função knn em R para a previsão do vizinho mais próximo e # 8211; ou escreva uma função simples em C para esse propósito.
Este é um algoritmo de aproximação para classificação não supervisionada. Tem alguma semelhança, não apenas com o nome, com o vizinho mais próximo. Para classificar as amostras, o algoritmo primeiro coloca k pontos aleatórios no espaço de recursos. Em seguida, atribui a qualquer um desses pontos todas as amostras com as menores distâncias a ele. O ponto é então movido para a média dessas amostras mais próximas. Isso gerará uma nova atribuição de amostras, uma vez que algumas amostras estão agora mais próximas de outro ponto. O processo é repetido até a atribuição não mudar mais movendo os pontos, isto é, cada ponto está exatamente na média das amostras mais próximas. Agora temos k classes de amostras, cada uma na vizinhança de um dos pontos k.
Este algoritmo simples pode produzir resultados surpreendentemente bons. Em R, a função kmeans faz o truque. Um exemplo do algoritmo k-means para classificar padrões de velas pode ser encontrado aqui: classificação de castiçal não supervisionada para diversão e lucro.
10. Naive Bayes.
Este algoritmo usa Bayes & # 8217; Teorema para classificar amostras de características não numéricas (isto é, eventos), como os padrões de vela acima mencionados. Suponha que um evento X (por exemplo, que o Open da barra anterior esteja abaixo do Open da barra atual) aparece em 80% de todas as amostras vencedoras. Qual é então a probabilidade de uma amostra estar ganhando quando contém evento X? Não é 0.8 como você pensa. A probabilidade pode ser calculada com Bayes & # 8217; Teorema:
P (Y | X) é a probabilidade de que o evento Y (f. i. winning) ocorra em todas as amostras contendo evento X (no nosso exemplo, Abrir (1) & lt; Abrir (0)). De acordo com a fórmula, é igual à probabilidade de X ocorrer em todas as amostras vencedoras (aqui, 0,8), multiplicado pela probabilidade de Y em todas as amostras (cerca de 0,5 quando você seguiu meu conselho acima de amostras equilibradas) e dividido por a probabilidade de X em todas as amostras.
Se somos ingênuos e assumimos que todos os eventos X são independentes um do outro, podemos calcular a probabilidade geral de que uma amostra ganhe simplesmente multiplicando as probabilidades P (X | winning) para cada evento X. Desta forma, acabamos com esta fórmula:
com um fator de escala s. Para que a fórmula funcione, os recursos devem ser selecionados de forma que sejam o mais independentes possível, o que impõe um obstáculo ao uso de Naive Bayes na negociação. Por exemplo, os dois eventos fecham (1) & lt; Fechar (0) e Abrir (1) & lt; Open (0) provavelmente não são independentes um do outro. Os preditores numéricos podem ser convertidos em eventos dividindo o número em intervalos separados.
O algoritmo Naive Bayes está disponível no omnipresente pacote e1071 R.
11. Árvores de decisão e regressão.
Essas árvores predizem um resultado ou um valor numérico com base em uma série de decisões sim / não, em uma estrutura como os ramos de uma árvore. Qualquer decisão é a presença de um evento ou não (no caso de características não numerais) ou uma comparação de um valor de recurso com um limite fixo. Uma função de árvore típica, gerada pelo construtor de árvores do Zorro & # 8217; parece assim:
Como uma tal árvore é produzida a partir de um conjunto de amostras? Existem vários métodos; Zorro usa a entropia Shannon i nformation, que já teve uma aparição neste blog no artigo Scalping. No começo, verifica um dos recursos, digamos x 1. Coloca um hiperplano com a fórmula plana x 1 = t no espaço da característica. Este hiperplato separa as amostras com x 1 & gt; t das amostras com x 1 & lt; t. O limite de divisão t é selecionado de modo que o ganho de informação & # 8211; a diferença de entropia de informação de todo o espaço, a soma das entropias de informação dos dois sub-espaços divididos e # 8211; é o máximo. Este é o caso quando as amostras nos subespaços são mais parecidas entre si que as amostras em todo o espaço.
Este processo é então repetido com o próximo recurso x 2 e dois hiperplanos dividindo os dois subespaços. Cada divisão é equivalente a uma comparação de um recurso com um limite. Por fraccionamento repetido, logo obteremos uma enorme árvore com milhares de comparações de limiar. Em seguida, o processo é executado para trás pela poda da árvore e remoção de todas as decisões que não levam a um aumento substancial de informações. Finalmente, acabamos com uma árvore relativamente pequena como no código acima.
As árvores de decisão possuem uma ampla gama de aplicações. Eles podem produzir excelentes previsões superiores às das redes neurais ou às máquinas de vetor de suporte. Mas eles não são uma solução única, já que seus planos de divisão são sempre paralelos aos eixos do espaço de recursos. Isso limita um pouco suas previsões. Eles podem ser usados não só para classificação, mas também para regressão, por exemplo, retornando a porcentagem de amostras que contribuem para um determinado ramo da árvore. A árvore do Zorro é uma árvore de regressão. O algoritmo de árvore de classificação mais conhecido é C5.0, disponível no pacote C50 para R.
Para melhorar a previsão ainda mais ou superar a limitação do eixo paralelo, um conjunto de árvores pode ser usado, chamado floresta aleatória. A previsão é então gerada pela média ou votação das previsões das árvores individuais. As florestas aleatórias estão disponíveis em pacotes R randomForest, ranger e Rborist.
Conclusão.
Existem vários métodos diferentes de mineração de dados e aprendizagem de máquinas à sua disposição. A questão crítica: o que é melhor, uma estratégia de aprendizagem baseada em modelos ou a máquina? Não há dúvida de que o aprendizado automático da máquina tem muitas vantagens. Você não precisa se preocupar com a microestrutura do mercado, a economia, a psicologia do comerciante ou coisas suaves semelhantes. Você pode se concentrar na matemática pura. O aprendizado de máquina é uma maneira muito mais elegante e atraente de gerar sistemas de comércio. Ele tem todas as vantagens do seu lado, mas um. Apesar de todos os tópicos entusiasmados nos fóruns de comerciantes, ele tende a falhar misteriosamente na negociação ao vivo.
A cada segunda semana, um novo artigo sobre comércio com métodos de aprendizagem de máquinas é publicado (alguns podem ser encontrados abaixo). Pegue todas essas publicações com um grão de sal. De acordo com alguns papéis, as taxas de ganhos fantásticos na faixa de 70%, 80% ou mesmo 85% foram alcançadas. Embora a taxa de ganhos não seja o único critério relevante & # 8211; você pode perder mesmo com uma alta taxa de vitória e # 8211; 85% de precisão na previsão de trades é normalmente equivalente a um fator de lucro acima de 5. Com esse sistema, os cientistas envolvidos devem ser bilionários enquanto isso. Infelizmente, eu nunca consegui reproduzir as taxas de vitórias com o método descrito, e nem chegou perto. Então, talvez um monte de viés de seleção tenha entrado nos resultados. Ou talvez eu seja muito estúpido.
Em comparação com as estratégias baseadas em modelos, eu não vi muitos sistemas de aprendizado de máquina bem sucedidos até agora. E do que se ouve sobre os métodos algorítmicos por hedge funds bem-sucedidos, a aprendizagem por máquinas parece ainda raramente ser usada. Mas talvez isso mude no futuro com a disponibilidade de mais poder de processamento e a próxima de novos algoritmos para aprendizagem profunda.
Classificação usando redes neurais profundas: Dixon. et. al.2018 Previsão de direção de preço usando ANN & amp; SVM: Kara. et. al.2018 Comparação empírica de algoritmos de aprendizagem: Caruana. et. al.2006 Tendência do mercado de ações de mineração com GA & amp; SVM: Yu. Wang. Lai.2005.
A próxima parte desta série tratará do desenvolvimento prático de uma estratégia de aprendizado de máquinas.
30 pensamentos sobre & ldquo; Better Strategies 4: Machine Learning & rdquo;
Bela postagem. Existe uma grande quantidade de potencial nessa abordagem em relação ao mercado.
Btw você está usando o editor de código que vem com zorro? como é possível obter essa configuração de cor?
O script colorido é produzido pelo WordPress. Você não pode mudar as cores no editor do Zorro, mas você pode substituí-lo por outros editores que suportem cores individuais, por exemplo Notepad ++.
É então possível que o bloco de notas detecte as variáveis zorro nos scripts? Quero dizer que o BarPeriod é comentado como está com o editor zorro?
Teoricamente sim, mas para isso você precisou configurar o destaque de sintaxe do Notepad ++ e digitar todas as variáveis na lista. Tanto quanto eu sei, o Notepad ++ também não pode ser configurado para exibir a descrição da função em uma janela, como faz o editor Zorro. Não existe uma ferramenta perfeita e # 8230;
Conforme o último parágrafo. Eu tentei muitas técnicas de aprendizado de máquina depois de ler vários & # 8216; peer reviewed & # 8217; papéis. Mas reproduzir seus resultados permanece indescritível. Quando eu vivo teste com ML, eu não posso parecer melhorar a entrada aleatória.
ML falha ao vivo? Talvez o treinamento do ML tenha que ser feito com dados de preços que incluam também o spread histórico, roll, tick e assim por diante?
Eu acho que o motivo # 1 para falha ao vivo é o viés de mineração de dados, causado por seleção tendenciosa de entradas e parâmetros para o algo.
Obrigado ao autor pela grande série de artigos.
No entanto, deve-se notar que não precisamos restringir nossa visão ao prever apenas o próximo movimento de preços. Pode acontecer que o próximo movimento vá contra o nosso comércio em 70% dos casos, mas ainda vale a pena fazer um comércio. Isso acontece quando o preço finalmente vai para a direção certa, mas antes disso pode fazer alguns passos contra nós. Se atrasarmos o comércio por um passo de preço, não entraremos nos 30% mencionados das negociações, mas para isso aumentamos o resultado do passo de preço de 70% por um preço. Portanto, o critério é qual o valor mais alto: N * average_result ou 0.7 * N * (avergae_result + price_step).
Bela postagem. Se você quiser apenas brincar com alguma aprendizagem de máquinas, implementei uma ferramenta ML muito simples em python e adicionei uma GUI. É implementado para prever séries temporais.
Obrigado JCL Achei muito interessante o seu artigo. Gostaria de perguntar-lhe, a partir da sua experiência em negociação, onde podemos transferir dados históricos confiáveis de forex? Eu considero isso muito importante devido ao fato de o mercado Forex estar descentralizado.
Desde já, obrigado!
Não há dados de Forex realmente confiáveis, uma vez que todo corretor de Forex cria seus próprios dados. Todos eles diferem ligeiramente dependentes de quais provedores de liquidez eles usam. FXCM tem relativamente bom M1 e marca dados com poucas lacunas. Você pode baixá-lo com o Zorro.
Obrigado por escrever uma série tão grande de artigos JCL & # 8230; uma leitura completamente agradável!
Tenho que dizer, porém, que não considero as estratégias de aprendizado de máquinas baseadas em modelo e mutuamente exclusivas; Eu tive algum sucesso de OOS usando uma combinação dos elementos que você descreve.
Para ser mais exato, eu começo o processo de geração do sistema, desenvolvendo um & # 8216; tradicional & # 8217; modelo matemático, mas, em seguida, use um conjunto de algoritmos de aprendizagem de máquinas on-line para prever os próximos termos das várias séries temporais diferentes (e não o próprio preço) que são usadas dentro do modelo. As regras de negociação reais são então derivadas das interações entre essas séries temporais. Então, na essência, não estou apenas atirando cegamente os dados de mercado recentes em um modelo de ML em um esforço para prever a direção de ação de preço, mas sim desenvolver uma estrutura baseada em princípios de investimento sólidos para apontar os modelos na direção certa. Então, os dados minam os parâmetros e medem o nível de viés de mineração de dados como você também descreveu.
Vale a pena mencionar, no entanto, que eu nunca tive muito sucesso com o Forex.
De qualquer forma, a melhor sorte com sua negociação e mantenha os ótimos artigos!
Obrigado por publicar esta ótima série mini JCL.
Recentemente, estudei alguns últimos artigos sobre ML trading, profundamente aprendendo especialmente. No entanto, descobri que a maioria deles avaliou os resultados sem índice ajustado ao risco, ou seja, eles costumavam usar a curva ROC, PNL para suportar sua experiência, em vez de Sharpe Ratio, por exemplo.
Além disso, raramente mencionaram a frequência comercial nos resultados da experiência, tornando difícil avaliar a rentabilidade potencial desses métodos. Por que é que? Você tem boas sugestões para lidar com essas questões?
Os papéis ML normalmente visam uma alta precisão. A variação da curva de capital não é de interesse. Isso é justificado porque a qualidade de predição ML determina a precisão, e não a variação.
Claro, se você quer realmente negociar esse sistema, a variação e a retirada são fatores importantes. Um sistema com menor precisão e pior previsão pode de fato ser preferível quando é menos dependente das condições de mercado.
& # 8220; De fato, o método de mineração de dados mais popular e surpreendentemente lucrativo funciona sem redes neurais sofisticadas ou máquinas de vetor de suporte. & # 8221;
Você gostaria de nomear aqueles mais populares? surpreendentemente lucrativos. Então eu poderia usá-los diretamente.
Eu estava me referindo às estratégias de sopa de indicadores. Por razões óbvias, não posso divulgar detalhes de tal estratégia e nunca desenvolvi esses sistemas. Nós simplesmente codificamos. Mas eu posso dizer que chegar com uma sopa Indicadora rentável requer muito trabalho e tempo.
Bem, estou apenas começando um projeto que usa EMAs simples para prever o preço, ele apenas seleciona os EMAs corretos com base no desempenho passado e na seleção de algoritmos que fazem algum grau rústico de inteligência.
Jonathan. orrego@gmail oferece serviços como programador MT4 EA.
Obrigado pelo bom writeup. Na realidade, costumava ser uma conta de lazer.
Olhe complicado para mais entregues agradável de você!
Falando nisso, como podemos entrar em contato?
Há problemas a seguir com ML e com sistemas de negociação em geral baseados na análise de dados históricos:
1) Os dados históricos não codificam informações sobre futuros movimentos de preços.
O movimento futuro dos preços é independente e não está relacionado com o histórico de preços. Não há absolutamente nenhum padrão confiável que possa ser usado para extrair os lucros do mercado de maneira sistemática. Aplicar métodos ML neste domínio é simplesmente inútil e condenado ao fracasso e não vai funcionar se você procurar um sistema lucrativo. Claro que você pode ajustar a curva em qualquer período passado e criar um sistema lucrativo para isso.
The only thing which determines price movement is demand and supply and these are often the result of external factors which cannot be predicted. For example: a war breaks out somewhere or other major disaster strikes or someone just needs to buy a large amount of a foreign currency for some business/investment purpose. These sort of events will cause significant shifts in the demand supply structure of the FX market . As a consequence, prices begin to move but nobody really cares about price history just about the execution of the incoming orders. An automated trading system can only be profitable if it monitors a significant portion of the market and takes the supply and demand into account for making a trading decision. But this is not the case with any of the systems being discussed here.
2) Race to the bottom.
Even if (1) wouldn’t be true and there would be valuable information encoded in historical price data, you would still face following problem: there are thousands of gold diggers out there, all of them using similar methods and even the same tools to search for profitable systems and analyze the same historical price data. As a result, many of them will discover the same or very similar “profitable” trading systems and when they begin actually trading those systems, they will become less and less profitable due to the nature of the market.
The only sure winners in this scenario will be the technology and tool vendors.
I will be still keeping an eye on your posts as I like your approach and the scientific vigor you apply. Your blog is the best of its kind – keep the good work!
One hint: there are profitable automated systems, but they are not based on historical price data but on proprietary knowledge about the market structure and operations of the major institutions which control these markets. Let’s say there are many inefficiencies in the current system but you absolutely have no chance to find the information about those by analyzing historical price data. Instead you have to know when and how the institutions will execute market moving orders and front run them.
Thanks for the extensive comment. I often hear these arguments and they sound indeed intuitive, only problem is that they are easily proven wrong. The scientific way is experiment, not intuition. Simple tests show that past and future prices are often correlated – otherwise every second experiment on this blog had a very different outcome. Many successful funds, for instance Jim Simon’s Renaissance fund, are mainly based on algorithmic prediction.
One more thing: in my comment I have been implicitly referring to the buy side (hedge funds, traders etc) not to the sell side (market makers, banks). The second one has always the edge because they sell at the ask and buy at the bid, pocketing the spread as an additional profit to any strategy they might be running. Regarding Jim Simon’s Renaissance: I am not so sure if they have not transitioned over the time to the sell side in order to stay profitable. There is absolutely no information available about the nature of their business besides the vague statement that they are using solely quantitative algorithmic trading models…
Thanks for the informative post!
Regarding the use of some of these algorithms, a common complaint which is cited is that financial data is non-stationary…Do you find this to be a problem? Couldn’t one just use returns data instead which is (I think) stationary?
Yes, this is a problem for sure. If financial data were stationary, we’d all be rich. I’m afraid we have to live with what it is. Returns are not any more stationary than other financial data.
Hello sir, I developed some set of rules for my trading which identifies supply demand zones than volume and all other criteria. Can you help me to make it into automated system ?? If i am gonna do that myself then it can take too much time. Please contact me at svadukia@gmail if you are interested.
Sure, please contact my employer at info@opgroup. de. They’ll help.
I have noticed you don’t monetize your page, don’t waste your traffic,
you can earn extra bucks every month because you’ve got high quality content.
If you want to know how to make extra $$$, search for: Mrdalekjd methods for $$$
Technical analysis has always been rejected and looked down upon by quants, academics, or anyone who has been trained by traditional finance theories. I have worked for proprietary trading desk of a first tier bank for a good part of my career, and surrounded by those ivy-league elites with background in finance, math, or financial engineering. I must admit none of those guys knew how to trade directions. They were good at market making, product structures, index arb, but almost none can making money trading directions. Por quê? Because none of these guys believed in technical analysis. Then again, if you are already making your millions why bother taking the risk of trading direction with your own money. For me luckily my years of training in technical analysis allowed me to really retire after laying off from the great recession. I look only at EMA, slow stochastics, and MACD; and I have made money every year since started in 2009. Technical analysis works, you just have to know how to use it!!
Random forest trading strategy
Obter através da App Store Leia esta publicação em nosso aplicativo!
Usage of Random forests in Quantitative analysis of stocks.
I have a question about Random forests and how they could be utilized in trading? I heard Random forests are used for classification, is that accurate? If so, could someone give an example of what sort of classification does it help with?
If not, what are Random forests used for in Quant finance?
I have not used random forests myself but I know of a guy who applied this classification technique to machine learning algorithms applied to pattern recognition.
Thus I think its advantages over classic regression approaches can be applied to discern patterns in financial data, though I get the impression that it vastly overfits the data and thus you end up with the classical trade-off that many quants are faced with.
I also read that it is used by the SEC where they apply it in their quest to analyze trading patterns to flag insider trading violations.
Recently I attended a presentation by the first author of the following paper who gave us quite a creative and illuminating (kind of meta-)use of random forests in Quant Finance:
by Thomas Wiecki, Andrew Campbell, Justin Lent, Jessica Stauth (all Quantopian)
When automated trading strategies are developed and evaluated using backtests on historical pricing data, there exists a tendency to overfit to the past. Using a unique dataset of 888 algorithmic trading strategies developed and backtested on the Quantopian platform with at least 6 months of out-of-sample performance, we study the prevalence and impact of backtest overfitting. Specifically, we find that commonly reported backtest evaluation metrics like the Sharpe ratio offer little value in predicting out of sample performance (R² < 0.025). In contrast, higher order moments, like volatility and maximum drawdown, as well as portfolio construction features, like hedging, show significant predictive value of relevance to quantitative finance practitioners. Moreover, in line with prior theoretical considerations, we find empirical evidence of overfitting – the more backtesting a quant has done for a strategy, the larger the discrepancy between backtest and out-of-sample performance. Finally, we show that by training non-linear machine learning classifiers on a variety of features that describe backtest behavior, out-of-sample performance can be predicted at a much higher accuracy (R² = 0.17) on hold-out data compared to using linear, univariate features. A portfolio constructed on predictions on hold-out data performed significantly better out-of-sample than one constructed from algorithms with the highest backtest Sharpe ratios.
So what they basically did was to take all kinds of real quant trading algos and asked the old EMH question whether in sample performance has any predictive power for out of sample performance. They calculated all kinds of measures for these algos and used them (and combinations thereof) to predict the out of sample performance. Then they extracted the most important features from the random forest model - the following picture is taken from the paper (p. 9)
As with many machine learning technologies, you can run a separate training and testing phase before deploying it live for prediction. All it does is build a collection of decision trees based on the parameters you give it - if the output field is a factor, you get classification (a finite enumerated set of values); if it's numeric, you get prediction. One approach might be to add a column forwhether a commodity reaches a given profit level within an affordable time period; the random forest can then build a logic to correlate that against all the other input columns (such as technical indicators, etc).
A while ago I have implemented a binary fuzzy decision tree forest to classify credit applications as a semesters project.
Let's say a tree looks like this:
The benefits of decision tree techniques in general are:
Comprehensibility : The paths down the tree have a direct interpretation: "If condition C1 and condition C11 then X". For example "If debt>0 and income == 0 then no_credit." Expert knowledge : It is possible to change the trees based on background knowledge. Extensibility : It is possible to include other classification tools at the nodes, for example you could have a neural network which detects trends and then go down the tree depending on the output of the network.
Decicion tree forests have additional benefits:
Adaptation : If the problem splits into several domains, the trees can fit to their region more closely. Smaller trees : The trees can be restricted to much smaller size, which makes them easier to understand. Confidence information : If a lot of the trees in the forrest vote for the same classification, this can be seen as a measure of confidence.
On the downside forests can be much more expensive to compute and manage. Also, whereas a single tree can avoid overfitting by using standard pruning techniques, there does not seem to be concensus which is the best approach for forrests, yet.
Any application of machine learning techniques this approach is only as good as the data and the indicators used to train it on.
Interesting papers include.
It could help with things like fraud detection, analysis of bankruptcy probability, default risk, unsupervised learning for qualitative/descriptive purposes, or for a purely backwards looking supervised analysis on returns again for descriptive/understanding purposes (variable important, etc, perhaps impulse response analysis).
It may also be good at forecasting low-frequency volatility which is well known to be easy to forecast; intuitively this works because it is likely to be combinations of events that cause very high volatility which is difficult to incorporate into a GARCH variance equation. You could just rely on the forest to learn regimes, breaks, etc (consider a dynamic forest).
To be more precise, random forests work by building multiple trees by using sample with replacement from the same training data. Each tree is also built using a random subset of the features (attributes). Pruning is usually done for each tree before its inclusion. Hypothesis values are a result of averaging over all trees. One of the primary uses of random forests is the reduction of variance. If bias is the problem, then one should use boosting (Adaboost).
check out this paper: "Predicting the direction of stock market prices using random forest" Luckyson Khaidem Snehanshu Saha Sudeepa Roy Dey, Applied Mathematical Finance.
These have been combined into a single paper which also talks about specific stocks from Big pharma companies. Email me if you need that.
You can find an Excel and VBA implementation of Random Forest using the open source ALGLIB Libary here.
QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
By Michael Halls-Moore on November 28th, 2018.
In a previous article the decision tree (DT) was introduced as a supervised learning method. In the article it was mentioned that the real power of DTs lies in their ability to perform extremely well as predictors when utilised in a statistical ensemble .
In this article it will be shown how combining multiple DTs in a statistical ensemble will vastly improve the predictive performance on the combined model. These statistical ensemble techniques are not limited to DTs, but are in fact applicable to many regression and classification machine learning models. However, DTs provide a "natural" setting to discuss ensemble methods and they are often commonly associated together.
Once the theory of these ensemble methods has been discussed they will all be implemented in Python using the Scikit-Learn library on financial data. In subsequent articles it will be shown how to apply such ensemble methods in real trading strategies using the QSTrader framework.
If you lack familiarity with decision trees it is worth reading the introductory article first before delving into ensemble methods.
Before discussing the ensemble techniques of bootstrap aggegration , random forests and boosting it is necessary to outline a technique from frequentist statistics known as the bootstrap , which enables these techniques to work.
The Bootstrap.
Bootstrapping [1] is a statistical resampling technique that involves random sampling of a dataset with replacement . It is often used as a means of quantifying the uncertainty associated with a machine learning model.
For quantitative finance purposes bootstrapping is extremely useful since it allows generation of new samples from a population without having to go and collect additional "training data". In quantitative finance applications it is often impossible to generate more data in the case of financial asset pricing series as there is only one "history" to sample from.
The idea is to repeatedly sample data with replacement from the original training set in order to produce multiple separate training sets. These are then used to allow "meta-learner" or "ensemble" methods to reduce the variance of their predictions , thus greatly improving their predictive performance.
Two of the following ensemble techniques–bagging and random forests–make heavy use of bootstrapping techniques, and they will now be discussed.
Bootstrap Aggregation.
As was mentioned in the article on decision tree theory one of the main drawbacks of DTs is that they suffer from being high-variance estimators . This means that the addition of a small number of extra training observations can dramatically alter the prediction performance of a learned tree, despite the training data not changing to any great extent.
This is in contrast to a low-variance estimator such as linear regression, which is not hugely sensitive to the addition of extra points–at least those that are relatively close to the remaining points.
One way to mitigate against this problem is to utilise a concept known as bootstrap aggregation or bagging . The idea is to combine multiple leaners (such as DTs), which are all fitted on separate bootstrapped samples and average their predictions in order to reduce the overall variance of these predictions.
Por que isso funciona? James et al (2018) [2] point out that if $N$ independent and identically distributed (iid) observations $Z_1, \ldots, Z_N$ are given, each with a variance of $\sigma^2$ then the variance of the mean of the observations, $\bar $ is $\sigma^2 / N$. That is, if the average of these observations is taken the variance is reduced by factor equal to the number of observations.
However in quantitative finance datasets it is often the case that there is only one "training" set of data. This means it is difficult, if not impossible, to create multiple separate independent training sets. This is where The Bootstrap comes in, as it allows generation of multiple training sets all using one larger set.
Using the notation from James et al (2018) [2] and the Random Forest article at Wikipedia [3] , if $B$ separate bootstrapped samples of the training set are created, with separate model estimators $\hat ^b ( )$, then averaging these leads to a low-variance estimator model, $\hat _ >$:
This procedure is known as bagging [4] . It is highly applicable to DTs because they are high-variance estimators and this provides one mechanism to reduce the variance substantially.
Carrying out bagging for DTs is straightforward. Hundreds or thousands of deeply-grown (non-pruned) trees are created across $B$ bootstrapped samples of the training data. They are combined in the manner described above and significantly reduce the variance of the overall estimator.
One of the main benefits of bagging is that it is not possible to overfit the model solely by increasing the number of bootstrap samples, $B$. This is also true for random forests but not the method of boosting.
Unfortunately this gain in prediction accuracy comes at a price–significantly reduced interpretability of the model. However in quantitative trading research interpretability is often less important compared to raw prediction accuracy. Hence this is not too significant a drawback for algorithmic trading applications.
Note that there are specific statistical methods to deduce important variables in bagging, but they are beyond the scope of this article.
Random Forests.
Random forests [5] are very similar to the procedure of bagging except that they make use of a technique called feature bagging , which has the advantage of significantly decreasing the correlation between each DT and thus increasing its predictive accuracy, on average.
Feature bagging works by randomly selecting a subset of the $p$ feature dimensions at each split in the growth of individual DTs. This may sound counterintuitive, after all it is often desired to include as many features as possible initially in order to gain as much information for the model. However it has the purpose of deliberately avoiding (on average) very strong predictive features that lead to similar splits in trees (and thus increase correlation).
That is, if a particular feature is strong in predicting the response value then it will be selected for many trees. Hence a standard bagging procedure can be quite correlated. Random forests avoid this by deliberately leaving out these strong features in many of the grown trees.
If all $p$ values are chosen in splitting of the trees in a random forest ensemble then this simply corresponds to standard bagging. A rule-of-thumb for random forests is to use $\sqrt $ features, suitably rounded, at each split.
In the Python section below it will be shown how random forests compare to bagging in their performance as the number of DTs used as base estimators are increased.
Another general machine learning ensemble method is known as boosting . Boosting differs somewhat from bagging as it does not involve bootstrap sampling. Instead models are generated sequentially and iteratively, meaning that it is necessary to have information about model $i$ before iteration $i+1$ is produced.
Boosting was motivated by Kearns and Valiant (1989) [6] . The question posed asked whether it was possible to combine, in some fashion, a selection of weak machine learning models to produce a single strong machine learning model. Weak, in this instance means a model that is only slightly better than chance at predicting a response. Correspondingly, a strong learner is one that is well-correlated to the true response.
This motivated the concept of boosting. The idea is to iteratively learn weak machine learning models on a continually-updated training data set and then add them together to produce a final, strong learning model. This differs from bagging, which simply averages the models on separate bootstrapped samples.
The basic algorithm for boosting, which is discussed at length in James et al (2018) [2] and Hastie et al (2009) [7] , is given in the following:
Set the initial estimator to zero, that is $\hat ( ) = 0$. Also set the residuals to the current responses, $r_i = y_i$, for all elements in the training set. Set the number of boosted trees, $B$. Loop over $b=1,\ldots, B$: Grow a tree $\hat ^b$ with $k$ splits to training data $(x_i, r_i)$, for all $i$. Add a scaled version of this tree to the final estimator: $\hat ( ) \leftarrow \hat ( ) + \lambda \hat ^b ( )$ Update the residuals to account for the new model: $r_i \leftarrow r_i - \lambda \hat ^b (x_i)$ Set the final boosted model to be the sum of individual weak learners: $\hat ( ) = \sum_ ^B \lambda \hat ^b ( )$
Notice that each subsequent tree is fitted to the residuals of the data. Hence each subsequent iteration is slowly improving the overall strong learner by improving its performance in poorly-performing regions of the feature space.
It can be seen that this procedure is heavily dependent on the order in which the trees are grown. This process is said to "learn slowly". Such slow learning procedures tend to produce well-performing machine learning models. This is why ensemble algorithms involving boosted machine learning models tend to win many of the Kaggle competitions.
There are three hyperparameters to the boosting algorithm described above. Namely, the depth of the tree $k$, the number of boosted trees $B$ and the shrinkage rate $\lambda$. Some of these parameters can be set by cross-validation.
One of the computational drawbacks of boosting is that it is a sequential iterative method. This means that it cannot be easily parallelised, unlike bagging, which is straightforwardly parallelisable.
Many boosting algorithms exist, including AdaBoost, xgboost and LogitBoost. Prior to the increased prevalence of deep convolutional neural networks boosted trees often were (and still are!) some of the best "out of the box" classification tools in existence.
It will be shown how boosting compares with bagging, at least for the decision tree case, in the subsequent section.
Python Scikit-Learn Implementation.
In this section the above three ensemble methods will be applied to the task of predicting the daily returns for Amazon stock, using the prior three days of lagged returns data.
This is a challenging task, not least because liquid stocks such as Amazon have a low signal-to-noise ratio, but also because such data is serially correlated. This means that the samples chosen are not truly independent of each other, which can have unfortunate consequences for the statistical validity of the procedure.
In subsequent articles a more robust procedure will be carried out using the Scikit-Learn time series cross-validation mechanism. For now, a standard training-testing split will be used, as the focus in this article is on comparison of error across the models and not on the absolute error achieved on each.
The end result will be a plot of the Mean Squared Error (MSE) of each method (bagging, random forest and boosting) against the number of estimators used in the sample. It will be clearly shown that bagging and random forests do not overfit as the number of estimators increases, while AdaBoost significantly overfits.
As always the first task is to import the correct libraries and objects. For this task many modules are required, the majority of which are in the Scikit-Learn library. In particular the "usual suspects" are imported, namely Matplotlib, NumPy, Pandas and Seaborn for data analysis and plotting. In addition the BaggingRegressor , RandomForestRegressor and AdaBoostRegressor ensemble methods are all included. Finally the mean_squared_error metric, the train_test_split cross-validation tool, preprocessing tool and DecisionTreeRegressor itself are all imported:
The next task is to use Pandas to create the DataFrame of lagged values. This particular piece of code has been utilised widely in Successful Algorithmic Trading and in other articles on the site. Hence it will not be explained in depth. The main thrust is that it creates a DataFrame containing three days of lagged returns data from a particular Yahoo Finance asset time series (as well as the daily trading volume):
In the __main__ function the parameters are set. Firstly a random seed is defined to make the code replicable on other work environments. n_jobs controls the number of processor cores to use in bagging and random forests. Boosting is not parallelisable so does not make use of this parameter.
n_estimators defines the total number of estimators to use in the graph of the MSE, while the step_factor controls how granular the calculation is by stepping through the number of estimators. In this instance axis_step is equal to 1000/10 = 100. That is, 100 separate calculations will be performed for each of the three ensemble methods:
The following code downloads ten years worth of AMZN prices and converts them into a return series with lags using the above mentioned function create_lagged_series . Missing values are dropped (a consequence of the lag procedure) and the data is scaled to exist between -1 and +1 for ease of comparison. This latter procedure is common in machine learning and helps features with large differences in absolute sizes be comparable to the models:
The data is split into a training set and a test set, with 70% of the data forming the training data and the remaining 30% performing the test set. Once again, be aware that financial time series data is serially correlated and so this procedure will introduce some error by not accounting for it. However it serves the purpose for comparison across procedures in this article:
The following NumPy arrays store the number of estimators at each axis step, as well as the actual associated MSE for each of the three ensemble methods. They are all initially set to zero and are filled in subsequently:
The first ensemble method to be utilised is the bagging procedure. The code iterates over the total number of estimators (1 to 1000 in this case, with a step-size of 10), defines the ensemble model with the correct base model (in this case a regression decision tree), fits it to the training data and then calculates the Mean Squared Error on the test data. This MSE is then added to the bagging MSE array:
The same approach is carried out for random forests. Since random forests implicitly use a regression tree as their base estimators there is no need to specify it in the ensemble constructor:
Similarly for the AdaBoost boosting algorithm although n_jobs is not present due to the lack of parallelisability of boosting techniques. The learning rate, or shrinkage factor, $\lambda$ has been set to 0.01. Adjusting this value has a large impact on the absolute MSE calculated for each estimator total:
The final snippet of code simply plots these arrays against each other using Matplotlib, but with Seaborn's default colour scheme, which is more visually pleasing than the Matplotlib defaults:
The output is given in the following figure. It is very clear how increasing the number of estimators for the bootstrap-based methods (bagging and random forests) eventually leads to the MSE "settling down" and becoming almost identical between them. However, for the AdaBoost boosting algorithm it can be seen that as the number of estimators is increased beyond 100 or so, the method begins to significantly overfit.
Bagging, Random Forest and AdaBoost MSE comparison vs number of estimators in the ensemble.
When constructing a trading strategy based on a boosting ensemble procedure this fact must be borne in mind otherwise it is likely to lead to significant underperformance of the strategy when applied to out-of-sample financial data.
In a subsequent article ensemble models will be utilised to predict asset returns using QSTrader. It will be seen whether it is feasible to produce a robust strategy that can be profitable above the higher frequency transaction costs necessary to carry it out.
Referências.
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.
Forex Mecânico.
Negociação no mercado FX usando estratégias mecânicas de negociação.
Using R in trading: Building a Random Forest model to predict out of sample results.
Trying to predict which systems will come out as profitable under unknown future market conditionsВ is the holy grail of algorithmic trading. If you could generate systems across some span of data and then say with a good confidence which ones would be profitable you would be able to constantly reap profits from the markets without having to worry too much about whether your systems would survive or not. However doing this is extremely hard – as I discussed within a past post – so it is expected that coming up with such a model would be extremely hard if not outright impossible due to changes in market conditions. Today we are going to look at how this model creation can be carried out, we will talk about the results of the created models and we will also talk about what would be required to arrive at a model that may work. You can download the data used in today’s post here.
. , data = efTrain , ntree = 100 )
The first thing you need to do to generate such a model is to have tons of different trading results. You should use a trading system generator to achieve something like this, for example like the open source openKantu software. For today’s experiment I have generated 500+ systems using EUR/USD daily data from 1986 to 2018. The systems were generated across 10 years of data and then pseudo out of sample tested for the following year. Note that the 10 year generation period for each system was chosen randomly and the 1 year pseudo out of sample period was the period immediately following each system’s in-sample data. This randomization of the in-sample period is fundamental as otherwise you could be looking at predictability that is localized across some set of market conditions, which might not hold significantly. Say if you always generate systems using data from 2000-2018 and thenВ test for 2018, you could obtain a model that successfully predicts but only for those very specific conditions. All systems selected have an RВІ > 0.9 and a trading frequency above 10 trades/year across their in-sample period.
Once you get a set of systems generated under randomized in-sample periods the next step is to look at whether there are any relationships between the in-sample statistics and the pseudo out-of-sample results. Since we have many different statistics we can use random forests models to attempt to do this prediction as random forests are robust to high dimensionality and are not considerably hurt by having either duplicate or irrelevant variables. Granted any other machine learning model could be used for this purpose – with precautions specific to each case – but for today’s exercise we are going to be trying random forests. To create the random forests we use the randomForest R library and we then use ggplot to create our resulting graphs.
Another important thing to take into account is data splitting and model generation variability. When building this type of models you should always make sure you split your data into a training and a testing set to ensure that you have predicting ability outside of the data used to train the model. Traditionally you use most of the data – say 80% – for model building and then keep 20% for validation. Since this splitting is done randomly – attempting to preserve the distribution of the variable we want to predict between both sets – it is also important to do many split train/test sets and generate the model many times to ensure that your results were not spurious simply due to the way in which you split data sets and the random model generation but that you are indeed tackling a fundamental relationship between the variables.
Some average results obtain with the above data and randomForest models are showed above. As you can see the model behaves very well within the training set – where it achieves an amazing ability to predict p-OS results – but under the testing set the model simply falls appart as it is unable to predict the p-OS result correctly. Success in model predictions are often best seen in the extremes of the data set as failures to predict more extreme values suggest that the model is simply unable to grasp any real relationship between the variables. In this case the most extreme values in the testing set – which have real p-OS values of around 20K and -20K – totally fail to be predicted with the predicted values being close to 0. A hallmark of failing models is that they always end up predicting the average, with deviations increasing as the values become more extreme.
A look into the random forest training also reveals that training was carried out successfully, even though the number of trees used within the model is not significantly high. What happens here is basically what happens most of the time when trying to predict p-OS performance across any meaningful sample of systems, the in-sample variables are largely uncorrelated with the out-of-sample variables and any statistical variables related with the in-sample period appear to hold no predictive power. Of course the above is just an example of how this can be done using a sample data set and model type but the idea is that you design your own experiments and run your own attempts to attempt to see if you can indeed get to the holy grail and build a model that can adequately forecast p-OS performance. If you would like to learn more about algorithmic trading strategies and how you too can automatically create and trade systemsВ please consider joiningВ Asirikuy, a website filled with educational videos, trading systems, development and a sound, honest and transparent approach towards automated trading. strategies.
3 Responses to “Using R in trading: Building a Random Forest model to predict out of sample results”
Have you ever performed this test using models/systems that have passed your statistical standards?
Obrigado por escrever. Yes, I have performed this type of analysis using systems created according to our statistical standards. What we find is that the historical probability of positive pseudo OS performance is very high, but going further into predicting profit levels with any accuracy is something we have yet to achieve. So although the probability of positive pseudo OS performance might be say, 90% after 10 years, it is really not possible according to models like this to say which of the systems will be the ones to fail or how profitable the systems that work will actually be. I hope this answers your question,
How about : –analysing the trade results of the trading system for each frequency(Rhythmodynamics) with no time or price coordination.
)—calculating of the frequency response for a search of the profitable frequencies.
—-Creata a filter, based on profitable frequencies with minimum drawdown then compare it with price.
Using Machine Learning to Predict Out-Of-Sample Performance of Trading Algorithms.
By Dr. Thomas Wiecki, Lead Data Scientist at Quantopian.
Earlier this year, we used DataRobot to test a large number of preprocessing, imputation and classifier combinations to predict out-of-sample performance. In this blog post, I’ll take some time to first explain the results from a unique data set assembled from strategies run on Quantopian. From these results, it became clear that while the Sharpe ratio of a backtest was a very weak predictor of the future performance of a trading strategy, we could instead use DataRobot to train a classifier on a variety of features to predict out-of-sample performance with much higher accuracy.
What is Backtesting?
Backtesting is ubiquitous in algorithmic trading. Quants run backtests to assess the merit of a strategy, academics publish papers showing phenomenal backtest results, and asset allocators at hedge funds take backtests into account when deciding where to deploy capital and who to hire. This makes sense if (and only if) a backtest is predictive of future performance. Mas é isso?
This question is actually of critical importance to Quantopian. As we announced at QuantCon 2018, we have started to deploy some of our own capital to a select number of trading strategies. We found these algorithms by analyzing thousands of algorithms by using only pyfolio, our open source finance analysis library. As a data scientist, it is my job to come up with better (and more automatic) methods to identify promising trading algorithms.
What makes this possible (and a whole lot of fun) is that we have access to a unique dataset of millions of backtests being run on the Quantopian platform. While our terms-of-use prohibit us from looking at code, we do know when code was last edited. Knowing this, we can rerun the strategy up until yesterday and evaluate how the strategy continued to perform after the last code, meaning how it performed on data the quant did not have access to at the time of writing the code. Using this approach, we were able to assemble a data set of 888 strategies based on various criteria with at least 6 months of out-of-sample data.
The first thing I looked at was how predictive the backtest or in-sample (IS) Sharpe ratio was of the out-of-sample (OOS) Sharpe ratio:
With a disappointing R²=0.02, this shows that we can’t learn much about how well a strategy will continue to perform from a backtest. This is a real problem and might cause us to throw our hands in the air and give up. Instead, we wondered if perhaps all the other information we have about an algorithm (like other performance metrics, or position and transactions statistics) would allow us to do a better job.
Using Machine Learning to Predict Out-Of-Sample Performance.
Our team created 58 features based on backtest results, including:
Tail-ratio (the 95th percentile divided by the 5th percentile of the daily returns distribution) Average monthly turnover, how many backtests a user ran (which is indicative of overfitting) The minimum, maximum and standard deviation of the rolling Sharpe ratio …and many more (for a full list, see our SSRN manuscript ).
We then tried various machine learning techniques to try and predict out-of-sample Sharpe ratio based on these features. This is where DataRobot came in really handy . We uploaded our data set to DataRobot and from there, a huge combination of preprocessing, feature extraction, and regressors were tried in a cross-validated manner in parallel. Most of these could be done using scikit-learn, but it is a huge time saver and produced results better than my own humble attempts.
Using an ExtraTrees regressor (similar to a Random Forest), DataRobot achieved an R² of 0.17 on the 20% hold-out set not used for training. The lift-chart below shows that the regressor does a pretty good job at predicting OOS Sharpe ratio.
While it is generally difficult to intuit what the machine learning regressor has learned, we can look at which features it identified as most predictive. Of note, an important feature does not have to be predictive by itself or in relation to an OOS Sharpe ratio in a linear way. These methods are so powerful because they can learn extremely complex, nonlinear interactions of multiple features that are predictive in the aggregate.
Below you can appreciate the most informative feature.
It is interesting to point out that tail-ratio and kurtosis are both measures that assess the tails of the returns distribution. Moreover, the number of backtests a user ran (“user_backtest_days”) is also very informative of how a strategy will perform going forward.
While we showed that we can do a much better job at predicting an OOS Sharpe ratio than using only the backtest Sharpe ratio, it is not clear yet if this really makes a difference in reality. After all, no one earns money from a good R² value. We then asked if a portfolio constructed from the 10 strategies ranked highest by our machine learning regressor would do well. We compared this to selecting the top 10 strategies ranked by their in-sample Sharpe ratio as well as many simulations of choosing 10 strategies randomly.
The below image shows our results when applying this portfolio construction method on the hold-out set.
Future Outlook.
We found it interesting that even at highly quantitative hedge funds, asset allocation is still done in a discretionary way, at least for the most part. I believe that a long-term goal for this research would be to further automate this aspect using Machine Learning, as depicted in the figure below.
It would also be useful to look more at the OOS data. Usually, deployment decisions aren’t done on backtest performance alone. At Quantopian, we require at least 6 months of OOS data. This number is rather arbitrary, however, and there might be strategies where we gain confidence more quickly, and ones where we would need to wait longer.
For more on how we approached comparing backtest and out-of-sample performance on cohort algorithms and how we found the best results were achieved with DataRobot, you can view the full report of our test here. You can also view my presentation on this subject from Quantcon here.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.
Can this be run within the online Quantopian platform? Or would zipline need to be used?
Comentários estão fechados.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, uma solicitação de compra ou uma recomendação ou endosso para qualquer segurança ou estratégia, nem constitui uma oferta de prestação de serviços de consultoria de investimento pela Quantopian.
Além disso, o material não oferece nenhuma opinião em relação à adequação de qualquer segurança ou investimento específico. Nenhuma informação contida neste documento deve ser considerada como uma sugestão para se envolver ou abster-se de qualquer curso de ação relacionado ao investimento, já que nenhuma das empresas atacadas ou nenhuma das suas afiliadas está a comprometer-se a fornecer conselhos de investimento, atuar como conselheiro de qualquer plano ou entidade sujeito a A Lei de Segurança de Renda de Aposentadoria do Empregado de 1974, conforme alterada, conta de aposentadoria individual ou anuidade de aposentadoria individual, ou dar conselhos em capacidade fiduciária em relação aos materiais aqui apresentados. Se você é um aposentadorio individual ou outro investidor, entre em contato com seu consultor financeiro ou outro fiduciário não relacionado a Quantopian sobre se qualquer idéia, estratégia, produto ou serviço de investimento descrito aqui pode ser apropriado para suas circunstâncias. Todos os investimentos envolvem risco, incluindo perda de principal. A Quantopian não oferece garantias sobre a precisão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas.
O material deste site é fornecido apenas para fins informativos e não constitui uma oferta de venda, solicitação de compra ou recomendação ou endosso para qualquer garantia ou estratégia, nem constitui uma oferta para fornecer consultoria de investimento ou outros serviços por meio de Quantopian. Além disso, o conteúdo do site não oferece nenhuma opinião em relação à adequação de qualquer garantia ou qualquer investimento específico.
A Quantopian não oferece garantias quanto à exatidão ou integridade das opiniões expressas no site. Os pontos de vista estão sujeitos a alterações e podem ter se tornado pouco confiáveis por vários motivos, incluindo mudanças nas condições do mercado ou nas circunstâncias econômicas. Todos os investimentos envolvem risco - incluindo perda de principal. Você deve consultar um profissional de investimentos antes de tomar decisões de investimento.
No comments:
Post a Comment