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