Sunday 21 April 2019

Svm trading system


Trading with Support Vector Machines (SVM) Finalmente todas as estrelas se alinharam e eu 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 8220toy8221 que vai me manter ocupado por um enquanto. As SVMs são uma ferramenta bem conhecida da área de Aprendizagem Automática supervisionada. E eles são usados ​​tanto para classificação e regressão. Para mais detalhes consulte a literatura. Parece-me que a aplicação mais intuitiva para negociação é a regressão, por isso let8217s começar por construir um modelo de regressão SVM. Seguindo nossa experiência com os modelos ARMAGARCH, vamos começar tentando prever retornos, em vez de preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos 5 dias anteriores como as características que determinam o retorno de um determinado dia. Vamos começar com o histórico de 500 dias como o conjunto de treinamento. Em termos mais matemáticos, para o conjunto de treinamento temos N características, para cada um deles temos M amostras. Temos também respostas M. Dada uma linha de valores de característica, a matriz esquerda, o SVM é treinado para produzir o valor de resposta. Em nosso exemplo específico, temos cinco colunas (características), cada coluna correspondente aos retornos com um retardo diferente (de 1 a 5). Temos 500 amostras e as respostas correspondentes. Uma vez que o SVM é treinado sobre este conjunto, podemos começar a alimentá-lo com conjuntos de cinco recursos, correspondente aos retornos para os cinco dias anteriores, eo SVM irá fornecer-nos com a resposta, que é o retorno previsto. Por exemplo, após o treinamento do 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, eu decidi escolher o pacote e1071.Uma segunda escolha foi o pacote kernlab, que eu ainda estou planejando para tentar no futuro. Então eu tentei algumas estratégias. Primeiro eu tentei algo muito semelhante à abordagem ARMAGARCH 8211 a Lag retorna dos cinco dias anteriores. Eu fiquei bastante surpreso ao ver esta estratégia de desempenho melhor do que o ARMAGARCH (esta é a terra natal do ARMAGARCH e eu teria sido muito 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 interativamente adicionando o recurso que minimiza o erro melhor. Esta abordagem melhorou as coisas ainda. Finalmente, eu tentei uma abordagem diferente com cerca de Uma dúzia de recursos. As características incluídas retornam ao longo do período de tempo diferente (1-dia, 2-dia, 5-dia, etc), algumas estatísticas (média, mediana, sd, etc) e volume. Eu usei a mesma abordagem ávida para selecionar recursos. Este sistema final mostrou um desempenho muito bom também, mas demorou um inferno de um tempo para correr. Tempo para terminar este post, os resultados de back-testing tem que esperar. Até então você pode jogar com o código-fonte completo sozinho. Aqui está um exemplo de usá-lo: Oi No trabalho do windows doesn8217t por causa do problema multicore. Mais uma coisa que eu não entendo é refletida nisto para as linhas do código retsindex (data) data dataaindex (rets) Na minha opinião it8217s mais eficaz para mesclar série smth como mydtret lt - na. exclude (mesclagem (rets, dados) E ter apenas um argumento para chamar a função em vez de 2 Trabalho interessante, obrigado Mike Argh, Windows 8211 Eu uso raramente ultimamente. Bastante surpreso ainda, uma vez que o pacote paralelo é parte da distribuição de base R agora. Esperamos que será abordado em breve Enquanto isso, como sobre não usar a execução paralela Também há outros pacotes fornecendo execução paralela, mas isso seria mais trabalho Você está certo sobre a fusão 8211 Eu ainda me pergunto por que eu fiz desta maneira desta vez :) I8217m recebendo erros. Agora o erro é gt dados svmFeatures (tt), c (1,2) Erro em match. fun (FUN). Objeto 8216skewness8217 não encontrado Mas quando eu faço manualmente objeto de dados eu recebo erro na previsão svmComputeOneForecast lt - função relacionada com as dimensões e samplingquotcrossquot It039s difícil para mim depurar skewness vem do pacote PerformanceAnalytics, que você precisa instalar do CRAN. Adicionar exigir (PerformanceAnalytics) como a primeira linha de svmFeatures deve resolver o primeiro problema. Agora o erro é Erro em merge. xts (res, xts (na. trim (lag (rolls, k 21, alinhar 8220right8221) comprimento de 8216dimnames8217 2 não é igual à extensão matriz parece que no código do Windows precisa de um monte de alterações Mike, eu nunca quis dizer o código a ser usado diretamente (até agora eu estava fornecendo apenas trechos), mas estou surpreso que R no Windows é tão feio. Não sei what8217s seu objetivo, mas para analisar o desempenho das estratégias, você pode usar o Série de indicadores que já são computados. É apenas puro interesse acadêmico sobre SVM. Eu costumava trabalhar com clusters, PCA e estou curioso como SVM está fazendo o mesmo trabalho. Nas janelas um monte de erro estão relacionados a objetos com datas como xts é Ou quadros de dados. Unix é melhor, mas todos os corretores dar API para windows. Alguns deles em Java e só isso podemos usar do UNIX. Eu don8217t como ganhar arquitetura, mas it8217s um hábito já e eu don8217t ter tempo para mudar de sistema operacional. Eu só Tentei no Windows 7, 64 bits, R versão 2.15.2.Eu recebo um aviso de svmFeatures, que eu sei como corrigir (chamando sd em um objeto xts / zoo faz conversão interessante para uma matriz), mas não há problemas. Corrida: Obrigado I8217ll tentar. Uma pergunta se você não se importa Por que você está usando get com função cetSymbols from quantmod pacote Eu uso call vers Exemplo SPY lt - getSymbols (039SPY039, auto. assign FALSE) Você tem muito a calcular e obter consumir memória e leva tempo para obter objetos Nome como uma string var O mesmo erro I8217m usando R 2.15.1 Mas I8217m surpreendeu com este resultado antes de chamar gt cabeça (dados) 1 função (8230, list character (), pacote NULL, lib. loc NULL, 2 verbose getOption (8220verbose8221 ), Amb. GlobalEnv) 3 4 fileExt lt - função (x) 5 db lt - grepl (quot ... (gzbz2xz) quot, x) 6 ans lt - sub (quot..quot, quotquot, x) Os dados são palavra reservada E agora eu don039t saber o que está indo para características functionTrading com SVMs: Desempenho Para obter uma sensação de desempenho SVM na negociação, eu executo configurações diferentes sobre o S038P 500 dados históricos de 8230 a 50s. O principal motivo por trás dessa década foi decidir quais parâmetros variam eo que manter constante antes de executar os testes mais importantes. Tratá-lo como um 8220in-sample8221 teste para evitar (mais)) over-fitting. Primeiramente, o gráfico de desempenho: S038P 500 Desempenho de negociação Muito bom A utilização dos 5 retornos diários remanescentes mostra um desempenho semelhante ao da estratégia ARMAGARCH, que me pareceu muito promissora. Se você quer saber por que eu estou tão animado sobre este fato, it8217s porque aqui estamos na área onde ARMAGARCH é melhor, e ainda, SVMs mostrar desempenho comparável. As estatísticas também são impressionantes: Ao escrever este post, encontrei outro esforço para usar SVMs na negociação pela Quantum Financier. Sua abordagem usa RSI de comprimento diferente como entrada para o SVM, mas também usa classificação (mapeia os retornos para dois valores, curtos ou longos) em vez de regressão. Desde que eu estava planejando tentar classificação de qualquer maneira, seu post me inspirou a implementá-lo e executar uma comparação adicional, regressão vs classificação: S038P 500 SVM Trading 8211 Regressão vs Classificação O que posso dizer 8211 ambos parecem funcionar perfeitamente. Como um leitor sugeriu nos comentários, a Classificação apresenta retornos mais consistentes. Olhando para a tabela, a classificação cortada em metade da redução máxima, mas, curiosamente, didn8217t melhorar a relação Sharpe significativamente. Nada conclusivo aqui, porém, foi uma corrida rápida das estratégias mais rápidas (em termos de tempo de execução). Ainda há uma longa lista de tópicos para explorar, apenas para lhe dar uma idéia, sem nenhuma ordem específica: Adicionar outros recursos. Principalmente pensando em adicionar algumas séries relacionadas ao Fed, estes dados remontam a 1960, por isso it8217s em breve :) Tente outros parâmetros svm: outras regressões, outras classificações, outros Kerenls, etc Isto é mais como um teste de estabilidade. Experimente outras funções de erro. O padrão é usar o erro quadrado médio, mas no caso de regressão, por que não usar Sharpe Ratio (in-sample) O caso de regressão é mais simples, uma vez que temos os retornos reais 8211 verificar a entrada de tune. control. Experimente períodos mais longos em vez de dias. Semanalmente é um começo, mas idealmente I8217d gostaria de implementar dois ou três períodos dia. Variar o período de loopback. Use mais classes com classificação: dias grandes, dias médios, etc. Isso levará tempo. Como sempre, feedback e comentários são bem-vindos. 1) Você tem Sharpe Ratios para SVM regressão vs SVM classificação Olhando para o gráfico, a classificação parece dar melhor risco ajustado retornos. 2) Você já ouviu falar do pacote Caret (caret. r-forge. r-project. org/index. html) Parece que já incorporou um monte de trabalho que eu vejo que você usa em seu código existente. Outra grande vantagem é que você pode facilmente trocar ML aprendendo algo (por exemplo redes neurais) sem ter que recodificar tudo. Muito interessante blog 1) Bom ponto, cortou o drawdown, mas não a relação Sharpe significativamente 8211 Eu atualizei o post. 2) Obrigado por trazer o pacote Caret, esta é a segunda vez que eu ouço sobre isso, então sobre o tempo para dar uma olhada. :) Parece bastante promissor, certamente muito para aprender com ele. Você compartilha seu código Os resultados são realmente impressionantes. I8217m tentando construir um classificador SVM fazer algo semelhante, mas eu quero usar mais parâmetros de preços. Embora, talvez isso não seja tão útil, porque parece que os preços sozinhos fornecem valor preditivo. Obrigado. Também estou planejando usar mais do que apenas os preços, mas esse tipo de dados não está disponível para os anos 50. Em geral, os 50s no S038P 500 são bastante preditivos. Modelos mais complexos tendem a ser necessários em diante. Verifique na postagem anterior (quintuitive / 2017/11/30 / trading-com-suporte-vetor-máquinas-svm /) na série 8211 há um link para o código que eu usei com base no pacote e1071. Desde que eu postei o código, eu mudei para o pacote caret que dá uma interface unificada para muitos modelos. Parece muito bom até agora também. Parece bom, obrigado por compartilhar. Tudo de bom. Eu também estou tentando usar SVM-SVR para prever fechar preço das ações ou seja: valor de índice como CAC40 DJ etc .. Minha idéia é muito simples e fácil, eu baixar os dados em um site de corretor, eu tenho acesso de 3 anos Desses dados. A resposta é o valor próximo do índice, eu suponho que as características do dia anterior têm um impacto do valor próximo dos próximos dias ou seja. Valor mais alto valor mais baixo valor de abertura para segunda-feira são características para prever, para explicar o valor de fechamento de terça-feira, eu construir meu conjunto de dados com este pressupostos, então eu uso recurso com lag1, obviamente eu posso adicionar outros recurso como lag2, lag3. Eu coloquei uma amostra da minha estrutura de dados aqui: openinglag1 higherlag1 smallestlag1 closing (response) volume lag1 3950.59 3959.2 3936.33 4013.97 589818 Finalmente tenho um conjunto de dados 764, todos os dados que eu uso para treinar o svr, e eu prever os próximos dias como Eu mencionei acima. Minhas perguntas são como posso prever, por exemplo, os próximos 5 dias É a minha estrutura de dados direita Não feliz com a previsão de rolamento em svmComputeForecasts Veja o que ele faz para modelPeriod8217weeks8217 por exemplo. Uma alternativa é fazer previsões semanais diretamente. Em outras palavras, resumir os dados em semanas (ou três / quatro pedaços dia) e chamar svmComputeForecasts usando 8216days8217 neste conjunto. Cada previsão aplica-se a todo o período. Tanto quanto eu sei, não se pode apenas fazer uma previsão probabilística com cinco dias de antecedência com SVMs (isso é factível com técnicas ARMA). Espero que isso ajude, Ivan Olá, eu tenho apreciado seus posts e tenho uma pergunta. Fiquei me perguntando que tipo de melhoria que você encontrou ao passar do modelo ARMA simples para o modelo ARMA-GARCH Você já testou qualquer outro rolling janela formação parâmetros Também você achou que o lado curto fez muita diferença (ou seja, é muito / Melhor ou pior) do que por muito tempo. Oi, Eu respondi a algumas dessas perguntas em um post posterior: quintuitive / 2017/12/27 / armagarch-experiences /. Adicionando mais estatísticas para o tutorial ARMAGARCH é certamente na minha lista, mas vai levar tempo. Pode-se fazer todas essas análises usando o indicador (quintuitive / wp-content / uploads / 2017/08 / gspcInd3.csv) juntamente com o GSPC do Yahoo. O indicador já está alinhado 8211 sem necessidade de atraso. Muito impressionante. No entanto, você tentou usar a floresta aleatória 8211 alega ser superior à SVM, pois permite efeitos não-lineares implícitos e termos de interação entre as variáveis ​​exógenas. Também diminui a variável exógena para os mais importantes criadores de jogos e é bastante rápido, bem como especialmente com o seu conjunto de dados. Oi e obrigado pela resposta anterior. Uma coisa que me confunde um pouco é que no post do ARMAGARCH (quintuitive / 2017/08/22 / arma-models-for-trading /) você menciona 18.87 CAGR e BampH parece estar a cerca de 7 CAGR de eyeballing o gráfico. No entanto, na tabela acima você mostra, 30,88 e 15,4 para ARMAGARCH e BH, respectivamente. 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 8220toy8221 que vai me manter ocupado por um tempo. As SVMs são uma ferramenta bem conhecida da área de Aprendizagem Automática supervisionada. E eles são usados ​​tanto para classificação e regressão. Para mais detalhes consulte a literatura. Parece-me que a aplicação mais intuitiva para negociação é a regressão, por isso let8217s começar por construir um modelo de regressão SVM. Seguindo nossa experiência com os modelos ARMAGARCH, vamos começar tentando prever retornos, em vez de preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos 5 dias anteriores como as características que determinam o retorno de um determinado dia. Vamos começar com o histórico de 500 dias como o conjunto de treinamento. Em termos mais matemáticos, para o conjunto de treinamento temos N características, para cada um deles temos M amostras. Temos também respostas M. Dada uma linha de valores de característica, a matriz esquerda, o SVM é treinado para produzir o valor de resposta. Em nosso exemplo específico, temos cinco colunas (características), cada coluna correspondente aos retornos com um retardo diferente (de 1 a 5). Temos 500 amostras e as respostas correspondentes. Uma vez que o SVM é treinado sobre este conjunto, podemos começar a alimentá-lo com conjuntos de cinco recursos, correspondente aos retornos para os cinco dias anteriores, eo SVM irá fornecer-nos com a resposta, que é o retorno previsto. Por exemplo, após o treinamento do 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, eu decidi escolher o pacote e1071.Uma segunda escolha foi o pacote kernlab, que eu ainda estou planejando para tentar no futuro. Então eu tentei algumas estratégias. Primeiro eu tentei algo muito semelhante à abordagem ARMAGARCH 8211 a Lag retorna dos cinco dias anteriores. Eu fiquei bastante surpreso ao ver esta estratégia de desempenho melhor do que o ARMAGARCH (esta é a terra natal do ARMAGARCH e eu teria sido muito 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 interativamente adicionando o recurso que minimiza o erro melhor. Esta abordagem melhorou as coisas ainda. Finalmente, eu tentei uma abordagem diferente com cerca de Uma dúzia de recursos. As características incluídas retornam ao longo do período de tempo diferente (1-dia, 2-dia, 5-dia, etc), algumas estatísticas (média, mediana, sd, etc) e volume. Eu usei a mesma abordagem ávida para selecionar recursos. Este sistema final mostrou um desempenho muito bom também, mas demorou um inferno de um tempo para correr. Tempo para terminar este post, os resultados de back-testing tem que esperar. Até então você pode jogar com o código-fonte completo sozinho. Aqui está um exemplo de como usá-lo: Nunca perca uma atualização Subscreva os R-blogueiros para receber e-mails com as últimas postagens R. (Você não verá esta mensagem novamente.)

No comments:

Post a Comment