Friday, 2 February 2018

Sistema de comércio svm


Quintuitiva.


Visualizações Quantitativamente Intuitivas sobre Mercados.


Negociação com máquinas de vetor de suporte (SVM)


Finalmente, todas as estrelas se alinharam e posso dedicar com confiança algum tempo para back-testing de novos sistemas de negociação, e Support Vector Machines (SVM) são o novo & # 8220; toy & # 8221; o que vai me manter ocupado por um tempo.


Os SVMs são uma ferramenta bem conhecida da área de Aprendizagem Automática supervisionada, e são usados ​​tanto para classificação quanto para regressão. Para mais detalhes, consulte a literatura.


Parece-me que a aplicação mais intuitiva para negociação é a regressão, então vamos começar construindo um modelo de regressão SVM.


Seguindo nossa experiência com os modelos ARMA + GARCH, começaremos tentando prever os retornos, em vez dos preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos 5 dias anteriores como os recursos que determinam o retorno de um determinado dia. Começaremos com história de 500 dias como o conjunto de treinamento.


Em termos mais matemáticos, para o conjunto de treinamento, temos recursos N, para cada um deles temos M amostras. Nós também temos respostas M.


Dada uma linha de valores de característica, a matriz esquerda, o SVM é treinado para produzir o valor da resposta. Em nosso exemplo específico, temos cinco colunas (características), cada coluna correspondente aos retornos com atraso diferente (de 1 a 5). Temos 500 amostras e as respostas correspondentes.


Uma vez que o SVM é treinado neste conjunto, podemos começar a alimentá-lo com conjuntos de cinco recursos, correspondentes aos retornos dos cinco dias anteriores, e o SVM nos fornecerá a resposta, qual é o retorno previsto. Por exemplo, depois de treinar o SVM nos 500 dias anteriores, usaremos os retornos para os dias 500, 499, 498, 497 e 496 (estes são nossos como entrada para obter o retorno previsto para o dia 501.


De todos os pacotes disponíveis em R, decidi escolher o pacote e1071. Uma segunda escolha foi o pacote kernlab, que ainda estou planejando tentar no futuro.


Então tentei algumas estratégias. Primeiro tentei algo muito parecido com a abordagem ARMA + GARCH & # 8211; os retornos atrasados ​​dos cinco dias anteriores. Fiquei bastante surpreso ao ver esta estratégia ter melhor desempenho do que a ARMA + GARCH (esta é a terra natal da ARMA + GARCH e eu teria ficado bastante feliz apenas com desempenho comparável)!


Em seguida, tentei os mesmos cinco recursos, mas tentando selecionar o melhor subconjunto. A seleção foi feita usando uma abordagem gananciosa, começando com 0 recursos e adicionando de forma interativa o recurso que minimiza melhor o erro. Esta abordagem melhorou ainda mais as coisas.


Finalmente, tentei uma abordagem diferente com cerca de uma dúzia de recursos. Os recursos incluíram retornos em diferentes períodos de tempo (1 dia, 2 dias, 5 dias, etc.), algumas estatísticas (média, mediana, sd, etc.) e volume. Eu usei a mesma abordagem gananciosa para selecionar recursos. Este sistema final também mostrou um desempenho muito bom, mas demorou um momento para correr.


Hora de terminar esta publicação, os resultados dos back-testing devem aguardar. Até então você pode jogar com o código fonte completo você mesmo. Aqui está um exemplo de usá-lo:


Olá, é possível ter um exemplo de aplicação se sua função?


Atualizou o post.


Boa postagem sobre SVM & # 8217; s. Obrigado por compartilhar. Eu sou um novato da R, você poderia me dizer qual é a diferença entre fazer isso.


No windows doesn & # 8217; t trabalho por causa do problema multicore.


Outra coisa que eu não entendo é refletida nessas linhas para o código.


Na minha opinião, é mais eficaz para mesclar séries.


e ter apenas um argumento = objeto para função chamada em vez de 2.


Trabalho interessante, obrigado.


Argh, Windows & # 8211; Eu uso isso raramente ultimamente. Muito surpreendido ainda, já que o pacote paralelo faz parte da distribuição base R agora. Espero que seja abordado em breve.


Enquanto isso, que tal não usar a execução paralela? Também existem outros pacotes que oferecem execução paralela, mas isso seria mais trabalho.


Você está certo sobre a fusão & # 8211; Ainda me pergunto por que eu fiz isso dessa maneira desta vez. :)


Estou recebendo erros.


Agora o erro é.


& gt; data = svmFeatures (tt) [, c (1,2)]


Erro em match. fun (FUN): object & # 8216; skewness & # 8217; não encontrado.


Mas quando eu faço manualmente o objeto de dados, recebo erro na previsão.


svmComputeOneForecast & lt; - função relacionada a dimensões e.


É difícil para mim depurar.


O skeness vem do pacote PerformanceAnalytics, que você precisa instalar no CRAN. Adicionar exigir (PerformanceAnalytics) como a primeira linha de svmFeatures deve resolver o primeiro problema.


Erro na mesclagem. xts (res, xts (na. trim (lag (rollmean (rets, k = 21, align = & # 8220; right & # 8221;),:


comprimento de & # 8216; dimnames & # 8217; [2] não é igual à extensão da matriz.


Parece que no código do Windows precisa de muitas mudanças.


Mike, eu nunca quis dizer o código para ser usado diretamente (até agora eu estava fornecendo apenas trechos), mas estou surpreso que R no Windows seja tão feio. Não tenho certeza do que é o seu objetivo, mas para analisar o desempenho das estratégias, você pode usar a série de indicadores que já estão computados.


É apenas um puro interesse acadêmico na SVM. Eu costumava trabalhar com clusters, a PCA e tenho curiosidade de como a SVM está fazendo o mesmo trabalho.


Nas janelas, muitos erros estão relacionados a objetos com datas como xts ou quadros de dados.


O UNIX é melhor, mas todos os corretores dão API para o Windows. Alguns deles em Java e só isso podemos usar do UNIX.


Eu não gosto de win architecture, mas já é um hábito e não tenho tempo para mudar o sistema operacional.


Eu tentei apenas no Windows 7, 64 bit, R versão 2.15.2. Recebo um aviso de svmFeatures, que eu sei como consertar (chamar sd em um objeto xts / zoo faz uma conversão interessante para uma matriz), mas não há problemas. Corrida:


Uma pergunta se você não se importar.


Por que você está usando, obtenha com função cetSymbols do pacote quantmod?


Eu uso call vers.


SPY & lt; - getSymbols (& # 039; SPY & # 039 ;, auto. assign = FALSE)


Você tem muito para calcular e obter memória de consumo e leva tempo para obter o nome dos objetos.


como uma string var.


Mas estou surpreso com este resultado antes da chamada.


1 função (& # 8230 ;, list = character (), package = NULL, lib. loc = NULL,


2 verbose = getOption (& # 8220; verbose & # 8221;), envir =.GlobalEnv)


4 fileExt & lt; - função (x)


Parece que os dados são palavras reservadas.


E agora eu não sei o que está funcionando na função.


Estou usando o R 2.15.2 no linux de 64 bits. Os dados do meu sistema também são uma função, mas eu não acho que este é o problema.


Essa é provavelmente uma maneira melhor. Já vi isso antes, mas não prestei atenção até agora para perceber que isso faz exatamente isso. Obrigado.


O que você quer dizer quando você fala sobre os retornos atrasados? É o valor 500.499.498.497.496 para a previsão do retorno 501?


Sim, esses retornos são usados ​​para prever o retorno de 501, que é usado como posição (longo / curto dependendo do sinal) para 501. O modelo é treinado apenas nos dados anteriores, ou seja, a última & # 8220; linha & # 8221; no conjunto de treinamento é 499,498,497,496,495.


Ok, esse som é bom e, para o retorno, você usa esta fórmula:


retorno t = log (Preço t + 1 / Preço t)


E depois de normalizar (centro e escala) o retorno?


Você pode encontrar esses detalhes no código-fonte acompanhado. Eu uso os retornos discretos:


Não consigo centrar os dados, nem eu escala-o. No entanto, ambos os pacotes que eu uso (caret + kernlab e e1071) parecem fazer isso por padrão.


Outra coisa, desculpe, mas você constrói seu modelo nos valores anteriores 499, este é o seu conjunto de dados de treinamento,


E depois, para prever o retorno 501 você usa a última linha como valores de teste?


Por que construir um modelo nos 500 valores e usar a última linha, exceto 500,499 etc., outra vez para testar ou treinar?


no seu tutorial, você disse: Por exemplo, depois de treinar o SVM nos 500 dias anteriores, usaremos os retornos dos dias 500, 499, 498, 497 e 496 (estes são os nossos para obter o retorno previsto para o dia 501 .


E na sua resposta, você disse: Sim, esses retornos são usados ​​para prever o retorno de 501, que é usado como posição (longo / curto dependendo do sinal) para 501. O modelo é treinado apenas nos dados anteriores, ou seja, o A última "fila" no conjunto de treinamento é 499,498,497,496,495.


Você está certo se eu reivindico, eu construí o modelo nos 500 valores, e para prever o 501, eu uso o modelo de compilação anteriormente e dê-o para & # 8220; coma & # 8221; a última linha do conjunto de dados de treinamento, ou seja: 500,499etc como entrada para obter o valor previsto de 501 & # 8217; s?


Atenciosamente e desculpe pelo post múltiplo, mas tenho problemas com a minha rede.


Em geral, acho que deveria estar certo usar a abordagem que você está sugerindo. Observe que esta abordagem será muito mais exigente para implementar na negociação da vida real, ou pelo menos da maneira como eu faço isso.


Se for necessário calcular antecipadamente todos os preços de fechamento razoáveis, a nova abordagem precisará fazer um ajuste para cada fechamento individual e um prevê. Compare com a outra abordagem & # 8211; o modelo é adequado nos 500 dias anteriores, então apenas os novos dados (diferentes para cada fechamento) estão sendo alimentados. Em outras palavras, aqui temos um ajuste, muitos prevêem.


Realmente admira seu companheiro de trabalho, sou novo para o SVM com R, estou tentando usar dez indicadores técnicos para prever os movimentos do índice de ações nos meses de madrugada (para cima ou para baixo como 1 ou -1), quando você treina o modelo, o que você use como coluna de resposta & # 8230; se você estiver em 07/07/07 / 2012, você usa o movimento desse dia ou 08/07 & # 8217; s para 07/07 & # 8217; s indicadores técnicos & # 8230; se você usar 07 / 07 & # 8217; s input & # 8230; como você demora os resultados da segunda vez, como você não sabe as entradas de amanhã & # 8217; s # 8230; espero que isso faça sentido & # 8230;


Qualquer ajuda seria apreciada.


Oi Louis, se o alvo for apenas longo / curto, você pode usar a classificação em vez da regressão. A maioria dos pacotes altera silenciosamente para classificação se o vetor de resposta for & # 8220; fatores & # 8221; em vez de números. Verifique quantumfinancier. wordpress / 2010/06/26 / support-vector-machine-rsi-system / para um exemplo.


Antes de iniciar o processo avançado, alojo a resposta desejada com os dados que o predizem. Em geral, este é um atraso (1) dos preditores (dados). Isso alinha o valor desejado de 08/07 (o retorno de 08/07) com seus preditores (os indicadores a partir de 07/07 fecham). Então eu encaixo o modelo usando os dados excluindo a última data. Em outras palavras, digamos, eu estou prestes a prever 08/07. A última data em que vejo quando a montagem é 07/07. Como os dados já estão atrasados, a última data para os indicadores é, de fato, 06/07. Finalmente, para prever um dia antes, eu alimente os dados para 08/07, o que corresponde aos indicadores em 07/07. Agora eu posso comparar o previsto com o valor real. Isso pode ser aplicado relativamente facilmente na prática, desde que os indicadores sejam baseados apenas nos preços de fechamento. Qualquer coisa usando alto / baixo / volume / etc (stochastics, por exemplo), precisa ser atrasado por um dia extra, ou a negociação não pode acontecer logo no fechamento & # 8230; veja meu outro post: quintuitive / 2012/08/23 / trading-at-the-close-the-mechanics /.


Espero que isto ajude.


Isso é realmente útil, muito obrigado mate & # 8230;


a maioria dos artigos sobre SVM online são bastante inúteis e # 8230; acho que nem todo mundo gosta de compartilhar seus segredos haha.


Desculpe, mais uma pergunta: para o modelo com o melhor desempenho, quais entradas você usou para prever o retorno de amanhã ...


AS quote & # 8221; Finalmente, tentei uma abordagem diferente com cerca de uma dúzia de recursos. Os recursos incluíram retornos em diferentes períodos de tempo (1 dia, 2 dias, 5 dias, etc.), algumas estatísticas (média, mediana, sd, etc.) e volume. Eu usei a mesma abordagem gananciosa para selecionar recursos. Este sistema final também mostrou um desempenho muito bom, mas demorou um tempo para correr. & # 8221;


O modelo com o melhor desempenho, por pouco, estava usando retornos diários remanescentes (em 1,2,3,4 e 5 dias). O único giro foi que estava usando um método ganancioso para selecionar o & # 8220; melhor & # 8221; combinação de recursos.


Acabei de terminar meu trabalho, adotei uma abordagem de classificação para prever o movimento de amanhã & # 8217;


a precisão é de quase 86% em um testdate de 140 dias. Pergunto-me se é um pouco muito alto e # 8230;


No entanto, muito obrigado.


Parece muito alto para mim. I & # 8217; d certamente analisá-lo mais algumas vezes antes de levá-lo a sério & # 8211; isso é como ter uma bola de cristal .;)


Aqui está uma idéia, quando você seleciona o conjunto de treinamento, tente dividir o seu conjunto de treinamento em duas partes iguais, uma é a resposta retorna acima da média, a outra é o retorno abaixo da média & # 8230; desta maneira, sua precisão de previsão pode não mude muito, mas você pode prever os movimentos GRANDES muito mais precisos & # 8230;


o desempenho deve ser melhorado e # 8230; eu tentei isso e os resultados são bastante agradáveis ​​& # 8230; deixe-me saber se isso funciona para você.


Meus nomes são Krzysztof e eu é um autor desse tópico.


Neste projeto eu estava usando diferentes algoritmos de aprendizado de máquina (incluindo SVM) tentando prever se determinado comércio com TP / SL fixo será bem sucedido ou não como classificação.


Alguns comentários / perguntas para o seu código.


1) Usando validação cruzada (tune. control, cross = cross). Você tem certeza de que usar a validação cruzada é correto no caso de séries temporais ?? Nesse caso, o treinamento será feito em dados passados ​​e, por definição de séries temporais, introduzirá vazamentos futuros e resultados inflados. Talvez a opção correção seja usada.


2) Constantes do Kernel. Os parâmetros mais importantes para SVM são constantes do kernel. Por que esses valores fixos são usados ​​e não outro?


3) Tamanho da amostra / Escolha do SVM. O tempo de treinamento desta SVM está exponencialmente correlacionado com o tamanho da amostra de treino, tanto quanto eu lembro. Mas existem outros SVM especializados para uso com tamanho de amostra de treinamento maior, e. Eu estava treinando meu sistema em até 150 000 bares dentro de poucas horas. Por exemplo, pegassos, libocas ou SVMLight. Nesse caso, é possível, e. para usar dados horários e um tamanho de amostra maior que proporcionará uma precisão muito melhor.


4) Por que não usar o pacote RWeka e ter acesso talvez mais de cem ML algos.


Um tópico bastante interessante, certamente algo para ver o & # 8211; Obrigado por trazê-lo. O que você quer dizer com & # 8220; TP / SL & # 8221 ;?


1) O código é principalmente para fins ilustrativos, e eu não achei muito útil em geral. Eu concordo, é duvidoso considerar cada linha no conjunto de treinamento como independente do resto no caso de séries temporais com suas correlações, mas é uma abordagem. De acordo com robjhyndman / hyndsight / crossvalidation /, uma melhor abordagem pode ser uma validação cruzada de uma etapa usando os dados passados, o que deve ser relativamente fácil de adicionar.


2) Nada de especial sobre essas constantes do kernel e # 8211; apenas um conjunto para iterar. Eu acho que usei valores encontrados em exemplos usando o (s) pacote (s). A otimização escolhe o melhor.


3) É bom saber. Atualmente, eu não negocio intradiário, então eu nunca tive a necessidade de lidar com grandes quantidades de dados. Para dados diários, aumentar a janela melhora o desempenho, mas até um ponto da minha experiência. Um bit contador intuitivo que a janela de tempo mais longo irá melhorar as previsões indefinidamente - em algum momento os dados são demais (como uma relação versus o número de parâmetros otimizados).


4) Haven realmente olhou para RWeka. Originalmente comecei com o e1071 porque é rápido e muito estável. Então eu mudei para o caret, que fornece uma interface unificada para muitos outros pacotes, incluindo alguns algoritmos da RWeka. Na minha experiência, não encontrei uma abordagem ML que realmente se destaque para a previsão de dados da série temporal. Você já?


Obrigado por compartilhar,


1) Usando validação cruzada (tune. control, cross = cross). Você tem certeza de que usar a validação cruzada é correto no caso de séries temporais ?? Nesse caso, o treinamento será feito em dados passados ​​e, por definição de séries temporais, introduzirá vazamentos futuros e resultados inflados. Talvez a opção correção seja usada.


deve ser & # 8216; Nesse caso, o treinamento será feito em dados futuros & # 8217;


Minha implementação não tem (pelo menos por design);) use dados futuros. Se o histórico for de 500 pontos, a validação cruzada é usada dentro destes 500 para determinar o melhor ajuste.


TP / SL & # 8211; obter perda de lucro / paragem. O sistema estava tentando negociar em cada barra (comprar ou vender) do que o rótulo.


foi determinado (comércio bem sucedido / mal sucedido) depende se TP ou SL foi atingido primeiro.


& # 8220; Se o histórico for 500 pontos, a validação cruzada é usada dentro destes 500 para determinar o melhor ajuste & # 8221;


Bem, nesse caso, os resultados das amostras serão inflado e não tem significado. Por exemplo, se você dividir o período de treinamento para 10 períodos secundários e treinar nos períodos 1-8 e 10 do que avaliar no período 9, o vazamento futuro ocorre quando o período 10 for após o período 9, então, no futuro.


Como funciona a validação cruzada, penso e é aplicável apenas para padrões estáticos. Somente andar para a frente tem um significado em caso de séries temporais.


Quando eu tento o código, encontro o ROC 2 para a linha 29/03/195: É a diferença de: valor de 28/03 e 24/03 dividir por valor de 24/03, por que o valor de 27/03? - valor de 24/03 dividido por valor de 24/03 & # 8230 ;.


O código é apenas para ilustração. Você pode modificá-lo de qualquer jeito que você quiser e usar quaisquer características que você acha que podem melhorar as previsões. A função ROC vem do pacote TTR.


É possível ter uma trama do modelo ARMA e SVM fora de amostra para comparar seu desempenho?


Não é provável que tenha tempo para voltar a ele, mas irá mantê-lo em mente.


Negociação com máquinas de vetor de suporte (SVM)


Finalmente, todas as estrelas se alinharam e posso dedicar algum tempo para o teste posterior de novos sistemas de negociação, e o Support Vector Machines (SVM) é o novo "brinquedo" que vai me manter ocupado por um tempo.


Os SVMs são uma ferramenta bem conhecida da área de Aprendizagem Automática supervisionada, e são usados ​​tanto para classificação quanto para regressão. Para mais detalhes, consulte a literatura.


Parece-me que o aplicativo mais intuitivo para negociação é a regressão, então comecemos pela construção de um modelo de regressão SVM.


Seguindo nossa experiência com os modelos ARMA + GARCH, começaremos tentando prever os retornos, em vez dos preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos 5 dias anteriores como os recursos que determinam o retorno de um determinado dia. Começaremos com história de 500 dias como o conjunto de treinamento.


Em termos mais matemáticos, para o conjunto de treinamento, temos recursos N, para cada um deles temos M amostras. Nós também temos respostas M.


Dada uma linha de valores de característica, a matriz esquerda, o SVM é treinado para produzir o valor da resposta. Em nosso exemplo específico, temos cinco colunas (características), cada coluna correspondente aos retornos com atraso diferente (de 1 a 5). Temos 500 amostras e as respostas correspondentes.


Uma vez que o SVM é treinado neste conjunto, podemos começar a alimentá-lo com conjuntos de cinco recursos, correspondentes aos retornos dos cinco dias anteriores, e o SVM nos fornecerá a resposta, qual é o retorno previsto. Por exemplo, depois de treinar o SVM nos 500 dias anteriores, usaremos os retornos para os dias 500, 499, 498, 497 e 496 (estes são nossos como entrada para obter o retorno previsto para o dia 501.


De todos os pacotes disponíveis em R, decidi escolher o pacote e1071. Uma segunda escolha foi o pacote kernlab, que ainda estou planejando tentar no futuro.


Então tentei algumas estratégias. Primeiro tentei algo muito parecido com a abordagem ARMA + GARCH - os retornos atrasados ​​dos cinco dias anteriores. Fiquei bastante surpreso ao ver esta estratégia ter melhor desempenho do que a ARMA + GARCH (esta é a terra natal da ARMA + GARCH e eu teria ficado bastante feliz apenas com desempenho comparável)!


Em seguida, tentei os mesmos cinco recursos, mas tentando selecionar o melhor subconjunto. A seleção foi feita usando uma abordagem gananciosa, começando com 0 recursos e adicionando de forma interativa o recurso que minimiza melhor o erro. Esta abordagem melhorou ainda mais as coisas.


Finalmente, tentei uma abordagem diferente com cerca de uma dúzia de recursos. Os recursos incluíram retornos em diferentes períodos de tempo (1 dia, 2 dias, 5 dias, etc.), algumas estatísticas (média, mediana, sd, etc.) e volume. Eu usei a mesma abordagem gananciosa para selecionar recursos. Este sistema final também mostrou um desempenho muito bom, mas demorou um momento para correr.


Hora de terminar esta publicação, os resultados dos back-testing devem aguardar. Até então você pode jogar com o código fonte completo você mesmo. Aqui está um exemplo de usá-lo:


SVM Machine Learning Trading System - Repost - aberto para lances.


Orçamento min $ 50 USD / hora.


Freelancer Jobs Algorithm SVM Machine Learning Trading System - Repost - aberto para lances.


Procuro um especialista em Inteligência Artificial usando a programação de aprendizagem da máquina SVM para ajudar no desenvolvimento do meu sistema de negociação para o mercado financeiro Forex, você deve ter conhecimento e compreensão para implementar idéias comerciais, criando indicadores para testar usando o SVM. O pré-processamento de dados (dados financeiros), algoritmos de previsão precisos, seleção de atributos e características corretos, etc. o candidato também é bem-vindo para inserir suas próprias idéias, sua experiência exigirá reconhecimento de problemas e encontrar soluções.


O sistema precisa desenvolver do início ao fim um sistema comercial totalmente automatizado completo para ser usado e trabalhar no Meta Trader 4 ou 5.


Procurando por algum dinheiro?


Defina seu orçamento e prazo.


Delineie sua proposta.


Seja pago pelo seu trabalho.


É grátis para se inscrever e oferecer em trabalhos.


6 freelancers estão oferecendo em média $ 295 / hora para este trabalho.


Oi, sou Sourabh Jain, estou interessado no projeto. Eu desenvolvi a EA no Metatrader usando ANN (feed forward with back propagation) com excelentes detalhes sobre recursos de gerenciamento de comércio. Ele mostrou bons resultados quando usado Mais.


Tenho experiência em trabalhar com Algoritmos de Aprendizado de Máquinas. Eu trabalhei em um aplicativo de análise de sentimento usando Naive Bayesian Classifier e Google flow tensor e sci kit aprendem. Estou bem versado com diferentes Mais.


Depois de ler sua descrição com cuidado. Senti o meu potencial de qualidade perfeita. Porque eu estou disponível 20 horas, 7 dias.


Devemos conversar em pessoal. Trabalhei com svm em projetos e tenho conhecimento de mineração de dados e manipulação. Tenho uma boa experiência em inteligência artificial.


Procurando por algum dinheiro?


Defina seu orçamento e prazo.


Delineie sua proposta.


Seja pago pelo seu trabalho.


É grátis para se inscrever e oferecer em trabalhos.


Trabalhos semelhantes.


Precisa contratar um freelancer para um emprego?


É grátis para se inscrever, digite o que você precisa e amp; receba orçamentos gratuitos em segundos.


Inglês - África do Sul.


Trabalhador autonomo.


Termos.


Freelancer & reg; é uma marca registada da Freelancer Technology Pty Limited (ACN 142 189 759)


Direitos autorais e cópia; 2017 Freelancer Technology Pty Limited (ACN 142 189 759)


Uma única estratégia de negociação SVM.


As máquinas de vetor de suporte (SVM) estão ganhando popularidade nos sistemas de negociação de aprendizado de máquina. Possuem vantagens nas Redes Neurais (NN), pois garantem a solução ideal. NN pode ser pego em um mínimo local, então, enquanto você obtém um resultado usando o NN, você nunca pode ter certeza de que é ótimo. Além disso, se o NN for iniciado com pesos aleatórios, provavelmente você terá um conjunto diferente de pesos cada vez que você executar backpropagation no mesmo conjunto de dados.


SVMs também têm suas desvantagens. Especificamente, a seleção do & # 8216; hyper & # 8217; parâmetros. Estas são a penalidade (C), a largura gaussiana (g) se estiver usando um kernel RBF e uma insensibilidade a epsilon (e) se usando o Support Vector Regression (SVR).


Meu uso de SVMs até agora tem sido usá-los na classificação, então eu só preciso selecionar os parâmetros C e g e # 8211; Eu uso o kernel padrão do RBF. É muito difícil tentar prever se o mercado vai subir ou descer, e muito menos por quanto.


Podemos selecionar esses parâmetros usando uma pesquisa em grade. Isso significa que simplesmente tentamos cada combinação de parâmetros e ver o que funcionou melhor. A forma como os parâmetros são avaliados é através da validação cruzada n-fold.


Validação cruzada.


Isto é melhor explicado com um exemplo. Se tivermos 1000 casos de treinamento rotulados e usamos 10 vezes a validação cruzada, então, para cada combinação de C, g, fazemos o seguinte:


Retire aleatoriamente 10% das amostras. Este é o nosso conjunto de 100 instâncias de treinamento. Treine o SVM nos restantes 90% e crie um modelo. Use o modelo para testar a precisão no conjunto de retenção. Repita o exercício 10 vezes e obtenha a precisão média.


O acima é uma validação cruzada de 10 vezes. Poderíamos levar isso para a conclusão lógica e só ter uma única instância em out hold-out & # 8216; set & # 8217 ;. Esta é a validação cruzada leave-one-out. Isso nos daria a avaliação mais precisa da combinação de parâmetros, mas na prática 10 vezes ou mesmo 5 vezes é bom o suficiente.


Então, como nós realmente fazemos uma validação cruzada?


O pacote libSVM em csie. ntu. edu. tw/


cjlin / libsvm / contém alguns scripts Python no diretório de ferramentas. Você precisará instalar o Python e o Gnuplot.


Você também pode usar DeepThought disponível de deep-thought. co. Nos exemplos abaixo, eu uso DeepThought.


A primeira coisa que precisamos é de alguns dados. I & # 8217; usará um conjunto de treinamento com os seguintes recursos.


Hora do dia Diferença média de preços de fechamento entre os 30 minutos anteriores Diferenças médias em movimento entre o anterior 1,2,3,4,5,7,9,13,16,20,25,31,45,55,70,100 bars com MA períodos de 5, 10, 20, 50 e 100.


O alvo é -1, pois o preço irá cair no final do próximo bar, 1 para o preço subirá no final do próximo bar. Uma vez que eu configurei estes na configuração, eu executo o comando.


para extrair o conjunto de treinamento. Eu também uso a escala min-max. Eu discutirei a preparação de recursos e a escala em outro artigo. O comando acima criará arquivos de treinamento de todos os modelos definidos na configuração DeepThought. Após o comando ter concluído um arquivo h4-features. training. data é criado o mesmo diretório do qual eu executei o comando. Isso está no formato libSVM para que possamos usar as ferramentas do libSVM para executar a pesquisa de grade ou usar a busca por grade incorporada no DeepThought. Também é criado o arquivo h4-features. training. data. csv que contém os mesmos dados, mas no formato CSV para que você possa jogar com ele em outras ferramentas, como R, Python, Excel etc.


Para executar a pesquisa de grade em DeepThought eu uso o comando:


Os resultados estão no arquivo de log onde Resultado: é a precisão percentual:


Os resultados (desinteressantes) no meio foram removidos por brevidade. Podemos ver que o SVM parece favorecer gammas menores e o C parece ser um valor sensível. Devemos estar preocupados se a melhor gama fosse grande e o C pequeno, pois provavelmente significa algum tipo de erro de dados. Os próximos valores mais altos são aproximadamente o mesmo intervalo que os melhores parâmetros que indicam que a seleção de parâmetros é relativamente insensível. Devemos estar preocupados se os valores que dão o melhor resultado foram outliers.


Backtesting a única estratégia SVM.


O passo final é avaliar como um único SVM executa em um backtest. Neste backtest, simplesmente compramos com uma previsão +1 e vendemos com uma previsão -1. Se somos longos e recebemos um sinal de compra, adicionamos outra posição a um tamanho de posição máximo de 10. Inversamente para sinais de venda.


Usando o melhor C de 128 e a gama de 0.00195313, podemos cortar e passar o seguinte fragmento XML do arquivo de log de pesquisa de grade no arquivo de configuração DeepThought:


O backtest é executado com o seguinte comando:


O DeepThought backtest opera criando um conjunto de treinamento no final de cada barra, o EURUSD H4 neste caso. Quando o fim da próxima barra é atingido, uma previsão é feita e as negociações são inseridas e / ou fechadas, então o modelo é novamente treinado novamente para a próxima barra. Assim, está se adaptando continuamente às últimas condições e todos os testes estão fora de amostra, evitando o excesso de ajuste.


Os resultados do backtest foram:


e um gráfico do PnL (plotado usando R):


Isso parece bom, mas provavelmente não é algo que nós negociamos como está.


O próximo artigo irá discutir conjuntos para ver se podemos melhorar esse resultado.

No comments:

Post a Comment