Saturday 23 December 2017

Svm trading system


Uma única SVM Trading Strategy Support Vector Machines (SVM) está ganhando popularidade nos sistemas de negociação de aprendizagem mecânica. 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, você provavelmente receberá 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 dos parâmetros 8216hyper8217. Estas são a penalidade (C), largura gaussiana (g) se estiver usando um kernel RBF e insensibilidade a epsilon (e) se estiver usando o Support Vector Regression (SVR). O uso dos SVM até agora foi para usá-los na classificação, então eu só preciso selecionar os parâmetros C e g 8211. Eu uso o kernel padrão do RBF. It8217s dificilmente tentando 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 veremos o que funcionou melhor. A forma como os parâmetros são avaliados é através da validação cruzada n-fold. Validação cruzada Isso é 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 90 restantes 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 ter apenas uma única instância no out-out 8216set8217. 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 cjlinlibsvm contém alguns scripts Python no diretório de ferramentas. You8217ll precisa instalar o Python e o Gnuplot. Você também pode usar DeepThought disponível de deep-thought. co. Nos exemplos abaixo I8217, use DeepThought. A primeira coisa que precisamos é de alguns dados. I8217 Utilize um conjunto de treinamento com as seguintes características. Hora do dia. Diferença média 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 barras com períodos de MA de 5, 10, 20, 50 e 100 O alvo é -1, pois o preço irá diminuir no final do próximo bar, 1 pelo preço subirá no final de O próximo bar. Uma vez que I8217ve configurá-los na configuração, eu executo o comando para extrair o conjunto de treinamento. I8217ve também usa escala min-max. I8217ll discutirá 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 integrada 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 registro 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 the Single SVM Strategy O passo final é avaliar como um único SVM executa em um backtest. Neste backtest, simplesmente compramos com uma previsão 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 de XML do arquivo de log de pesquisa de grade para o arquivo de configuração DeepThought: O backtest é executado com o seguinte comando: O DeepThought backtest opera criando um conjunto de treinamento em O fim de cada barra, o EURUSD H4 neste caso. Quando o fim da próxima barra é atingido, uma previsão é feita e os negócios são inseridos e fechados, 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 enredo da PnL (plotado usando R): parece que está bem, mas provavelmente não é algo que possamos negociar como está. O próximo artigo irá discutir conjuntos para ver se podemos melhorar este resultado. Trading com Support Vector Machines (SVM) Finalmente, todas as estrelas alinharam e devo dedicar algum tempo para back-testing de novos sistemas de negociação e Support Vector Machines ( SVM) são o novo 8220toy8221 que vai me manter ocupado por um tempo. SVMs são uma ferramenta bem conhecida da área de Aprendizado de Máquinas supervisionado. 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 let8217s começam pela construção de um modelo de regressão SVM. Seguindo a nossa experiência com os modelos ARMAGARCH, começaremos tentando prever os retornos, em vez dos preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos últimos 5 dias como características 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 de resposta. No 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, que é o retorno previsto. 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 nossos como a entrada para obter o retorno previsto para o dia 501. De todos os pacotes disponíveis Em R, eu 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 ARMAGARCH 8211 o Retornaram os retornos dos cinco dias anteriores. Fiquei bastante surpreso ao ver esta estratégia ter melhor desempenho do que o ARMAGARCH (esta é a terra natal do ARMAGARCH e eu teria ficado bastante feliz apenas com desempenho comparável) Em seguida, tentei o mesmo cinco 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 aprimorou ainda mais as coisas. Finalmente, tentei uma abordagem diferente H 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 do 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: oi No Windows doesn8217t funciona por causa do problema multicore. Mais uma coisa que eu não consigo entender é refletida nessas linhas para o código retsindex (data) data dataindex (rets) Na minha opinião, it8217s é mais eficaz para mesclar série smth como mydtret lt-na. exclude (fusion (rets, data) E ter apenas um objeto de argumento para função de chamada em vez de 2 Trabalho interessante, obrigado Mike Argh, Windows 8211. Eu uso isso raramente ultimamente. Muito surpreendido ainda, já que o pacote paralelo faz parte da distribuição base R agora. Esperemos que seja abordado em breve Entretanto, como não está a usar a execução paralela, existem outros pacotes que proporcionam execução em paralelo, mas isso seria mais um trabalho. Você está certo sobre a mesclagem 8211. Eu ainda me pergunto por que eu fiz dessa maneira desta vez. :) I8217m recebendo erros. Agora o erro é gt data svmFeatures (tt), c (1,2) Erro em match. fun (FUN). Objeto 8216skewness8217 não encontrado Mas quando eu faço manualmente objeto de dados, recebo erro na previsão svmComputeOneForecast lt - função relacionada a dimensões e samplingquotcrossquot It039s difícil para mim depurar skewness vem do pacote PerformanceAnalytics, que você precisa instalar da CRAN. Adicionando exigir (PerformanceAnalytics) como a primeira linha de svmFeatures deve resolver o primeiro problema. Agora o erro é Error in merge. xts (res, xts (na. trim (lag (rollmean (rets, k 21, align 8220right8221). Comprimento de 8216dimnames8217 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 snippets), mas estou surpreso que R no Windows seja tão feio. Não tenho certeza do que o objetivo é, mas para analisar o desempenho das estratégias, você pode usar o Série de indicadores que já estão computados. It8217s é apenas um puro interesse acadêmico no SVM. Eu costumava trabalhar com clusters, PCA e tenho curiosidade de como o SVM está fazendo o mesmo trabalho. No Windows, muitos erros estão relacionados a objetos com datas como xts é Ou os 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 ele já é um hábito e eu não tenho tempo para mudar o sistema operacional. Eu apenas Tentei 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 xtszoo faz conversão interessante para uma matriz), mas sem problemas. Correndo: Obrigado I8217ll tentar. Uma pergunta se você não se importa Por que você está usando get with function CetSymbols from quantmod package Eu uso call vers Exemplo SPY lt - getSymbols (039SPY039, auto. assign FALSE) Você tem muito para calcular e obter memória de consumo e leva tempo para obter objetos Nome como uma string var O mesmo erro I8217m usando R 2.15.1 Mas I8217m surpreendido com este resultado antes da função gt head (data) 1 (8230, list character (), pacote NULL, lib. loc NULL, 2 getOption detalhado (8220verbose8221 ), Envir. GlobalEnv) 3 4 fileExt lt-function (x) 5 db lt - grepl (quot ... (gzbz2xz) quot, x) 6 ans lt-sub (quot..quot, quotquot, x) Parece que Os dados são uma palavra reservada E agora eu não sei o que está funcionando com o FunctionTrading com o Support Vector Machines (SVM) Finalmente, todas as estrelas se alinharam e devo dedicar algum tempo para back-testing de novos sistemas de negociação e Support Vector Machines (SVM ) São o novo brinquedo que vai me manter ocupado por um tempo. SVMs são uma ferramenta bem conhecida da área de Aprendizado de Máquinas supervisionado. 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 o comércio é a regressão, então vamos começar construindo um modelo de regressão SVM. Seguindo a nossa experiência com os modelos ARMAGARCH, começaremos tentando prever os retornos, em vez dos preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos últimos 5 dias como características 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 de resposta. No 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, que é o retorno previsto. 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 nossos como a entrada para obter o retorno previsto para o dia 501. De todos os pacotes disponíveis Em R, eu 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 ARMAGARCH, o atraso Retorna dos cinco dias anteriores. Fiquei bastante surpreso ao ver esta estratégia funcionar melhor do que a ARMAGARCH (esta é a terra natal do ARMAGARCH 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. Finalmente, tentei uma abordagem diferente 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 do 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:

No comments:

Post a Comment