Estratégia de negociação svm
Quintuitive
Opiniões Quantitativamente Intuitivas sobre Mercados.
Negociação com Support Vector Machines (SVM)
Finalmente, todas as estrelas se alinharam e eu posso dedicar com confiança algum tempo para o backtesting de novos sistemas de negociação, e as Support Vector Machines (SVM) são os novos brinquedos # & amp; # 8221; que vai me manter ocupado por um tempo.
As SVMs são uma ferramenta bem conhecida da área de Aprendizado de Máquina supervisionado e são usadas 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 vamos começar construindo um modelo de regressão SVM.
Seguindo nossa experiência com modelos ARMA + GARCH, começaremos tentando prever retornos, em vez de preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos cinco dias anteriores como os recursos que determinam o retorno de um determinado dia. Vamos começar com a 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 amostras M. Nós também temos respostas M.
Dada uma linha de valores de recurso, a matriz da esquerda, o SVM é treinado para produzir o valor de resposta. Em nosso exemplo específico, temos cinco colunas (recursos), cada coluna correspondendo aos retornos com um atraso diferente (de 1 a 5). Nós 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, após treinar o SVM nos 500 dias anteriores, usaremos os retornos para os dias 500, 499, 498, 497 e 496 (estes são os 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 próxima foi o pacote kernlab, que ainda estou planejando experimentar no futuro.
Então eu tentei algumas estratégias. Primeiro tentei algo muito semelhante à abordagem ARMA + GARCH & # 8211; os retornos defasados dos cinco dias anteriores. Fiquei bastante surpreso ao ver essa estratégia ter um desempenho melhor do que o ARMA + GARCH (essa é a terra natal do ARMA + GARCH e eu ficaria muito 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 interativamente o recurso que minimiza o erro. Essa 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 levou um bom tempo para ser executado.
Hora de terminar este post, os resultados do teste de volta têm que esperar. Até lá você pode jogar com o código fonte completo. Aqui está um exemplo de usá-lo:
Quintuitive
Opiniões Quantitativamente Intuitivas sobre Mercados.
Negociando com SVMs: Performance.
Para ter uma idéia do desempenho do SVM na negociação, eu corri diferentes configurações nos dados históricos S & # 038; P 500 do & # 8230; os anos 50. O motivo principal por trás dessa década foi decidir quais parâmetros variam e o que manter estável antes de executar os testes mais importantes. Trate-o como um & # 8220; em amostra & # 8221; teste para evitar (mais;)) ajuste excessivo. Primeiro o gráfico de desempenho:
S & # 038; Desempenho de Negociação P 500.
Muito agradável! Usando os 5 retornos diários com desfasamento mostra um desempenho semelhante à estratégia ARMA + GARCH, que eu achei muito promissor. Se você se pergunta por que estou tão empolgado com esse fato, é porque aqui estamos na área onde o ARMA + GARCH é o melhor e, no entanto, os SVMs mostram desempenho comparável.
As estatísticas também são impressionantes:
Enquanto escrevia este post, encontrei outro esforço para usar SVMs na negociação pela Quantum Financier. Sua abordagem usa o 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 a classificação de qualquer maneira, seu post me inspirou a implementá-lo e executar uma comparação adicional, regressão vs classificação:
S & # 038; P 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 exibe retornos mais consistentes.
Olhando para a mesa, a classificação cortou pela metade o rebaixamento máximo, mas curiosamente, não melhorou significativamente o índice de Sharpe. Nada conclusivo aqui, porém, foi uma corrida rápida das mais rápidas (em termos de tempo de execução) estratégias.
Ainda há uma longa lista de tópicos para explorar, apenas para ter uma ideia, sem nenhuma ordem específica:
Adicione outros recursos. Pensando principalmente em adicionar algumas séries relacionadas ao Fed, esses dados remontam a 1960, por isso é em breve. :) Tente outros parâmetros svm: outras regressões, outras classificações, outros kerenls, etc. Isto é mais como uma estabilidade. teste. Tente outras funções de erro. O padrão é usar o erro quadrático médio, mas, no caso de regressão, por que não usar o Índice de Sharpe (na amostra)? O caso de regressão é mais simples, já que temos os retornos reais & # 8211; verifique a entrada de tune. control. Tente períodos mais longos em vez de dias. Semanalmente é um começo, mas idealmente eu gostaria de implementar períodos de dois ou três dias. Varie o período de loopback. Use mais classes com classificação: dias grandes, dias médios, etc.
Isso levará tempo. Como sempre, comentários e comentários são bem-vindos.
1) Você tem taxas de Sharpe para regressão SVM vs classificação SVM? Ao olhar o gráfico, a classificação parece dar melhores retornos ajustados ao risco.
2) Você já ouviu falar do pacote Caret (caret. r-forge. r-project / index. html)? Parece que já incorporou muito do trabalho que vejo usar em seu código existente. Outro grande benefício é que você pode facilmente trocar um algoritmo de aprendizagem de ML (por exemplo, redes neurais) sem ter que recodificar tudo.
Blog muito interessante!
1) Bom ponto, cortou o rebaixamento, mas não a relação de 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 é hora de dar uma olhada mais de perto :) Parece muito promissor, certamente muito a aprender com isso.
Você compartilha seu código? Os resultados são realmente impressionantes. Eu estou tentando construir um classificador de SVM fazendo algo semelhante, mas quero usar mais parâmetros do que preços. Embora, talvez isso não seja tão útil, porque parece que os preços por si só 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 S & # 0; P 500 são bastante preditivos. Modelos mais complexos provavelmente serão necessários em diante.
Verifique o post anterior (quintuitive / 2012/11/30 / trading-com-suporte-vector-machines-svm /) na série & # 8211; existe um link para o código que usei com base no pacote e1071. Desde que postei o código, mudei-me para o pacote caret, que fornece uma interface unificada para muitos modelos. Parece muito bom até agora também.
Parece bom, obrigado por compartilhar. Muito bem sucedida.
Eu também estou tentando usar o SVM-SVR para prever o preço próximo dos estoques, ou seja, valor de índice como CAC40 DJ etc.
Minha ideia é muito simples e fácil, faço o download dos dados em um site de corretores, tenho acesso de 3 anos de dados de teses. A resposta é o valor próximo do índice, suponho que as características do dia anterior tenham um impacto do valor de fechamento dos próximos dias, ou seja: maior valor menor valor de abertura de valor para segunda-feira são recursos para prever, para explicar o valor de fechamento de terça-feira, eu construo meu conjunto de dados com estas suposições, então eu uso o recurso com lag1, obviamente, eu posso adicionar outros recursos como lag2, lag3. Eu coloquei uma amostra da minha estrutura de dados aqui:
openlag1 highestlag1 smallestlag1 fechamento (resposta) volume lag1.
3950,59 3959,2 3936,33 4013,97 589818.
Finalmente eu tenho um conjunto de dados 764, todo o conjunto de dados que eu estou usando para treinar o svr, e eu prevejo os próximos dias como mencionei acima.
Minhas perguntas são como posso prever, por exemplo, os próximos 5 dias? A minha estrutura de dados está correta?
Não está satisfeito com a previsão de rolamento em svmComputeForecasts? Veja o que ele faz para modelPeriod = & # 8217; weeks & # 8217; por exemplo.
Uma alternativa é fazer previsões semanais logo de cara. Em outras palavras, resuma os dados em semanas (ou três / quatro dias) e chame svmComputeForecasts usando & # 8216; dias & # 8217; neste conjunto. Cada previsão se aplica ao período inteiro.
Tanto quanto sei, não se pode simplesmente fazer uma previsão probabilística de cinco dias à frente com SVMs (isso é possível com as técnicas ARMA).
Espero que isto ajude,
Estou curtindo suas postagens e tenho uma pergunta. Eu queria saber que tipo de melhoria você encontrou ao mudar do modelo ARMA simples para o modelo ARMA-GARCH? Você já testou algum outro parâmetro de treinamento da janela rolante? Você também achou que o lado curto fez muita diferença (isto é, muito / melhor ou pior) do que apenas o tempo?
Oi, eu abordei algumas dessas questões em um post posterior: quintuitive / 2012/12/27 / armagarch-experiences /. Adicionando mais estatísticas para o tutorial ARMA + GARCH é certamente na minha lista, mas levará tempo. É possível fazer todas essas análises usando o indicador (quintuitive / wp-content / uploads / 2012/08 / gspcInd3.csv) junto com o GSPC do Yahoo. O indicador já está alinhado & # 8211; não há necessidade de atrasar.
Muito impressionante. No entanto você já tentou usar floresta aleatória & # 8211;
Ele afirma ser superior ao 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 criadores mais importantes e é bastante rápido, especialmente com o seu conjunto de dados.
Oi e obrigado pela resposta anterior. Uma coisa que eu estou um pouco confuso é que no post ARMA + GARCH (quintuitive / 2012/08/22 / modelos de arma para negociação /) você menciona 18,87% CAGR e B & amp; H parece ser de cerca de 7 % CAGR da análise do gráfico. No entanto, na tabela acima você mostra, 30,88% e 15,4% para ARMA + GARCH e BH, respectivamente.
É um horário diferente ou estou faltando alguma coisa? Obrigado novamente.
Eu vejo "# 8230; é apenas uma amostra de 5 anos aqui. Não consegui eliminar o comentário. Você tem CAGR para todos os sistemas em todos os anos?
Uma única estratégia de negociação de SVM.
As Support Vector Machines (SVM) estão ganhando popularidade nos sistemas de negociação de aprendizado de máquina. Eles têm vantagens de redes neurais (NN), como eles são garantidos para encontrar a solução ideal. O NN pode ser pego em um mínimo local, então, enquanto você obtém um resultado usando o NN, nunca pode ter certeza de que é o ideal. Além disso, se o NN for iniciado com pesos aleatórios, você provavelmente obterá um conjunto diferente de pesos sempre que executar a propagação 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), largura gaussiana (g) se estiver usando um kernel RBF e insensibilidade a epsilon (e) se estiver usando SVR (Support Vector Regression).
Meu uso de SVMs até agora foi usá-los na classificação, então eu só preciso selecionar os parâmetros C e g & # 8211; Eu uso o kernel RBF padrão. É difícil tentar prever se o mercado vai subir ou descer, quanto mais quanto.
Podemos selecionar esses parâmetros usando uma pesquisa de grade. Isso significa que simplesmente tentamos cada combinação de parâmetros e vemos qual funcionou melhor. A maneira como os parâmetros são avaliados é através da validação cruzada de n-fold.
Validação cruzada.
Isso é melhor explicado com um exemplo. Se tivermos 1000 instâncias de treinamento rotuladas e usarmos validação cruzada de 10 vezes, para cada combinação de C, g, fazemos o seguinte:
Aleatoriamente tire 10% das amostras. Este é 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 espera. 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 à conclusão lógica e ter apenas uma única ocorrência em "hold-out" definida. Esta é uma validação cruzada de deixar uma saída. 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?
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 em deep-thought. co. Nos exemplos abaixo, eu uso DeepThought.
A primeira coisa que precisamos é de alguns dados. Vou usar um conjunto de treinamento com os seguintes recursos.
Hora do dia Diferença de preço médio entre as 30 barras anteriores Diferenças médias móveis entre as barras 1,2,3,4,5,7,9,13,16,20,25,31,45,55,70,100 anteriores com MA períodos de 5, 10, 20, 50 e 100.
O alvo é -1 para o preço cair no final da próxima barra, 1 para o preço subir no final da próxima barra. Depois de definir isso na configuração, executo o comando.
para extrair o conjunto de treinamento. Eu também uso escalonamento min-max. Discutirei a preparação de recursos e o dimensionamento em outro artigo. O comando acima criará arquivos de treinamento de todos os modelos definidos na configuração DeepThought. Depois que o comando concluir um arquivo h4-features. training. data, será criado o mesmo diretório do qual executei o comando. Isso está no formato libSVM, portanto, podemos usar as ferramentas libSVM para executar a pesquisa de grade ou usar a pesquisa de 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 usá-lo em outras ferramentas, como R, Python, Excel etc.
Para executar a pesquisa de grade no DeepThought, uso o comando:
Os resultados estão no arquivo de log em que Resultado: é a precisão percentual:
Os resultados (desinteressantes) no meio foram removidos por brevidade. Podemos ver que o SVM parece favorecer gamas menores e o C parece ser um valor sensível. Devemos nos preocupar se o melhor gama é grande e o C pequeno, o que provavelmente significa algum tipo de erro de dados. Os próximos valores mais altos são aproximadamente os mesmos que os melhores parâmetros, o que indica que a seleção de parâmetros é relativamente insensível. Devemos nos preocupar se os valores que dão o melhor resultado são outliers.
Backtesting a única estratégia de SVM.
A etapa 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 formos longos e recebermos um sinal de compra, adicionamos outra posição a um tamanho máximo de posição de 10. Por outro lado, para os sinais de venda.
Usando o melhor C de 128 e gama de 0.00195313, podemos cortar e passar o seguinte fragmento XML do arquivo de log de pesquisa da grade para o arquivo de configuração DeepThought:
O backtest é executado com o seguinte comando:
O backtest DeepThought opera criando um conjunto de treinamento no final de cada barra, o EURUSD H4 neste caso. Quando o fechamento da próxima barra é atingido, uma previsão é feita e as operações são entradas e / ou fechadas, então o modelo é novamente treinado pronto para a próxima barra. Assim, ele está continuamente se adaptando às condições mais recentes 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):
Parece que está tudo bem, mas provavelmente não é algo que nós trocamos como está.
O próximo artigo discutirá os conjuntos para ver se podemos melhorar este resultado.
Negociando com SVMs: Performance.
Desempenho de Negociação S & P 500.
Muito agradável! Usando os 5 retornos diários com desfasamento mostra um desempenho semelhante à estratégia ARMA + GARCH, que eu achei muito promissor. Se você se perguntar por que estou tão empolgado com esse fato, é porque aqui estamos na área em que o ARMA + GARCH é o melhor e, no entanto, os SVMs mostram desempenho comparável.
As estatísticas também são impressionantes:
Enquanto escrevia este post, encontrei outro esforço para usar SVMs na negociação pela Quantum Financier. Sua abordagem usa o 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 a classificação de qualquer maneira, seu post me inspirou a implementá-lo e executar uma comparação adicional, regressão vs classificação:
S & P 500 SVM Trading - Regressão vs Classificação.
O que posso dizer - ambos parecem funcionar perfeitamente. Como um leitor sugeriu nos comentários, a Classificação exibe retornos mais consistentes.
Olhando para a mesa, a classificação cortou pela metade o rebaixamento máximo, mas, curiosamente, não melhorou significativamente o índice de Sharpe. Nada conclusivo aqui, porém, foi uma corrida rápida das mais rápidas (em termos de tempo de execução) estratégias.
Ainda há uma longa lista de tópicos para explorar, apenas para ter uma ideia, sem nenhuma ordem específica:
Adicione outros recursos. Pensando principalmente em adicionar algumas séries relacionadas ao Fed, esses dados remontam a 1960, então está chegando. :) Tente outros parâmetros svm: outras regressões, outras classificações, outros kerenls, etc. Isto é mais como um teste de estabilidade. Tente outras funções de erro. O padrão é usar o erro quadrático médio, mas, no caso de regressão, por que não usar o Índice de Sharpe (na amostra)? O caso de regressão é mais simples, já que temos os retornos reais - verifique a entrada de tune. control. Tente períodos mais longos em vez de dias. Semanalmente é um começo, mas, idealmente, gostaria de implementar períodos de dois ou três dias. Varie o período de loopback. Use mais classes com classificação: dias grandes, dias médios, etc.
Isso levará tempo. Como sempre, comentários e comentários são bem-vindos.
Negociação com Support Vector Machines (SVM)
Finalmente todas as estrelas se alinharam e eu posso dedicar algum tempo para o back-testing de novos sistemas de negociação, e o Support Vector Machines (SVM) é o novo “brinquedo” que vai me manter ocupado por um tempo.
As SVMs são uma ferramenta bem conhecida da área de Aprendizado de Máquina supervisionado e são usadas 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 vamos começar construindo um modelo de regressão SVM.
Seguindo nossa experiência com modelos ARMA + GARCH, começaremos tentando prever retornos, em vez de preços. Da mesma forma, em nossos primeiros testes, usaremos apenas os retornos dos cinco dias anteriores como os recursos que determinam o retorno de um determinado dia. Vamos começar com a 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 amostras M. Nós também temos respostas M.
Dada uma linha de valores de recurso, a matriz da esquerda, o SVM é treinado para produzir o valor de resposta. Em nosso exemplo específico, temos cinco colunas (recursos), cada coluna correspondendo aos retornos com um atraso diferente (de 1 a 5). Nós 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, após treinar o SVM nos 500 dias anteriores, usaremos os retornos para os dias 500, 499, 498, 497 e 496 (estes são os 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 próxima foi o pacote kernlab, que ainda estou planejando experimentar no futuro.
Então eu tentei algumas estratégias. Primeiro, tentei algo muito semelhante à abordagem ARMA + GARCH - os retornos defasados dos cinco dias anteriores. Fiquei bastante surpreso ao ver essa estratégia ter um desempenho melhor do que o ARMA + GARCH (essa é a terra natal do ARMA + GARCH e eu ficaria muito 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 interativamente o recurso que minimiza o erro. Essa abordagem melhorou ainda mais as coisas.
Finalmente, tentei uma abordagem diferente com cerca de uma dúzia de recursos. Os recursos incluídos retornam ao longo de 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 levou um bom tempo para ser executado.
Hora de terminar este post, os resultados do teste de volta têm que esperar. Até lá você pode jogar com o código fonte completo. Aqui está um exemplo de usá-lo:
Комментарии
Отправить комментарий