Estratégias de Backtesting com R.
Começamos carregando basic_symbols () na variável de símbolos:
getSymbols () faz parte do pacote quantmod que foi carregado automaticamente quando nós colocamos quantstrat. Ele deveria ter sido instalado automaticamente quando você instala o quantstrat.
Nós enviamos uma solicitação através de getSymbols () para baixar dados. Podemos usar qualquer uma das seguintes fontes:
Para dados que não sejam ações, podemos usar:
Fonte FRED (Dados Econômicos da Reserva Federal); FRED contém dados como desemprego, PIB, taxas de tesouraria e muito mais.
OANDA é um serviço de assinatura para dados de divisas e divisas.
A primeira coisa que você observa é a mensagem de aviso. Como afirma, só aparecerá na primeira vez que você executar getSymbols () em uma nova sessão.
Símbolos: um ou um vetor de símbolos múltiplos.
src: string, nossa fonte. Neste caso, Yahoo!
index. class: POSIXct. Isso define a classe do nosso índice de objetos xts.
de: string, primeira data dos dados que queremos recuperar.
fim: string, última data de dados que queremos recuperar.
ajustar: booleano, seja para ajustar nossos dados ou não. Sugerido para definir como VERDADEIRO.
getSymbols irá carregar objetos xts para cada um dos símbolos que passamos para o nosso ambiente global. Podemos visualizar os dados como faria com qualquer outro conjunto de dados.
Acessamos dados do Google como Yahoo! apenas alterando o parâmetro src.
Para carregar dados através do banco de dados MySQL, precisamos fornecer parâmetros adicionais: dbname, usuário, senha e host. O usuário precisa ter privilégios SELECT, mas nada mais para nossos propósitos.
getSymbols () atualmente não permite a passagem de valores de banco de dados através de um arquivo my. cnf. Os parâmetros são verificados no início da função, então você precisa incluí-los na chamada ou incluí-los em um arquivo R escondido fora do diretório do projeto e criar o arquivo.
Seu banco de dados deve conter uma tabela chamada por símbolo, uma para cada símbolo. Cada tabela deve ter os seguintes campos: data, o, h, l, c, v e a. Se sua tabela tiver nomes de campos diferentes, você deve adicioná-los ao parâmetro db. fields como um vetor de caracteres.
Você também pode alterar os nomes dos campos conforme eles são importados para R usando o parâmetro field. names. No entanto, nada disso é necessário, desde que db. fields atenda aos critérios padrão.
Os dados no meu banco de dados são uma duplicação do Yahoo !. A saída abaixo é mostrar o sucesso da chamada getSymbols (src = & quot; MySQL & quot;).
Para este exemplo, nós furaremos nos símbolos que usamos anteriormente. O FRED contém mais de 11.000 conjuntos de dados econômicos sem nenhum custo.
Vejamos a Taxa de Tesouraria de 10 anos:
Observe que a cauda da url tem a string alfanumérica DGS10 que usaremos em nossa chamada getSymbols ().
Observe que nossa ligação é menor do que a anterior; não precisamos classificar o índice nem precisamos ajustar os dados.
Além disso, passar parâmetros de dados não parece fazer nada; Todo o conjunto de dados é retornado.
Eu usarei quantmod :: chartSeries () para traçar os dados:
Quantstrat forex
Solicitações de envio 11.
Participe do GitHub hoje.
O GitHub é o lar de mais de 20 milhões de desenvolvedores que trabalham juntos para hospedar e rever o código, gerenciar projetos e criar software juntos.
Clone com HTTPS.
Use o Git ou o check-out com o SVN usando o URL da web.
A QSForex é uma plataforma de negociação de backtesting e de negociação aberta de código aberto para uso nos mercados cambiais ("forex"), atualmente em um estado "alfa".
Ele foi criado como parte da série Forex Trading Diary no QuantStart para fornecer à comunidade comercial sistemática um motor de negociação robusto que permite a implementação e o teste direto da estratégia forex.
O software é fornecido sob uma licença permissiva "MIT" (veja abaixo).
Open-Source - QSForex foi lançado sob uma Licença MIT de código aberto extremamente permissiva, que permite o uso total em aplicativos comerciais e de pesquisa, sem restrições, mas sem garantia de qualquer tipo. Grátis - QSForex é completamente gratuito e não custa nada para baixar ou usar. Colaboração - Como o QSForex é de código aberto, muitos desenvolvedores colaboram para melhorar o software. Novos recursos são adicionados com freqüência. Todos os erros são rapidamente determinados e corrigidos. Desenvolvimento de Software - QSForex está escrito na linguagem de programação Python para suporte direto à plataforma cruzada. QSForex contém um conjunto de testes unitários para a maioria do seu código de cálculo e novos testes são constantemente adicionados para novos recursos. Arquitetura dirigida a eventos - O QSForex é completamente conduzido por eventos tanto para backtesting quanto para negociação ao vivo, o que leva a uma transição direta de estratégias de uma fase de pesquisa / teste para uma implementação de negociação ao vivo. Custos de transação - Os custos de spread são incluídos por padrão para todas as estratégias testadas anteriormente. Backtesting - QSForex possui backtesting de vários dias de multi-moeda multi-dia intradía. Negociação - O QSForex atualmente oferece suporte à negociação intradiária ao vivo usando a OANDA Brokerage API em um portfólio de pares. Métricas de desempenho - O QSForex atualmente oferece suporte a medição básica de desempenho e visualização de equidade através das bibliotecas de visualização Matplotlib e Seaborn.
Visite oanda / e configure uma conta para obter as credenciais de autenticação da API, que você precisará realizar uma negociação ao vivo. Explico como realizar isso neste artigo: https: // quantstart / articles / Forex-Trading-Diary-1-Automated-Forex-Trading-with-the-OANDA-API.
Clonar este repositório git em um local adequado em sua máquina usando o seguinte comando em seu terminal: git clone https: //github/mhallsmoore/qsforex. git. Alternativa, você pode baixar o arquivo zip do ramo mestre atual em https: //github/mhallsmoore/qsforex/archive/master. zip.
Crie um conjunto de variáveis de ambiente para todas as configurações encontradas no arquivo settings. py no diretório raiz do aplicativo. Alternativamente, você pode "codificar" suas configurações específicas substituindo as chamadas os. environ. get (.) Por cada configuração:
Isso criará um novo ambiente virtual para instalar os pacotes. Supondo que você baixou o repositório QSForex git em um diretório de exemplo, como.
/ projects / qsforex / (altere este diretório abaixo para onde você instalou QSForex), então, para instalar os pacotes, você precisará executar os seguintes comandos:
Isso levará algum tempo, como NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib devem ser compilados. Há muitos pacotes necessários para que isso funcione, então por favor dê uma olhada nestes dois artigos para obter mais informações:
Você também precisará criar um link simbólico do seu diretório de pacotes do site para seu diretório de instalação QSForex para poder chamar importar qsforex dentro do código. Para fazer isso, você precisará de um comando semelhante ao seguinte:
Certifique-se de mudar.
/ projects / qsforex para o diretório de instalação e.
/venv/qsforex/lib/python2.7/site-packages/ para o seu diretório de pacotes do site virtualenv.
Agora você poderá executar os comandos subseqüentes corretamente.
Nesta fase, se você simplesmente deseja realizar práticas ou negociação ao vivo, você pode executar o python trading / trading. py, que usará a estratégia de negociação padrão do TestStrategy. Isso simplesmente compra ou vende um par de moedas cada 5 vezes. É puramente para testar - não use isso em um ambiente de comércio ao vivo!
Se você deseja criar uma estratégia mais útil, basta criar uma nova classe com um nome descritivo, por exemplo, MeanReversionMultiPairStrategy e assegure-se de que ele tenha um método de calcule_signals. Você precisará passar esta classe a lista de pares, bem como a fila de eventos, como em trading / trading. py.
Por favor, consulte Strategy / Strategy. py para obter detalhes.
Para realizar qualquer backtesting, é necessário gerar dados de Forex simulados ou baixar dados de ticks históricos. Se você deseja simplesmente testar o software, a maneira mais rápida de gerar um exemplo de backtest é gerar alguns dados simulados. O formato de dados atual usado pelo QSForex é o mesmo que o fornecido pelo DukasCopy Historical Data Feed em https: // dukascopy / swiss / english / marketwatch / historical /.
Para gerar alguns dados históricos, verifique se a configuração CSV_DATA_DIR na settings. py é configurar para um diretório onde deseja que os dados históricos sejam exibidos. Você então precisa gerar generate_simulated_pair. py, que está no diretório / script. Ele espera um único argumento de linha de comando, que neste caso é o par de moedas no formato BBBQQQ. Por exemplo:
Nesta fase, o script é codificado para criar dados de um único mês para janeiro de 2018. Ou seja, você verá arquivos individuais, do formato BBBQQQ_YYYYMMDD. csv (por exemplo, GBPUSD_20180112.csv) aparecem em seu CSV_DATA_DIR para todos os dias úteis desse mês. Se você deseja alterar o mês / ano da saída de dados, simplesmente modifique o arquivo e re-execute.
Agora que os dados históricos foram gerados, é possível realizar um backtest. O arquivo backtest em si é armazenado no backtest / backtest. py, mas isso contém apenas a classe Backtest. Para realmente executar um backtest, você precisa instanciar esta classe e fornecer os módulos necessários.
A melhor maneira de ver como isso é feito é olhar para o exemplo de Implementação de Crossover em Moving Average no arquivo examples / mac. py e usá-lo como um modelo. Isso faz uso do MovingAverageCrossStrategy que é encontrado em strategy / strategy. py. Este padrão é negociar GBP / USD e EUR / USD para demonstrar uso de par de moedas múltiplas. Ele usa dados encontrados em CSV_DATA_DIR.
Para executar o exemplo backtest, simplesmente execute o seguinte:
Isso vai levar algum tempo. No meu sistema de desktop Ubuntu em casa, com os dados históricos gerados via generate_simulated_pair. py, leva cerca de 5-10 minutos para serem executados. Uma grande parte deste cálculo ocorre no final do backtest real, quando o drawdown está sendo calculado, então lembre-se de que o código não foi desligado! Deixe-o até a conclusão.
Se você deseja visualizar o desempenho do backtest, você pode simplesmente usar output. py para ver uma curva de equivalência patrimonial, retornos de período (ou seja, tick-to-tick) e uma curva de redução:
E é isso! Nesta fase, você está pronto para começar a criar os seus backtests modificando ou anexando estratégias em strategy / strategy. py e usando dados reais baixados da DukasCopy (https: // dukascopy / swiss / english / marketwatch / historical /).
Se você tiver dúvidas sobre a instalação, então fique à vontade para me enviar um e-mail no mike @ quantstart.
Se você tiver algum erro ou outros problemas que você acha que podem ser devido especificamente à base de código, sinta-se à vontade para abrir um problema Github aqui: https: // github / mhallsmoore / qsforex / issues.
Copyright (c) 2018 Michael Halls-Moore.
A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para lidar com o Software sem restrições, incluindo, sem limitação, os direitos de uso, cópia, modificação, mesclagem , publicar, distribuir, sublicenciar e / ou vender cópias do Software e permitir que pessoas a quem o Software seja fornecido, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todas as cópias ou porções substanciais do Software.
O SOFTWARE É FORNECIDO "NO ESTADO EM QUE SE ENCONTRAM", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, APTIDÃO PARA UM PROPÓSITO ESPECÍFICO E NÃO INFRACÇÃO. EM NENHUMA CIRCUNSTÂNCIA, OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENDO, DESTE OU RELACIONADO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NA PROGRAMAS.
A negociação de câmbio em margem comporta um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar uma perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas.
&cópia de; 2018 GitHub, Inc. Termos Privacidade Segurança Status Ajuda.
Você não pode executar essa ação neste momento.
Você fez login com outra guia ou janela. Recarregue para atualizar sua sessão. Você se separou em outra guia ou janela. Recarregue para atualizar sua sessão.
Quantstrat forex
Obter através da App Store Leia esta publicação em nosso aplicativo!
Carteiras e contas de várias moedas com R Blotter e quantstrat.
Qual é a melhor metodologia para modelagem com várias moedas na conta e títulos com diferentes divisas em uma carteira?
É melhor manter as carteiras e contas de moeda única? Manipulará, em seguida, lidar com fx quando necessário e como você carrega taxas de fx para. blotter? Alternativamente, as contas podem ser multi-moeda com valores de capital em várias moedas?
Fico feliz em brincar com os detalhes, mas posso realmente fazer conselhos sobre a abordagem geral de um especialista em borrão.
Desculpe-se se isso foi abordado em outro lugar. Eu procurei e não consegui encontrá-lo.
Exemplo: Um universo de 5 ações em USD e 5 ações em EUR. Crie uma estratégia que comercialize os 5 retornos mais elevados em% nos últimos 3 meses (ou seja, o retorno do estoque USD é tanto o estoque como o retorno da fx).
Uma conta em borrão tem apenas uma moeda.
Um portfólio também possui apenas uma moeda resumo.
os instrumentos possuem uma moeda.
Uma carteira pode deter instrumentos em qualquer moeda, mas o resumo da carteira só será marcado na moeda resumida.
Uma conta pode armazenar muitas carteiras.
Dado o seu exemplo, é provável que você deseje portfólios separados para seus instrumentos EUR e USD e marque a conta em qualquer moeda que seja conveniente para a conta.
QuantStrat TradeR.
Comércio, QuantStrat, R e muito mais.
Qual proporção de volatilidade implícita é melhor?
Esta publicação será sobre comparar um sinal de volatilidade usando três variações diferentes de índices de volatilidade implícita para prever quando inserir uma posição de volatilidade curta.
Na negociação de volatilidade, existem três índices de volatilidade implícitos separados que têm um histórico bastante longo para a negociação, o VIX (todo mundo conhece esse), o VXV (mais recentemente mudado para ser chamado de VIX3M), que é como o VIX, exceto por um período de três meses), e o VXMT, que é o período implícito de volatilidade de seis meses.
Esta relação dá investigação em três razões de volatilidade implícitas separadas: VIX / VIX3M (também conhecido como VXV), VIX / VXMT e VIX3M / VXMT, como preditores para inserir uma posição de volatilidade curta (ou longa).
Então, vamos obter os dados.
Uma estratégia rápida para investigar é simples, a idéia de que o índice deve ser inferior a 1 (I. E. contango na estrutura do termo de volatilidade implícita) e diminuir (abaixo de uma média móvel). Portanto, quando o índice for inferior a 1 (ou seja, com volatilidade implícita a longo prazo maior do que a curto prazo), e a proporção estará abaixo da média móvel de 60 dias, a estratégia assumirá uma posição no XIV.
Aqui é o código para fazer isso.
Com a seguinte performance:
Em outras palavras, o VIX3M / VXMT apresenta os menores descontos (por uma grande margem) com retornos mais elevados.
Assim, quando as pessoas falam sobre o índice de volatilidade implícita para usar, acho que isso oferece algumas evidências fortes para o horizonte mais longo como um preditor para o qual a estrutura de termo implícita de vol para usar. É também por isso que é a base da minha estratégia de inscrição.
Obrigado pela leitura.
NOTA: Estou atualmente buscando uma posição de tempo integral (remoto ou no nordeste dos EUA) relacionada ao meu conjunto de habilidades demonstrado neste blog. Por favor, envie-me no LinkedIn se você souber de qualquer oportunidade que possa beneficiar do meu conjunto de habilidades.
Replicando Volatilidade ETN Retorna De CBOE Futures.
Esta publicação irá demonstrar como replicar os ETN de volatilidade (XIV, VXX, ZIV, VXZ) dos futuros CBOE, permitindo que qualquer pessoa crie retorno ETF sintético antes do início, sem custo.
Então, antes de chegar ao algoritmo real, isso depende de uma atualização para o algoritmo de estrutura do termo que eu compartilhei alguns meses atrás.
Nesse algoritmo, por engano (ou com a finalidade da simplicidade), usei dias de calendário como o tempo de expiração, quando deveria ter sido dias úteis, o que também é responsável por fins de semana e feriados, que são um artefato irritante para acompanhar .
Então, aqui é a mudança saliente, no loop que calcula tempos para expirar:
A linha saliente em particular, é esta:
O que é esta função bizdays? Ele vem do pacote de bizdays em R.
Há também o script tradingHolidays. R, que faz mais uso do pacote bizdays. Aqui, o que se passa sob o capô no tradingHolidays. R, para aqueles que desejam replicar o código:
Existem dois CSVs que eu compilado manualmente, mas compartilharemos capturas de tela do & # 8211; são as férias da Páscoa (porque eles precisam ser ajustados para virar domingo a sexta-feira por causa das sextas da Páscoa) e o resto dos feriados nacionais.
Aqui está o que a easter csv parece:
E o nonEasterHolidays, que contém o Dia do Ano Novo, Dia de MLK Jr., Dia do Presidente, Dia do Memorial Day, Dia da Independência, Dia do Trabalho, Dia de Ação de Graças e Dia de Natal (juntamente com as datas observadas) CSV:
Além disso, precisamos ajustar os dois dias em que as ações não foram negociadas devido ao furacão Sandy.
Então, a lista de férias parece assim:
Assim, uma vez que temos uma lista de feriados, usamos o pacote bizdays para definir os feriados e os fins de semana (sábado e domingo) como nossos dias não comerciais e usamos essa função para calcular os horários corretos para expirar.
Então, agora que temos a estrutura de expiração atualizada, podemos escrever uma função que irá replicar corretamente os 4 ETNs de volatilidade principal e # 8211; XIV, VXX, ZIV e VXZ.
Aqui é a explicação em inglês:
O VXX é composto por dois contratos, o mês de frente e o mês de atraso, e tem um certo número de dias de negociação (AKA dias úteis) que eleva até expirar, digamos, 17. Durante esse período, o primeiro mês ( Deixe-se chamar M1) vai de ser a totalidade da alocação de fundos, a não ser a alocação de fundos, à medida que o contrato do mês da frente se aproxima do prazo de validade. Ou seja, à medida que um contrato se aproxima do prazo de validade, o segundo contrato recebe gradualmente cada vez mais peso, até que, no termo do contrato do mês da frente, o contrato do segundo mês contenha todos os fundos # 8211, assim como * * * o primeiro mês contrato. Então, diga que você tem 17 dias para expirar no primeiro mês da frente. No termo do contrato anterior, o segundo mês terá um peso de 17/17 & # 8211; 100%, já que se torna o primeiro mês. Então, no próximo dia, esse contrato, agora o primeiro mês, terá um peso de 16/17 no momento, depois 15/17, e assim por diante. Esse numerador é chamado de dr, e o denominador é chamado dt.
No entanto, além disso, há um segundo mecanismo que é responsável pelo VXX que parece, em comparação com um contrato de futuros básico (ou seja, a decadência responsável pela baixa volatilidade dos lucros) e Esse é o & # 8220; instantâneo & # 8221; reequilíbrio. Ou seja, os retornos para um determinado dia são hoje ajustados multiplicados pelos pesos de ontem, sobre os ajustes de ontem multiplicados pelos pesos de ontem, menos um. Ou seja, (S_1_t * dr / dt_t-1 + S_2_t * 1-dr / dt_t-1) / (S_1_t-1 * dr / dt_t-1 + S_2_t-1 * 1-dr / dt_t-1) & # 8211; 1 (Eu poderia usar um tutorial no LaTeX). Então, quando você avança um dia, bem, amanhã, os pesos de hoje se tornam t-1. No entanto, quando os recursos podiam ser reequilibrados? Bem, nos ETNs como VXX e VXZ, o & # 8220; hand-waving & # 8221; é que isso acontece instantaneamente. Ou seja, o peso para o primeiro trimestre foi de 93%, o retorno foi realizado na liquidação (isto é, do acordo para liquidar), e imediatamente após esse retorno foi realizado, o peso do mês da frente muda de 93% para, digamos, 88%. Então, digamos que o Credit Suisse (que emite esses ETNs), tem US $ 10.000 (apenas para manter a aritmética e o número de zeros toleráveis, obviamente, há muito mais na realidade) do XIV em circulação depois de perceber imediatamente os retornos, venderá US $ 500 US $ 9300 no mês da frente e imediatamente movê-los para o segundo mês, então passará imediatamente de US $ 9300 em M1 e US $ 700 em M2 para US $ 8800 em M1 e US $ 1200 em M2. Quando esses $ 500 se moveram? Imediatamente, instantaneamente, e se você quiser, você pode aplicar a terceira lei da Clarke & # 8217; chamada e # 8220; magicamente & # 8221 ;.
A única exceção é o dia após o dia do rolo, no qual o segundo mês simplesmente se torna o mês da frente, já que o mês da frente anterior expira, então o que foi um peso de 100% no segundo mês agora será um peso de 100% no primeiro mês da frente, então há algum código extra que precisa ser escrito para fazer essa distinção.
É assim que funciona para VXX e XIV. Qual a diferença para VXZ e ZIV? É realmente simples, em vez de M1 e M2, o VXZ usa as mesmas ponderações exatas (ou seja, o tempo restante no primeiro mês frente a quantos dias existem para que o contrato seja o primeiro mês), usa M4 , M5, M6 e M7, com M4 tomando dr / dt, M5 e M6 sempre sendo 1, e M7 sendo 1-dr / dt.
Em qualquer caso, aqui está o código.
Então, um grande agradecimento a Michael Kapler da Systematic Investor Toolbox por fazer a replicação original e fornecer seu código. O meu código essencialmente faz a mesma coisa, espero que seja mais comentado.
Então, em última análise, isso funciona? Bem, usando meu código de estrutura de prazo atualizado, posso testar isso.
Enquanto eu não irei colar meu código de estrutura de todo o termo (novamente, disponível aqui, basta atualizar o script com minhas atualizações a partir desta postagem), aqui é como você executou a nova função # 8217; d:
E uma vez que retorna o vxx retorna e o vxz retorna, podemos comparar ambos.
Com o resultado:
Basicamente, uma combinação perfeita.
Vamos fazer o mesmo, com ZIV.
Então, a reconstrução do futuro faz um pouco melhor que o ETN. Mas a trajetória é em grande parte idêntica.
Isso conclui esta publicação. Espero que tenha esclarecido sobre como esses ETN de volatilidade funcionam e como obtê-los diretamente dos dados de futuros publicados pelo CBOE, que são as entradas para o meu algoritmo de estrutura de termos.
Isso também significa que, para as instituições interessadas em negociar minha estratégia, que elas possam obter alavancagem para trocar as variáveis replicadas futura-composta desses ETNs, em maior volume.
Obrigado pela leitura.
NOTAS: Para aqueles interessados em uma estratégia de assinatura de varejo para a volatilidade da negociação, não hesite em assinar minha estratégia de negociação de volatilidade. Para os interessados em me empregar em tempo integral ou para projetos de consultoria de longo prazo, eu posso ser contactado no meu LinkedIn, ou meu e-mail: ilya. kipnis@gmail.
(Don & # 8217; t Get) Contangled Up In Noise.
Este post será sobre investigar a eficácia de contango como um sinal de negociação de volatilidade.
Para aqueles que comercializam volatilidade (como eu), um termo que você pode ver que é um pouco onipresente é o termo & # 8220; contango & # 8221 ;. O que este termo significa?
Bem, simples: significa apenas a proporção do segundo mês dos futuros VIX sobre o primeiro. A idéia é que, quando o segundo mês dos futuros é mais do que o primeiro, a perspectiva das pessoas para a volatilidade é maior no futuro do que para o presente e, portanto, os futuros são "contango & # 8221 ;, que é a maior parte do tempo.
Além disso, aqueles que tentam encontrar idéias de negociação de volatilidade decente podem ter visto muitas vezes que os futuros no contango implicam que a manutenção de uma pequena posição de volatilidade será rentável.
Este é o caso?
Bem, existe uma maneira fácil de responder a isso.
Em primeiro lugar, consulte minha postagem na obtenção de dados de futuros gratuitos do CBOE.
Usando esses dados, podemos obter nosso sinal (isto é, para executar o código nesta publicação, execute o código naquele post).
Agora, vamos obter os nossos dados XIV (novamente, um grande agradecimento ao Sr. Helmuth Vollmeier por providenciar tão gentilmente isso.
Agora, aqui é como isso funciona: como o CBOE não atualiza seus ajustes até cerca de 9:45 AM EST no dia seguinte (por exemplo, os dados de liquidação de terça-feira, não foram liberados até Quarta-feira às 9h45 da manhã), temos que entrar no fim do dia após o incêndio. (Para aqueles que se perguntam, minha estratégia de assinatura usa este mecanismo, dando aos assinantes tempo suficiente para executar ao longo do dia.)
Então, vamos calcular nossos backtest retorna. Aqui é uma função stratStats para calcular algumas estatísticas resumidas.
Com os seguintes resultados:
Então, isso é obviamente um desastre. A inspeção visual mostrará devastadores, triagens plurianuais. Usando o comando table. Drawdowns, podemos ver os piores.
Então, o top 3 é horrível, e então qualquer coisa acima de 30% ainda é bastante horrível. Algumas dessas retiradas duraram vários anos também, com um comprimento maciço para a calha. 458 dias de negociação é quase dois anos, e 364 é de aproximadamente um ano e meio. Imagine ver uma estratégia consistentemente no lado errado do comércio por quase dois anos, e quando tudo é dito e feito, você perdeu três quartos de tudo nessa estratégia.
Não há nenhum revestimento de açúcar: uma tal estratégia só pode ser chamada de lixo total.
Vamos tentar uma modificação: exigiremos contango (C2 & gt; C1), e que contango esteja acima da média móvel simples de 60 dias, semelhante à minha estratégia VXV / VXMT.
Com os resultados:
Então, um Calmar ainda com segurança abaixo de 1, um índice de desempenho de úlcera ainda no porão, uma redução máxima que passou o ponto em que as pessoas teriam abandonado a estratégia, e assim por diante.
Então, mesmo que tenha sido melhorado, ainda é seguro dizer que esta estratégia não funciona muito bem. Mesmo após a grande retirada de 2007-2008, ainda recebe algumas coisas muito erradas, como estar exposto a todo o mês de agosto de 2017.
Embora eu pense que existem aplicações para contango em investimentos de volatilidade, não acho que o seu uso seja gerar o sinal de volatilidade longo / curto por conta própria. Em vez disso, acho que outros índices e fontes de dados fazem um trabalho melhor disso. Como o VXV / VXMT, que desde então foi iterado para formar minha estratégia de assinatura.
Obrigado pela leitura.
NOTA: Atualmente, estou buscando oportunidades de rede, projetos de longo prazo e posições de tempo integral relacionadas ao meu conjunto de habilidades. Meu perfil linkedIn pode ser encontrado aqui.
Comparando algumas estratégias de fácil volatilidade de investimento e o comando Table. Drawdowns.
Esta publicação será sobre comparar estratégias do papel & # 8220; Easy Volatility Investing & # 8221 ;, juntamente com uma demonstração do comando de R & # 8217; s table. Drawdowns.
Em primeiro lugar, antes de ir mais longe, enquanto penso que os pressupostos de execução encontrados no EVI não oferecem boas estratégias para o comércio vivo real (embora os compromissos de risco / recompensa também deixem muito espaço para melhorar), acho que essas estratégias são excelentes como benchmarks.
Então, há algum tempo, fiz um teste fora de amostra para uma das estratégias encontradas no EVI, que pode ser encontrada aqui.
Usando a mesma fonte de dados, eu também obtive dados para o SPY (embora, novamente, o AlphaVantage também possa fornecer este serviço gratuitamente para aqueles que não usam Quandl).
Aqui é o novo código.
Então, uma explicação: há quatro fluxos de retorno aqui e compre e segure XIV, o impulso DDN de uma publicação anterior e outras duas estratégias.
O mais simples, chamado VRatio, é simplesmente a proporção do VIX sobre o VXV. Perto do fechamento, verifique esta quantidade. Se isso for menor que um, compre XIV, caso contrário, compre o VXX.
O outro, denominado estratégia de Risco de Volatilidade Premium (ou VRP para breve), compara a volatilidade histórica de 10 dias (ou seja, o desvio padrão de dez dias de duração anualizado) do S & amp; P 500, o subtrai do VIX e leva uma média móvel de 5 dias disso. Perto do fechamento, quando esse acima de zero (ou seja, VIX é maior do que a volatilidade histórica), siga o XIV longo, caso contrário, vá ao VXX longo.
Mais uma vez, todas essas estratégias são efetivamente observadas perto / no fechamento, compre no próximo & # 8221 ;, por isso são úteis para fins de demonstração, embora não para fins de implementação em qualquer conta em grande sem incorrer no impacto do mercado.
Aqui estão os resultados, desde 2018 (ou seja, em torno da época do início real do XIV & # 8217;
Para observar, tanto o impulso como a estratégia VRP conseguiram um desempenho inferior à compra e retenção do XIV desde 2018. A estratégia VRatio, por outro lado, supera a performance.
Aqui, uma função de estatísticas de resumo que compila algumas métricas de desempenho de nível superior.
Para observar, todas as estratégias de benchmark sofreram grandes cortes desde o início do XIV & # 8217; nós podemos examinar usando o comando table. Drawdowns, como se vê abaixo:
Observe que o comando table. Drawdowns examina apenas um fluxo de retorno por vez. Além disso, o argumento principal especifica quantos levantamentos a serem vistos, ordenados pela maior retirada primeiro.
Uma das razões pelas quais eu penso que essas estratégias parecem sofrer as reduções que eles fazem é que eles são todos ativos em um ativo, ou seu oposto exato, sem espaço para erros.
Uma última coisa, para os curiosos, aqui está a comparação com a minha estratégia desde 2018 (essencialmente no início do XIV), comparado com as estratégias do EVI (que tenho negociado com o capital real desde setembro e abriram recentemente um serviço de inscrição para):
Obrigado pela leitura.
NOTA: Atualmente, estou procurando oportunidades em rede e em tempo integral relacionadas ao meu conjunto de habilidades. Meu perfil do LinkedIn pode ser encontrado aqui.
Lançamento do meu serviço de assinatura.
Depois de avaliar o interesse de meus leitores, eu decidi abrir um serviço de assinatura. I & # 8217; copiar e colar as perguntas frequentes, ou a minha melhor tentativa de tentar responder tantas perguntas quanto possível antes do tempo e pode responder mais no futuro.
Eu estou escolhendo usar Patreon apenas para terceirizar todos os aspectos técnicos de manipulação de assinaturas e criar uma fonte centralizada para publicar conteúdo baseado em assinatura.
Perguntas frequentes (copiadas da página de inscrição):
Obrigado pela visita. Depois de avaliar o interesse dos meus leitores no meu site principal (quantstrattrader. wordpress), eu criei isso como uma página de inscrição para estratégias quantitativas de investimento, com o objetivo de fazer com que os assinantes transformem seu dinheiro em mais dinheiro, sem taxas de assinatura (espero). Os sistemas que desenvolvo provêm de um aprendizado de profissionais experientes de negociação quantitativa e pesquisadores seniores em grandes empresas. O sistema atual que eu inicialmente publiquei um protótipo por vários anos atrás e assisti que fosse rastreado, antes de começar a implantar minha própria capital no início deste ano e fazer as modificações mais recentes ainda mais recentemente.
E enquanto a performance passada não garante resultados futuros e o passado não se repete, muitas vezes rima, então deixe o dinheiro em mais dinheiro.
Algumas perguntas frequentes sobre a estratégia:
Qual é o preço de assinatura desta estratégia?
Atualmente, depois de avaliar o interesse dos leitores e fazer pesquisas com base em outros sites, o preço tentativo é de US $ 50 / mês. Como esta estratégia cria um histórico, isso pode estar sujeito a mudanças no futuro, e as notificações serão feitas nesse evento.
Qual é a descrição da estratégia?
A estratégia é principalmente um sistema de baixa volatilidade que comercializa XIV, ZIV e VXX. No que diz respeito às estratégias de volatilidade, é bastante conservador na medida em que usa várias verificações diferentes para garantir uma posição.
Qual é a vantagem da estratégia?
Em duas palavras: gerenciamento de riscos. Essencialmente, existem alguns critérios separados para selecionar um investimento, e o sistema gasta um tempo não insignificante sem exposição quando alguns desses critérios fornecem sinais contraditórios. Além disso, o sistema usa metodologias disciplinadas em sua construção para evitar parâmetros livres desnecessários e para manter a estratégia tão parcimoniosa quanto possível.
Você troca seu próprio capital com essa estratégia?
Quando foi o período de treinamento na amostra para este sistema?
Um site que não atualiza seu blog (volatilidade simples), uma vez rastreou uma estratégia mais rudimentar que escrevi há vários anos atrás. Fiquei particularmente satisfeito com os resultados dessa pesquisa e, recentemente, recebi informações para melhorar meu sistema em um grau muito maior, além de ganhar confiança para investir capital vivo nele.
Quantos negócios por ano faz o sistema?
No backtest de 20 de abril de 2008 até o final de 2018, o sistema efetuou 187 transações no XIV (compra e venda), 160 em ZIV e 52 em VXX. Significando ao longo de aproximadamente 9 anos, houve em média 43 transações por ano. Em alguns casos, isso pode simplesmente mudar de XIV para ZIV ou vice-versa. Em outras palavras, os negócios duram cerca de uma semana (alguns podem ser mais longos, alguns mais curtos).
Quando os sinais serão publicados?
Os sinais serão publicados em algum momento entre as 12 horas e o fechamento do mercado (4 PM EST). Em backtesting, eles são testados como um mercado em certas ordens, para que os indivíduos assumam qualquer risco / recompensa executando anteriormente.
Com que frequência este sistema está no mercado?
Cerca de 56%. No entanto, ao longo do backtesting (e negociação ao vivo), apenas cerca de 9% dos meses têm retorno zero.
Qual é a distribuição dos meses de retorno, perda e zero?
No final de outubro de 2017, houve cerca de 65% de meses vencedores (com um ganho médio de 12,8%), 26% meses perdidos (com uma perda média de 4,9%) e 9% zero meses.
Quais são algumas outras estatísticas sobre a estratégia?
Desde 2018 (em torno do tempo em que o XIV entrou oficialmente no início, em oposição ao uso de dados sintéticos), a estratégia apresentou um retorno anualizado de 82%, com uma redução máxima de 24,8% e um desvio padrão anualizado de 35%. Isso significa uma razão de Sharpe (retorno ao desvio padrão) superior a 2, e uma razão de Calmar superior a 3. Também possui um índice de desempenho de úlcera de 10.
Quais são as piores reduções da estratégia?
Desde 2018 (novamente, em torno da época do início do XIV & # 8217; s), a maior retirada foi de 24,8%, a partir de 31 de outubro de 2018, e registrando uma nova alta patrimonial em 12 de janeiro de 2018. A maior retirada começou em 21 de agosto de 2018. , 2018 e recuperado em 10 de abril de 2018, e durou 160 dias de negociação.
O preço da assinatura mudará no futuro?
Se a estratégia continuar a gerar retornos fortes, então pode haver motivos para aumentar o preço, desde que os retornos o dêem conta.
Pode ser fornecido um sinal de risco conservador para aqueles que podem não ser capazes de tolerar uma redução de 25%?
Uma variante da estratégia que alveja cerca de metade do desvio padrão anualizado da estratégia possui um retorno anualizado de 40% para cerca de 12% de desconto desde 2018. No geral, isso tem uma recompensa ligeiramente maior para as estatísticas de risco, mas ao custo de cortar retornos agregados ao meio.
Can & # 8217; t XIV tem um evento de término?
Isso se refere à idéia de que o XIV ETN termina se perder 80% de seu valor em um único dia. Para dar uma idéia da probabilidade deste evento, usando dados sintéticos, o XIV ETN apresentou uma redução massiva de 92% ao longo da crise financeira de 2008. Para a história desse dado sintético (pré-inicial) e realizado (pós-início), o pior dia absoluto foi um dia de queda de 26,8%. Para notar, a estratégia não estava no XIV durante esse dia.
Qual foi o pior dia da estratégia?
Em 16 de setembro de 2018, a estratégia perdeu 16% em um dia. Este foi o final da cauda de um período positivo que fez cerca de 40%.
Quais são os riscos da estratégia?
O primeiro risco é que, dado que esta estratégia é naturalmente tendenciosa para uma baixa volatilidade, que pode ter potencial para algumas reduções bruscas devido à natureza dos picos de volatilidade. O outro risco é que, dado que essa estratégia às vezes gasta seu tempo em ZIV, isso será inferior ao XIV em alguns dias úteis. Este segundo risco é uma conseqüência de camadas adicionais de gerenciamento de risco na estratégia.
Quão complexa é essa estratégia?
Não excessivamente. É apenas um pouco mais complexo do que uma estratégia básica de momentum ao contar parâmetros gratuitos e pode ser explicado em alguns minutos.
Essa estratégia usa metodologias complexas de aprendizado de máquinas?
Não. Os requisitos de dados para tais algoritmos e o ruído no mundo financeiro tornam muito arriscado aplicar essas metodologias e, até o momento, a pesquisa não deu frutos para justificar sua incorporação.
O volume do instrumento será sempre uma preocupação (particularmente ZIV)?
De acordo com um indivíduo que trabalhou na criação do original VXX ETN (e, por extensão, seu inverso, XIV), novas ações de ETNs podem ser criadas pelo emissor (no caso ZIV & # 8217; Credit Suisse) sob demanda. Em suma, a preocupação do volume é mais uma preocupação com a reputação da pessoa que faz o pedido. Em outras palavras, depende de quão bem a estratégia faz.
A estratégia pode ser responsabilizada / responsável / responsável pela perda / retirada de um assinante?
Deixe isso servir como um aviso: ao subscrever, você concorda em renunciar a qualquer reclamação legal contra a estratégia ou seu (s) criador (s) no caso de cobranças, perdas, etc. A subscrição é para visualizar o resultado de um programa e este serviço não gerencia ativamente um centavo de assinantes & # 8217; ativos reais. Os assinantes podem optar por ignorar os sinais da estratégia em um momento de aviso a seu critério. A saída do programa não deve ser considerada como o conselho de investimento proveniente de um CFP, CFA, RIA, etc.
Por que esses sinais devem ser confiáveis?
Porque meu trabalho em outros tópicos foi exibido em exibição pública por vários anos. Ao contrário de outros sites, eu mostrei "backtests" negativos e # 8221 ;, quebrando o adágio de & # 8220; você nunca verá um backtest ruim e # 8221 ;. Eu mostrei minuciosidade em minha pesquisa, e o mesmo rigor foi aplicado para este sistema também. Até que haja um histórico mais longo, de modo que o sistema possa ficar sozinho, a confiança no sistema é a confiança no criador do sistema.
Quem é o público-alvo desses sinais?
O público-alvo é individual, investidores de varejo com uma certa tolerância ao risco, e tem um preço correspondente.
A volatilidade da indústria não é muito arriscada?
É arriscado, na perspectiva do instrumento subjacente, a capacidade de realizar grandes arranjos (superior a 60% e até maior que 90%). No entanto, de um ponto de vista puramente numérico, a empresa assumiu muitas lojas, a Amazon, desde o início, teve uma taxa de retorno anualizada de 37,1%, um desvio padrão de 61,5%, uma pior retirada de 94% e um índice de desempenho de úlcera de 0,9. Em comparação, XIV, a partir de 2008 (usando dados sintéticos), teve uma taxa de retorno anualizada de 35,5%, um desvio padrão de 57,7%, uma pior retirada de 92% e um índice de desempenho de úlceras de 0,6. Se a Amazon for considerada um recurso de alto nível, então, a partir de uma comparação quantitativa, um sistema que busca capitalizar apostas de volatilidade deve ser visto de uma perspectiva similar. Com certeza, o desempenho da estratégia supera muito o de comprar e manter XIV (que ninguém deveria fazer). No entanto, a filosofia dos produtos de volatilidade é muito mais arriscada do que os nomes das máquinas domésticas simplesmente não é válida, a menos que o futuro difira do passado.
Existe a possibilidade de colaborar com outros criadores de estratégias?
Não hesite em contactar-me no meu email ilya. kipnis@gmail para discutir essa possibilidade. Solicito um fluxo diário de retornos antes de iniciar qualquer discussão.
Por ter passado todas as janelas artesanais e interessantes opções de vocabulário, a Patreon é simplesmente uma plataforma que processa pagamentos e cria uma plataforma centralizada para publicar conteúdo baseado em assinatura, em oposição à manutenção de listas de endereços e outras dores de cabeça técnicas. Essencialmente, é simplesmente uma maneira de terceirizar o fim técnico da execução de um negócio, mesmo que o curativo seja pouco ortodoxo.
Obrigado pela leitura.
NOTA: Atualmente, estou interessado em trabalho em rede e em funções de tempo integral com base em minhas habilidades. Meu perfil do LinkedIn pode ser encontrado aqui.
O retorno de dados gratuitos e a possível assinatura de negociação de volatilidade.
Este post será sobre como tirar dados gratuitos do AlphaVantage e avaliar os juros para um serviço de inscrição de importação de volatilidade.
Então, primeiro, desde que os yahoos no Yahoo decidiram desligar seus dados gratuitos, o mundo dos dados diários gratuitos tem estado em uma idade sombria. Bem, graças ao blog. fosstrading / 2017/10 / getsymbols-and-alpha-vantage. html # gpluscommentsJosh Ulrich, Paul Teetor e outros indivíduos R / Finance, a última edição do quantmod (que pode ser instalado no CRAN) agora contém uma maneira de obter dados financeiros gratuitos da AlphaVantage desde o ano 2000, que geralmente é suficiente para a maioria dos backtests, já que essa data é anterior ao início da maioria dos ETFs.
Aqui, é como fazê-lo.
Depois de fazer isso, o download de dados é simples, se não um pouco lento. Aqui, é como fazê-lo.
E os resultados:
Which means if any one of my old posts on asset allocation has been somewhat defunct thanks to bad yahoo data, it will now work again with a slight modification to the data input algorithms.
Beyond demonstrating this routine, one other thing I’d like to do is to gauge interest for a volatility signal subscription service, for a system I have personally started trading a couple of months ago.
Simply, I have seen other websites with subscription services with worse risk/reward than the strategy I currently trade, which switches between XIV, ZIV, and VXX. Currently, the equity curve, in log 10, looks like this:
That is, $1000 in 2008 would have become approximately $1,000,000 today, if one was able to trade this strategy since then.
Since 2018 (around the time of inception for XIV), the performance has been:
Considering that some websites out there charge upwards of $50 a month for either a single tactical asset rotation strategy (and a lot more for a combination) with inferior risk/return profiles, or a volatility strategy that may have had a massive and historically record-breaking drawdown, I was hoping to gauge a price point for what readers would consider paying for signals from a better strategy than those.
Obrigado pela leitura.
NOTE: I am currently interested in networking and am seeking full-time opportunities related to my skill set. My LinkedIn profile can be found here.
The Kelly Criterion — Funciona?
This post will be about implementing and investigating the running Kelly Criterion — that is, a constantly adjusted Kelly Criterion that changes as a strategy realizes returns.
For those not familiar with the Kelly Criterion, it’s the idea of adjusting a bet size to maximize a strategy’s long term growth rate. Both https://en. wikipedia/wiki/Kelly_criterionWikipedia and Investopedia have entries on the Kelly Criterion. Essentially, it’s about maximizing your long-run expectation of a betting system, by sizing bets higher when the edge is higher, and vice versa.
There are two formulations for the Kelly criterion: the Wikipedia result presents it as mean over sigma squared. The Investopedia definition is P-[(1-P)/winLossRatio], where P is the probability of a winning bet, and the winLossRatio is the average win over the average loss.
In any case, here are the two implementations.
Let’s try this with some data. At this point in time, I’m going to show a non-replicable volatility strategy that I currently trade.
For the record, here are its statistics:
Now, let’s see what the Wikipedia version does:
The results are simply ridiculous. And here would be why: say you have a mean return of .0005 per day (5 bps/day), and a standard deviation equal to that (that is, a Sharpe ratio of 1). You would have 1/.0005 = 2000. In other words, a leverage of 2000 times. This clearly makes no sense.
The other variant is the more particular Investopedia definition.
Looks a bit more reasonable. However, how does it stack up against not using it at all?
Turns out, the fabled Kelly Criterion doesn’t really change things all that much.
For the record, here are the statistical comparisons:
Obrigado pela leitura.
NOTE: I am currently looking for my next full-time opportunity, preferably in New York City or Philadelphia relating to the skills I have demonstrated on this blog. My LinkedIn profile can be found here. If you know of such opportunities, do not hesitate to reach out to me.
Leverage Up When You’re Down?
This post will investigate the idea of reducing leverage when drawdowns are small, and increasing leverage as losses accumulate. It’s based on the idea that whatever goes up must come down, and whatever comes down generally goes back up.
I originally came across this idea from this blog post.
So, first off, let’s write an easy function that allows replication of this idea. Essentially, we have several arguments:
One: the default leverage (that is, when your drawdown is zero, what’s your exposure)? For reference, in the original post, it’s 10%.
Next: the various leverage levels. In the original post, the leverage levels are 25%, 50%, and 100%.
And lastly, we need the corresponding thresholds at which to apply those leverage levels. In the original post, those levels are 20%, 40%, and 55%.
So, now we can create a function to implement that in R. The idea being that we have R compute the drawdowns, and then use that information to determine leverage levels as precisely and frequently as possible.
Here’s a quick piece of code to do so:
So, let’s replicate some results.
And our results look something like this:
That said, what would happen if one were to extend the data for all available XIV data?
A different story.
In this case, I think the takeaway is that such a mechanism does well when the drawdowns for the benchmark in question occur sharply, so that the lower exposure protects from those sharp drawdowns, and then the benchmark spends much of the time in a recovery mode, so that the increased exposure has time to earn outsized returns, and then draws down again. When the benchmark continues to see drawdowns after maximum leverage is reached, or continues to perform well when not in drawdown, such a mechanism falls behind quickly.
As always, there is no free lunch when it comes to drawdowns, as trying to lower exposure in preparation for a correction will necessarily mean forfeiting a painful amount of upside in the good times, at least as presented in the original post.
Obrigado pela leitura.
NOTE: I am currently looking for my next full-time opportunity, preferably in New York City or Philadelphia relating to the skills I have demonstrated on this blog. My LinkedIn profile can be found here. If you know of such opportunities, do not hesitate to reach out to me.
Let’s Talk Drawdowns (And Affiliates)
This post will be directed towards those newer in investing, with an explanation of drawdowns–in my opinion, a simple and highly important risk statistic.
Would you invest in this?
As it turns out, millions of people do, and did. That is the S&P 500, from 2000 through 2018, more colloquially referred to as “the stock market”. Plenty of people around the world invest in it, and for a risk to reward payoff that is very bad, in my opinion. This is an investment that, in ten years, lost half of its value–twice!
At its simplest, an investment–placing your money in an asset like a stock, a savings account, and so on, instead of spending it, has two things you need to look at.
First, what’s your reward? If you open up a bank CD, you might be fortunate to get 3%. If you invest it in the stock market, you might get 8% per year (on average) if you held it for 20 years. In other words, you stow away $100 on January 1st, and you might come back and find $108 in your account on December 31st. This is often called the compound annualized growth rate (CAGR)–meaning that if you have $100 one year, earn 8%, you have 108, and then earn 8% on that, and so on.
The second thing to look at is the risk. What can you lose? The simplest answer to this is “the maximum drawdown”. If this sounds complicated, it simply means “the biggest loss”. So, if you had $100 one month, $120 next month, and $90 the month after that, your maximum drawdown (that is, your maximum loss) would be 1 – 90/120 = 25%.
When you put the reward and risk together, you can create a ratio, to see how your rewards and risks line up. This is called a Calmar ratio, and you get it by dividing your CAGR by your maximum drawdown. The Calmar Ratio is a ratio that I interpret as “for every dollar you lose in your investment’s worst performance, how many dollars can you make back in a year?” For my own investments, I prefer this number to be at least 1, and know of a strategy for which that number is above 2 since 2018, or higher than 3 if simulated back to 2008.
Most stocks don’t even have a Calmar ratio of 1, which means that on average, an investment makes more than it can possibly lose in a year. Even Amazon, the company whose stock made Jeff Bezos now the richest man in the world, only has a Calmar Ratio of less than 2/5, with a maximum loss of more than 90% in the dot-com crash. The S&P 500, again, “the stock market”, since 1993, has a Calmar Ratio of around 1/6. That is, the worst losses can take *years* to make back.
A lot of wealth advisers like to say that they recommend a large holding of stocks for young people. In my opinion, whether you’re young or old, losing half of everything hurts, and there are much better ways to make money than to simply buy and hold a collection of stocks.
For those with coding skills, one way to gauge just how good or bad an investment is, is this:
An investment has a history–that is, in January, it made 3%, in February, it lost 2%, in March, it made 5%, and so on. By shuffling that history around, so that say, January loses 2%, February makes 5%, and March makes 3%, you can create an alternate history of the investment. It will start and end in the same place, but the journey will be different. For investments that have existed for a few years, it is possible to create many different histories, and compare the Calmar ratio of the original investment to its shuffled “alternate histories”. Ideally, you want the investment to be ranked among the highest possible ways to have made the money it did.
To put it simply: would you rather fall one inch a thousand times, or fall a thousand inches once? Well, the first one is no different than jumping rope. The second one will kill you.
Here is some code I wrote in R (if you don’t code in R, don’t worry) to see just how the S&P 500 (the stock market) did compared to how it could have done.
This is the resulting plot:
That red line is the actual performance of the S&P 500 compared to what could have been. And of the 1000 different simulations, only 91 did worse than what happened in reality.
This means that the stock market isn’t a particularly good investment, and that you can do much better using tactical asset allocation strategies.
One site I’m affiliated with, is AllocateSmartly. It is a cheap investment subscription service ($30 a month) that compiles a collection of asset allocation strategies that perform better than many wealth advisers. When you combine some of those strategies, the performance is better still. To put it into perspective, one model strategy I’ve come up with has this performance:
In this case, the compound annualized growth rate is nearly double that of the maximum loss. For those interested in something a bit more aggressive, this strategy ensemble uses some fairly conservative strategies in its approach.
In conclusion, when considering how to invest your money, keep in mind both the reward, and the risk. One very simple and important way to understand risk is how much an investment can possibly lose, from its highest, to its lowest value following that peak. When you combine the reward and the risk, you can get a ratio that tells you about how much you can stand to make for every dollar lost in an investment’s worst performance.
Obrigado pela leitura.
NOTE: I am interested in networking opportunities, projects, and full-time positions related to my skill set. If you are looking to collaborate, please contact me on my LinkedIn here.
An Out of Sample Update on DDN’s Volatility Momentum Trading Strategy and Beta Convexity.
The first part of this post is a quick update on Tony Cooper’s of Double Digit Numerics’s volatility ETN momentum strategy from the volatility made simple blog (which has stopped updating as of a year and a half ago). The second part will cover Dr. Jonathan Kinlay’s Beta Convexity concept.
So, now that I have the ability to generate a term structure and constant expiry contracts, I decided to revisit some of the strategies on Volatility Made Simple and see if any of them are any good (long story short: all of the publicly detailed ones aren’t so hot besides mine–they either have a massive drawdown in-sample around the time of the crisis, or a massive drawdown out-of-sample).
Why this strategy? Because it seemed different from most of the usual term structure ratio trades (of which mine is an example), so I thought I’d check out how it did since its first publishing date, and because it’s rather easy to understand.
Here’s the strategy:
Take XIV, VXX, ZIV, VXZ, and SHY (this last one as the “risk free” asset), and at the close, invest in whichever has had the highest 83 day momentum (this was the result of optimization done on volatilityMadeSimple).
Here’s the code to do this in R, using the Quandl EOD database. There are two variants tested–observe the close, buy the close (AKA magical thinking), and observe the close, buy tomorrow’s close.
Here are the results.
Looks like this strategy didn’t pan out too well. Just a daily reminder that if you’re using fine grid-search to select a particularly good parameter (EG n = 83 days? Maybe 4 21-day trading months, but even that would have been n = 82), you’re asking for a visit from, in the words of Mr. Tony Cooper, a visit from the grim reaper.
Moving onto another topic, whenever Dr. Jonathan Kinlay posts something that I think I can replicate that I’d be very wise to do so, as he is a very skilled and experienced practitioner (and also includes me on his blogroll).
A topic that Dr. Kinlay covered is the idea of beta convexity–namely, that an asset’s beta to a benchmark may be different when the benchmark is up as compared to when it’s down. Essentially, it’s the idea that we want to weed out firms that are what I’d deem as “losers in disguise”–I. E. those that act fine when times are good (which is when we really don’t care about diversification, since everything is going up anyway), but do nothing during bad times.
The beta convexity is calculated quite simply: it’s the beta of an asset to a benchmark when the benchmark has a positive return, minus the beta of an asset to a benchmark when the benchmark has a negative return, then squaring the difference. That is, (beta_bench_positive – beta_bench_negative) ^ 2.
Here’s some R code to demonstrate this, using IBM vs. the S&P 500 since 1995.
Obrigado pela leitura.
NOTE: I am always looking to network, and am currently actively looking for full-time opportunities which may benefit from my skill set. If you have a position which may benefit from my skills, do not hesitate to reach out to me. My LinkedIn profile can be found here.
QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 21 de janeiro de 2018.
Eu mencionei anteriormente no artigo QuantStart: 2018 In Review que eu estaria gastando algum escrito em 2018 sobre negociação forex automatizada.
Dado que eu mesmo geralmente realizo pesquisas em mercados de ações e futuros, pensei que seria divertido (e educativo!) Escrever sobre minhas experiências de entrar no mercado de divisas no estilo de um diário. Cada "entrada diária" tentará construir sobre todos aqueles antes, mas também deve ser relativamente autônoma.
Nesta primeira entrada do diário, descreverei como configurar uma nova conta de corretagem de prática com a OANDA, bem como a forma de criar um motor de negociação básico baseado em múltiplos processos que possa executar negócios automaticamente em uma configuração prática e ao vivo.
No ano passado, passamos muito tempo olhando o backtester baseado em eventos, principalmente para ações e ETFs. O que eu apresento abaixo é orientado para o forex e pode ser usado para negociação de papel ou negociação ao vivo.
Eu escrevi todas as instruções a seguir para o Ubuntu 14.04, mas elas devem ser facilmente traduzidas para Windows ou Mac OS X, usando uma distribuição Python, como Anaconda. A única biblioteca adicional usada para o mecanismo comercial Python é a biblioteca de solicitações, que é necessária para a comunicação HTTP para a API OANDA.
Uma vez que este é o primeiro post diretamente sobre o comércio cambial, e o código apresentado abaixo pode ser direto para um ambiente de negociação ao vivo, gostaria de apresentar as seguintes isenções:
Isenção de responsabilidade: a negociação de câmbio na margem possui um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar uma perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas.
Este software é fornecido "tal como está" e quaisquer garantias expressas ou implícitas, incluindo, mas não limitado a, as garantias implícitas de comercialização e adequação para um propósito específico são negadas. Em nenhum caso, os regentes ou contribuidores serão responsáveis por quaisquer danos diretos, indiretos, incidentais, especiais, exemplares ou conseqüentes (incluindo, mas não limitado a, aquisição de bens ou serviços de substituição, perda de uso, dados ou lucros, ou interrupção do negócio), no entanto, causou e em qualquer teoria da responsabilidade, seja no contrato, responsabilidade restritiva ou delito (incluindo negligência ou outra) decorrente de qualquer uso do software, mesmo que seja avisado da possibilidade de tal dano.
Configurando uma conta com OANDA.
A primeira pergunta que vem à mente é "Por que escolher OANDA?". Simplificando, depois de um pouco de Googling em torno de corretores de Forex que possuíam APIs, vi que a OANDA havia lançado recentemente uma API REST adequada que poderia ser facilmente comunicada com quase qualquer idioma de uma maneira extremamente direta. Depois de ler a documentação da API do desenvolvedor, eu decidi fazer uma tentativa, pelo menos com uma conta prática.
Para ser claro - não tenho relação anterior ou existente com a OANDA e estou fornecendo apenas esta recomendação com base em minha experiência limitada ao brincar com sua API prática e algum uso breve (para download de dados de mercado) enquanto empregado em um fundo anteriormente. Se alguém se deparou com outros corretores forex que também tenham uma API similarmente moderna, então eu ficaria feliz em dar-lhes um olhar também.
Antes de utilizar a API, é necessário se inscrever para uma conta prática. Para fazer isso, vá para o link de inscrição. Você verá a seguinte tela:
Você poderá fazer login com suas credenciais de login. Certifique-se de selecionar a guia "fxTradePractice" na tela de login:
Uma vez que você precisa fazer uma anotação da sua identificação da conta. Ele está listado abaixo do cabeçalho preto "Meus fundos" ao lado de "Primário". O meu é um número de 7 dígitos. Além disso, você também precisará gerar um token de API pessoal. Para fazer isso, clique em "Gerenciar Acesso da API" abaixo da guia "Outras Ações" no canto inferior esquerdo:
Nesta fase, você poderá gerar um token de API. Você precisará da chave para o uso mais tarde, então certifique-se de anotá-la também.
Agora você deseja iniciar o aplicativo FXTrade Practice, o que nos permitirá ver as ordens executadas e nosso (paper!) Profit & amp; perda.
Se você estiver executando um sistema Ubuntu, você precisará instalar uma versão ligeiramente diferente do Java. Em particular, a versão Oracle do Java 8. Se você não fizer isso, o simulador de prática não será carregado a partir do navegador. Executei esses comandos no meu sistema:
Agora você poderá iniciar o ambiente comercial da prática. Volte para o painel de controle OANDA e clique no link verde "Lançar FXTrade Practice". Ele abrirá uma caixa de diálogo Java perguntando se deseja executá-lo. Clique em "Executar" e a ferramenta FxTrade Practice será carregada. O meu padrão foi ajustado para um gráfico de velas de 15 minutos de EUR / USD com o Painel de Citações à esquerda:
Tela de prática OANDA fxTrade.
Neste ponto, estamos prontos para começar a projetar e codificar nosso sistema automatizado de trading forex contra a API OANDA.
Visão geral da arquitetura comercial.
Se você acompanha a série de backtester com base em eventos para ações e ETFs que eu criei no ano passado, você estará ciente de como esse sistema de negociação baseado em eventos funciona. Para aqueles que são novos para o software dirigido a eventos, eu sugeriria fortemente a leitura do artigo, a fim de obter informações sobre como eles funcionam.
Em essência, todo o programa é executado em um loop infinte while que só termina quando o sistema comercial é desligado. O mecanismo de comunicação central do programa é fornecido através de uma fila que contém eventos.
A fila é constantemente consultada para verificar novos eventos. Uma vez que um evento foi retirado do topo da fila, ele deve ser tratado por um componente apropriado do programa. Portanto, um feed de dados do mercado pode criar o TickEvent s que são colocados na fila quando um novo preço de mercado chega. Um objeto de estratégia gerador de sinal pode criar OrderEvent s que devem ser enviados para uma corretora.
A utilidade de tal sistema é dada pelo fato de que não importa qual ordem ou tipos de eventos são colocados na fila, pois eles sempre serão tratados corretamente pelo componente certo dentro do programa.
Além disso, diferentes partes do programa podem ser executadas em segmentos separados, o que significa que nunca há espera por nenhum componente específico antes de processar qualquer outro. Isso é extremamente útil em situações de negociação algorítmica, onde manipuladores de feed de dados de mercado e geradores de sinal de estratégia possuem características de desempenho muito diferentes.
O principal ciclo de negociação é dado pelo seguinte pseudo-código Python:
Como afirmamos acima, o código é executado em um loop infinito. Em primeiro lugar, a fila é polida para recuperar um novo evento. Se a fila estiver vazia, o loop simplesmente será reiniciado após um período de sono curto conhecido como "batimento cardíaco". Se um evento for encontrado, seu tipo é avaliado e, em seguida, o módulo relevante (seja a estratégia ou o manipulador de execução) é chamado a lidar com o evento e possivelmente gerar novos que voltem para a fila.
Os componentes básicos que criaremos para o nosso sistema comercial incluem o seguinte:
Manipulador de preços de transmissão - Isso manterá uma conexão de longa duração aberta aos servidores OANDAs e enviará dados de marca (por exemplo, lance / pedido) em toda a conexão para quaisquer instrumentos nos quais estamos interessados. Estratégia Gerador de Sinal - Isso levará uma seqüência de tiques eventos e use-os para gerar ordens de negociação que serão executadas pelo manipulador de execução. Manipulador de Execução - Executa um conjunto de eventos de ordem e depois os executa cegamente com OANDA. Eventos - Esses objetos constituem as "mensagens" que são transmitidas na fila de eventos. Exigimos apenas dois para esta implementação, nomeadamente o TickEvent e o OrderEvent. Ponto de entrada principal - O ponto de entrada principal também inclui o loop "trade" que pesquisa continuamente a fila de mensagens e envia mensagens para o componente correto. Isso geralmente é conhecido como "loop de eventos" ou "manipulador de eventos".
Vamos agora discutir a implementação do código em detalhes. Na parte inferior do artigo está a listagem completa de todos os arquivos de código fonte. Se você colocá-los no mesmo diretório e executar o python trading. py, você começará a gerar ordens, assumindo que você tenha preenchido o ID da sua conta e o token de autenticação da OANDA.
Implementação do Python.
É uma prática ruim armazenar senhas ou chaves de autenticação dentro de uma base de códigos, pois você nunca pode prever quem será, eventualmente, permitido o acesso a um projeto. Em um sistema de produção, nós armazenamos essas credenciais como variáveis de ambiente com o sistema e, em seguida, consultamos esses "envvars" cada vez que o código é redistribuído. Isso garante que as senhas e os tokens de autenticação nunca sejam armazenados em um sistema de controle de versão.
No entanto, uma vez que estamos apenas interessados em construir um sistema de comércio de "brinquedos" e não nos preocupamos com detalhes de produção neste artigo, em vez disso, separaremos estes tokens de autenticação em um arquivo de configurações.
No seguinte arquivo de configuração settings. py, temos um dicionário chamado AMBIENTES que armazena os pontos finais da API tanto para a API de transmissão de preços OANDA como para a API de negociação. Cada subdiretor contém três pontos de extremidade de API diferentes: real, prática e sandbox.
A API do sandbox é puramente para testar o código e verificar se não há erros ou erros. Não possui as garantias de tempo de atividade das APIs reais ou de prática. A API prática, em essência, oferece a capacidade de comércio de papel. Ou seja, ele fornece todos os recursos da API real em uma conta de prática simulada. A API real é apenas isso - é uma negociação ao vivo! Se você usa esse ponto final em seu código, ele será negociado contra o saldo da sua conta ao vivo. SEJA EXTREMAMENTE CUIDADOSO!
IMPORTANTE: quando negociar contra a prática, lembre-se de que um custo de transação importante, o impacto de mercado, não é considerado. Uma vez que nenhum negócio é realmente colocado no meio ambiente, esse custo deve ser contabilizado de outra maneira em outro lugar usando um modelo de impacto de mercado, se você deseja avaliar de forma realista o desempenho.
No seguinte, estamos usando a conta prática conforme a configuração DOMAIN. Precisamos de dois dicionários separados para os domínios, um para os componentes da API de transmissão e transmissão. Finalmente, temos ACCESS_TOKEN e ACCOUNT_ID. Eu preenchi os dois abaixo com IDs fofos, então você precisará usar o seu próprio, que pode ser acessado a partir da página da conta OANDA:
O próximo passo é definir os eventos que a fila usará para ajudar todos os componentes individuais a se comunicarem. Precisamos de dois: TickEvent e OrderEvent. O primeiro armazena informações sobre dados do mercado de instrumentos, como o (melhor) lance / pedido e o tempo de troca. O segundo é usado para transmitir ordens ao manipulador de execução e, portanto, contém o instrumento, o número de unidades a negociar, o tipo de ordem ("mercado" ou "limite") e o "lado" (ou seja, "comprar" e "vender" ).
Para o futuro do nosso código de eventos, vamos criar uma classe base chamada Evento e ter todos os eventos herdados disto. O código é fornecido abaixo em events. py:
A próxima classe que vamos criar irá lidar com a estratégia de negociação. Nesta demonstração, vamos criar uma estratégia bastante absurda que simplesmente receba todos os carrapatos do mercado e, em cada 5º tick, compra ou vende de maneira aleatória 10 mil unidades de EUR / USD.
Claramente, esta é uma "estratégia" ridícula. No entanto, é fantástico para fins de teste porque é direto codificar e entender. Em futuras entradas no diário, estaremos substituindo isso por algo significativamente mais emocionante que (espero) gire um lucro!
O arquivo strategy. py pode ser encontrado abaixo. Vamos trabalhar com isso e ver o que está acontecendo. Em primeiro lugar, importamos a biblioteca aleatória e o objeto OrderEvent de events. py. Precisamos da libação aleatória para selecionar uma ordem de compra ou venda aleatória. Precisamos do OrderEvent, pois é assim que o objeto de estratégia enviará ordens para a fila de eventos, que posteriormente será executada pelo manipulador de execução.
A classe TestRandomStrategy simplesmente leva o instrumento (neste caso EUR / USD), o número de unidades e a fila de eventos como um conjunto de parâmetros. Em seguida, cria um contador de tiques que é usado para contar quantas instâncias do TickEvent já viu.
A maior parte do trabalho ocorre no método calculate_signals, que simplesmente leva um evento, determina se é um TickEvent (ignore) e incrementa o contador de tiques. Em seguida, verifica se a contagem é divisível em 5 e, em seguida, compra ou vende aleatoriamente, com uma ordem de mercado, o número especificado de unidades. Certamente, não é a maior estratégia de negociação do mundo, mas será mais do que adequada para os nossos testes de API de corretagem da OANDA!
O próximo componente é o manipulador de execução. Esta classe é encarregada de atuar sobre as instâncias do OrderEvent e fazer solicitações ao corretor (neste caso, OANDA) de forma "burra". Ou seja, não há gerenciamento de risco ou sobreposição de construção de potfolio. O manipulador de execução simplesmente executará qualquer ordem que tenha sido dada.
Devemos passar todas as informações de autenticação para a classe Execution, incluindo o "domínio" (prática, real ou sandbox), o token de acesso e identificação da conta. Em seguida, criamos uma conexão segura com o httplib, um dos Pythons criados em bibliotecas.
A maior parte do trabalho ocorre em execute_order. O método requer um evento como um parâmetro. Em seguida, constrói dois dicionários - os cabeçalhos e os params. Esses dicionários serão corretamente codificados (parcialmente por urllib, outra biblioteca Python) para serem enviados como uma solicitação HTTP POST para a API OANDAs.
Passamos os parâmetros de cabeçalho do tipo de conteúdo e autorização, que incluem nossas informações de autenticação. Além disso, codificamos os parâmetros, que incluem o instrumento (EUR / USD), unidades, tipo de ordem e lado (compra / venda). Finalmente, fazemos o pedido e salvamos a resposta:
O componente mais complexo do sistema de negociação é o objeto StreamingForexPrices, que lida com as atualizações de preços de mercado da OANDA. Existem dois métodos: connect_to_stream e stream_to_queue.
O primeiro método usa a biblioteca de solicitações Python para se conectar a um soquete de transmissão com os cabeçalhos e parâmetros apropriados. Os parâmetros incluem o ID da conta e a lista de instrumentos necessários que devem ser ouvidos para atualizações (neste caso, é apenas EUR / USD). Observe a seguinte linha:
Isso diz que a conexão deve ser transmitida e, portanto, mantida aberta de uma maneira longa.
O segundo método, stream_to_queue, realmente tenta se conectar ao fluxo. Se a resposta não for bem sucedida (ou seja, o código de resposta não é HTTP 200), então simplesmente retornamos e saímos. Se for bem sucedido, tentamos carregar o pacote JSON retornado para um dicionário Python. Finalmente, convertemos o dicionário Python com o instrumento, lance / perguntar e timestamp em um TickEvent que é enviado para a fila de eventos:
Agora temos todos os principais componentes no local. O passo final é encerrar tudo o que escrevemos até agora em um programa "principal". O objetivo deste arquivo, conhecido como trading. py, é criar dois segmentos separados, um dos quais executa o manipulador de preços e o outro que administra o manipulador de negociação.
Por que precisamos de dois segmentos separados? Simplificando, estamos executando dois pedaços de código "separados", ambos em execução contínua. Se formássemos um programa não-threaded, o soquete de transmissão usado para as atualizações de preços nunca mais "liberaria" de volta para o caminho do código principal e, portanto, nunca realizaríamos nenhuma negociação. Da mesma forma, se corremos o loop de comércio (veja abaixo), nunca retornaríamos o caminho do fluxo para o soquete de transmissão de preços. Portanto, precisamos de múltiplos tópicos, um para cada componente, para que eles possam ser realizados de forma independente. Ambos se comunicarão entre si através da fila de eventos.
Vamos examinar isso um pouco mais. Criamos dois segmentos separados com as seguintes linhas:
Passamos o nome da função ou do método para o argumento de palavra-chave alvo e passamos uma iterável (como uma lista ou uma tupla) para o argumento de palavras-chave args, que passa esses argumentos para o método / função real.
Finalmente, começamos os dois tópicos com as seguintes linhas:
Assim, somos capazes de executar dois, efetivamente infinitos looping, segmentos de código independentemente, que ambos se comunicam através da fila de eventos. Observe que a biblioteca de threading do Python não produz um ambiente multi-core multi-core real devido à implementação do CPython do Python e do Bloqueio do Intérprete Global (GIL). Se você quiser ler mais sobre multithreading no Python, veja este artigo.
Vamos examinar o resto do código em detalhes. Em primeiro lugar, importamos todas as bibliotecas necessárias, incluindo Fila, encadeamento e tempo. Em seguida, importamos todos os arquivos de código acima. Pessoalmente, eu prefiro capitalizar quaisquer configurações, o que é um hábito que eu tirei do trabalho com o Django!
Depois disso, definimos a função comercial, que foi explicada em pseudocódigo Python acima. Um loop while infinito é executado (enquanto True:) que pesquisa continuamente a partir da fila de eventos e apenas ignora o loop se ele for encontrado vazio. Se um evento for encontrado, então é um TickEvent ou um OrderEvent e, em seguida, o componente apropriado é chamado para executá-lo. Nesse caso, é uma estratégia ou um manipulador de execução. O loop, em seguida, simplesmente dorme para "heartbeat" segundos (neste caso, 0,5 segundos) e continua.
Finalmente, definimos o ponto de entrada principal do código na função __main__. É bem comentado abaixo, mas vou resumir aqui. Em essência, instanciamos a fila de eventos e definimos os instrumentos / unidades. Em seguida, criamos a classe de transmissão de preços StreamingForexPrices e, posteriormente, o processador de execução Execução. Ambos recebem os detalhes de autenticação necessários fornecidos pela OANDA ao criar uma conta.
Em seguida, criamos a instância TestRandomStrategy. Finalmente, definimos os dois tópicos e depois os iniciamos:
Para executar o código, você simplesmente precisa colocar todos os arquivos no mesmo diretório e chamar o seguinte no terminal:
Note-se que, para parar o código nesta fase, é necessária uma dura matança do processo Python, através de "Ctrl-Z" ou equivalente! Eu não adicionei um tópico adicional para lidar com a procura do sys. exit () que seria necessário para parar o código com segurança. Uma maneira potencial de parar o código em uma máquina Ubuntu / Linux é digitar:
E depois passar a saída deste (um número de processo) para o seguinte:
Onde PROCESS_ID deve ser substituído pela saída de pgrep. Observe que esta não é particularmente boa prática!
Em artigos posteriores, estaremos criando um mecanismo de parada / início mais sofisticado que faz uso da supervisão do processo do Ubuntu para que o sistema comercial seja executado 24/7.
A saída após 30 segundos ou mais, dependendo da hora do dia em relação ao horário de negociação principal para EUR / USD, para o código acima, é dada abaixo:
As primeiras cinco linhas mostram os dados de marca JSON retornados de OANDA com os preços de lances / pedidos. Posteriormente, você pode ver a ordem de execução! saída, bem como a resposta JSON retornou da OANDA confirmando a abertura de um comércio de compra por 10.000 unidades de EUR / USD e o preço alcançado em.
Isso continuará funcionando indefinidamente até você matar o programa com um comando "Ctrl-Z" ou similar.
Qual é o próximo?
Em artigos posteriores, vamos realizar algumas melhorias tão necessárias, incluindo:
Estratégias reais - Estratégias forex adequadas que geram sinais lucrativos. Infraestrutura de produção - Implementação de servidor remoto e sistema de comércio monitorado 24/7, com capacidade de parada / início. Gerenciamento de portfólio e risco - Carteira e sobreposições de risco para todas as encomendas sugeridas da estratégia. Múltiplas estratégias - Construindo um portfólio de estratégias que se integram na sobreposição de gerenciamento de riscos.
Tal como acontece com o backtester baseado em eventos de ações, também precisamos criar um módulo forex backtesting. Isso nos permitirá realizar pesquisas rápidas e facilitar a implantação de estratégias.
settings. py (lembre-se de alterar ACCOUNT_ID e ACCESS_TOKEN!):
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.
Obter através da App Store Leia esta publicação em nosso aplicativo!
Carteiras e contas de várias moedas com R Blotter e quantstrat.
Qual é a melhor metodologia para modelagem com várias moedas na conta e títulos com diferentes divisas em uma carteira?
É melhor manter as carteiras e contas de moeda única? Manipulará, em seguida, lidar com fx quando necessário e como você carrega taxas de fx para. blotter? Alternativamente, as contas podem ser multi-moeda com valores de capital em várias moedas?
Fico feliz em brincar com os detalhes, mas posso realmente fazer conselhos sobre a abordagem geral de um especialista em borrão.
Desculpe-se se isso foi abordado em outro lugar. Eu procurei e não consegui encontrá-lo.
Exemplo: Um universo de 5 ações em USD e 5 ações em EUR. Crie uma estratégia que comercialize os 5 retornos mais elevados em% nos últimos 3 meses (ou seja, o retorno do estoque USD é tanto o estoque como o retorno da fx).
Uma conta em borrão tem apenas uma moeda.
Um portfólio também possui apenas uma moeda resumo.
os instrumentos possuem uma moeda.
Uma carteira pode deter instrumentos em qualquer moeda, mas o resumo da carteira só será marcado na moeda resumida.
Uma conta pode armazenar muitas carteiras.
Dado o seu exemplo, é provável que você deseje portfólios separados para seus instrumentos EUR e USD e marque a conta em qualquer moeda que seja conveniente para a conta.
QuantStrat TradeR.
Comércio, QuantStrat, R e muito mais.
Qual proporção de volatilidade implícita é melhor?
Esta publicação será sobre comparar um sinal de volatilidade usando três variações diferentes de índices de volatilidade implícita para prever quando inserir uma posição de volatilidade curta.
Na negociação de volatilidade, existem três índices de volatilidade implícitos separados que têm um histórico bastante longo para a negociação, o VIX (todo mundo conhece esse), o VXV (mais recentemente mudado para ser chamado de VIX3M), que é como o VIX, exceto por um período de três meses), e o VXMT, que é o período implícito de volatilidade de seis meses.
Esta relação dá investigação em três razões de volatilidade implícitas separadas: VIX / VIX3M (também conhecido como VXV), VIX / VXMT e VIX3M / VXMT, como preditores para inserir uma posição de volatilidade curta (ou longa).
Então, vamos obter os dados.
Uma estratégia rápida para investigar é simples, a idéia de que o índice deve ser inferior a 1 (I. E. contango na estrutura do termo de volatilidade implícita) e diminuir (abaixo de uma média móvel). Portanto, quando o índice for inferior a 1 (ou seja, com volatilidade implícita a longo prazo maior do que a curto prazo), e a proporção estará abaixo da média móvel de 60 dias, a estratégia assumirá uma posição no XIV.
Aqui é o código para fazer isso.
Com a seguinte performance:
Em outras palavras, o VIX3M / VXMT apresenta os menores descontos (por uma grande margem) com retornos mais elevados.
Assim, quando as pessoas falam sobre o índice de volatilidade implícita para usar, acho que isso oferece algumas evidências fortes para o horizonte mais longo como um preditor para o qual a estrutura de termo implícita de vol para usar. É também por isso que é a base da minha estratégia de inscrição.
Obrigado pela leitura.
NOTA: Estou atualmente buscando uma posição de tempo integral (remoto ou no nordeste dos EUA) relacionada ao meu conjunto de habilidades demonstrado neste blog. Por favor, envie-me no LinkedIn se você souber de qualquer oportunidade que possa beneficiar do meu conjunto de habilidades.
Replicando Volatilidade ETN Retorna De CBOE Futures.
Esta publicação irá demonstrar como replicar os ETN de volatilidade (XIV, VXX, ZIV, VXZ) dos futuros CBOE, permitindo que qualquer pessoa crie retorno ETF sintético antes do início, sem custo.
Então, antes de chegar ao algoritmo real, isso depende de uma atualização para o algoritmo de estrutura do termo que eu compartilhei alguns meses atrás.
Nesse algoritmo, por engano (ou com a finalidade da simplicidade), usei dias de calendário como o tempo de expiração, quando deveria ter sido dias úteis, o que também é responsável por fins de semana e feriados, que são um artefato irritante para acompanhar .
Então, aqui é a mudança saliente, no loop que calcula tempos para expirar:
A linha saliente em particular, é esta:
O que é esta função bizdays? Ele vem do pacote de bizdays em R.
Há também o script tradingHolidays. R, que faz mais uso do pacote bizdays. Aqui, o que se passa sob o capô no tradingHolidays. R, para aqueles que desejam replicar o código:
Existem dois CSVs que eu compilado manualmente, mas compartilharemos capturas de tela do & # 8211; são as férias da Páscoa (porque eles precisam ser ajustados para virar domingo a sexta-feira por causa das sextas da Páscoa) e o resto dos feriados nacionais.
Aqui está o que a easter csv parece:
E o nonEasterHolidays, que contém o Dia do Ano Novo, Dia de MLK Jr., Dia do Presidente, Dia do Memorial Day, Dia da Independência, Dia do Trabalho, Dia de Ação de Graças e Dia de Natal (juntamente com as datas observadas) CSV:
Além disso, precisamos ajustar os dois dias em que as ações não foram negociadas devido ao furacão Sandy.
Então, a lista de férias parece assim:
Assim, uma vez que temos uma lista de feriados, usamos o pacote bizdays para definir os feriados e os fins de semana (sábado e domingo) como nossos dias não comerciais e usamos essa função para calcular os horários corretos para expirar.
Então, agora que temos a estrutura de expiração atualizada, podemos escrever uma função que irá replicar corretamente os 4 ETNs de volatilidade principal e # 8211; XIV, VXX, ZIV e VXZ.
Aqui é a explicação em inglês:
O VXX é composto por dois contratos, o mês de frente e o mês de atraso, e tem um certo número de dias de negociação (AKA dias úteis) que eleva até expirar, digamos, 17. Durante esse período, o primeiro mês ( Deixe-se chamar M1) vai de ser a totalidade da alocação de fundos, a não ser a alocação de fundos, à medida que o contrato do mês da frente se aproxima do prazo de validade. Ou seja, à medida que um contrato se aproxima do prazo de validade, o segundo contrato recebe gradualmente cada vez mais peso, até que, no termo do contrato do mês da frente, o contrato do segundo mês contenha todos os fundos # 8211, assim como * * * o primeiro mês contrato. Então, diga que você tem 17 dias para expirar no primeiro mês da frente. No termo do contrato anterior, o segundo mês terá um peso de 17/17 & # 8211; 100%, já que se torna o primeiro mês. Então, no próximo dia, esse contrato, agora o primeiro mês, terá um peso de 16/17 no momento, depois 15/17, e assim por diante. Esse numerador é chamado de dr, e o denominador é chamado dt.
No entanto, além disso, há um segundo mecanismo que é responsável pelo VXX que parece, em comparação com um contrato de futuros básico (ou seja, a decadência responsável pela baixa volatilidade dos lucros) e Esse é o & # 8220; instantâneo & # 8221; reequilíbrio. Ou seja, os retornos para um determinado dia são hoje ajustados multiplicados pelos pesos de ontem, sobre os ajustes de ontem multiplicados pelos pesos de ontem, menos um. Ou seja, (S_1_t * dr / dt_t-1 + S_2_t * 1-dr / dt_t-1) / (S_1_t-1 * dr / dt_t-1 + S_2_t-1 * 1-dr / dt_t-1) & # 8211; 1 (Eu poderia usar um tutorial no LaTeX). Então, quando você avança um dia, bem, amanhã, os pesos de hoje se tornam t-1. No entanto, quando os recursos podiam ser reequilibrados? Bem, nos ETNs como VXX e VXZ, o & # 8220; hand-waving & # 8221; é que isso acontece instantaneamente. Ou seja, o peso para o primeiro trimestre foi de 93%, o retorno foi realizado na liquidação (isto é, do acordo para liquidar), e imediatamente após esse retorno foi realizado, o peso do mês da frente muda de 93% para, digamos, 88%. Então, digamos que o Credit Suisse (que emite esses ETNs), tem US $ 10.000 (apenas para manter a aritmética e o número de zeros toleráveis, obviamente, há muito mais na realidade) do XIV em circulação depois de perceber imediatamente os retornos, venderá US $ 500 US $ 9300 no mês da frente e imediatamente movê-los para o segundo mês, então passará imediatamente de US $ 9300 em M1 e US $ 700 em M2 para US $ 8800 em M1 e US $ 1200 em M2. Quando esses $ 500 se moveram? Imediatamente, instantaneamente, e se você quiser, você pode aplicar a terceira lei da Clarke & # 8217; chamada e # 8220; magicamente & # 8221 ;.
A única exceção é o dia após o dia do rolo, no qual o segundo mês simplesmente se torna o mês da frente, já que o mês da frente anterior expira, então o que foi um peso de 100% no segundo mês agora será um peso de 100% no primeiro mês da frente, então há algum código extra que precisa ser escrito para fazer essa distinção.
É assim que funciona para VXX e XIV. Qual a diferença para VXZ e ZIV? É realmente simples, em vez de M1 e M2, o VXZ usa as mesmas ponderações exatas (ou seja, o tempo restante no primeiro mês frente a quantos dias existem para que o contrato seja o primeiro mês), usa M4 , M5, M6 e M7, com M4 tomando dr / dt, M5 e M6 sempre sendo 1, e M7 sendo 1-dr / dt.
Em qualquer caso, aqui está o código.
Então, um grande agradecimento a Michael Kapler da Systematic Investor Toolbox por fazer a replicação original e fornecer seu código. O meu código essencialmente faz a mesma coisa, espero que seja mais comentado.
Então, em última análise, isso funciona? Bem, usando meu código de estrutura de prazo atualizado, posso testar isso.
Enquanto eu não irei colar meu código de estrutura de todo o termo (novamente, disponível aqui, basta atualizar o script com minhas atualizações a partir desta postagem), aqui é como você executou a nova função # 8217; d:
E uma vez que retorna o vxx retorna e o vxz retorna, podemos comparar ambos.
Com o resultado:
Basicamente, uma combinação perfeita.
Vamos fazer o mesmo, com ZIV.
Então, a reconstrução do futuro faz um pouco melhor que o ETN. Mas a trajetória é em grande parte idêntica.
Isso conclui esta publicação. Espero que tenha esclarecido sobre como esses ETN de volatilidade funcionam e como obtê-los diretamente dos dados de futuros publicados pelo CBOE, que são as entradas para o meu algoritmo de estrutura de termos.
Isso também significa que, para as instituições interessadas em negociar minha estratégia, que elas possam obter alavancagem para trocar as variáveis replicadas futura-composta desses ETNs, em maior volume.
Obrigado pela leitura.
NOTAS: Para aqueles interessados em uma estratégia de assinatura de varejo para a volatilidade da negociação, não hesite em assinar minha estratégia de negociação de volatilidade. Para os interessados em me empregar em tempo integral ou para projetos de consultoria de longo prazo, eu posso ser contactado no meu LinkedIn, ou meu e-mail: ilya. kipnis@gmail.
(Don & # 8217; t Get) Contangled Up In Noise.
Este post será sobre investigar a eficácia de contango como um sinal de negociação de volatilidade.
Para aqueles que comercializam volatilidade (como eu), um termo que você pode ver que é um pouco onipresente é o termo & # 8220; contango & # 8221 ;. O que este termo significa?
Bem, simples: significa apenas a proporção do segundo mês dos futuros VIX sobre o primeiro. A idéia é que, quando o segundo mês dos futuros é mais do que o primeiro, a perspectiva das pessoas para a volatilidade é maior no futuro do que para o presente e, portanto, os futuros são "contango & # 8221 ;, que é a maior parte do tempo.
Além disso, aqueles que tentam encontrar idéias de negociação de volatilidade decente podem ter visto muitas vezes que os futuros no contango implicam que a manutenção de uma pequena posição de volatilidade será rentável.
Este é o caso?
Bem, existe uma maneira fácil de responder a isso.
Em primeiro lugar, consulte minha postagem na obtenção de dados de futuros gratuitos do CBOE.
Usando esses dados, podemos obter nosso sinal (isto é, para executar o código nesta publicação, execute o código naquele post).
Agora, vamos obter os nossos dados XIV (novamente, um grande agradecimento ao Sr. Helmuth Vollmeier por providenciar tão gentilmente isso.
Agora, aqui é como isso funciona: como o CBOE não atualiza seus ajustes até cerca de 9:45 AM EST no dia seguinte (por exemplo, os dados de liquidação de terça-feira, não foram liberados até Quarta-feira às 9h45 da manhã), temos que entrar no fim do dia após o incêndio. (Para aqueles que se perguntam, minha estratégia de assinatura usa este mecanismo, dando aos assinantes tempo suficiente para executar ao longo do dia.)
Então, vamos calcular nossos backtest retorna. Aqui é uma função stratStats para calcular algumas estatísticas resumidas.
Com os seguintes resultados:
Então, isso é obviamente um desastre. A inspeção visual mostrará devastadores, triagens plurianuais. Usando o comando table. Drawdowns, podemos ver os piores.
Então, o top 3 é horrível, e então qualquer coisa acima de 30% ainda é bastante horrível. Algumas dessas retiradas duraram vários anos também, com um comprimento maciço para a calha. 458 dias de negociação é quase dois anos, e 364 é de aproximadamente um ano e meio. Imagine ver uma estratégia consistentemente no lado errado do comércio por quase dois anos, e quando tudo é dito e feito, você perdeu três quartos de tudo nessa estratégia.
Não há nenhum revestimento de açúcar: uma tal estratégia só pode ser chamada de lixo total.
Vamos tentar uma modificação: exigiremos contango (C2 & gt; C1), e que contango esteja acima da média móvel simples de 60 dias, semelhante à minha estratégia VXV / VXMT.
Com os resultados:
Então, um Calmar ainda com segurança abaixo de 1, um índice de desempenho de úlcera ainda no porão, uma redução máxima que passou o ponto em que as pessoas teriam abandonado a estratégia, e assim por diante.
Então, mesmo que tenha sido melhorado, ainda é seguro dizer que esta estratégia não funciona muito bem. Mesmo após a grande retirada de 2007-2008, ainda recebe algumas coisas muito erradas, como estar exposto a todo o mês de agosto de 2017.
Embora eu pense que existem aplicações para contango em investimentos de volatilidade, não acho que o seu uso seja gerar o sinal de volatilidade longo / curto por conta própria. Em vez disso, acho que outros índices e fontes de dados fazem um trabalho melhor disso. Como o VXV / VXMT, que desde então foi iterado para formar minha estratégia de assinatura.
Obrigado pela leitura.
NOTA: Atualmente, estou buscando oportunidades de rede, projetos de longo prazo e posições de tempo integral relacionadas ao meu conjunto de habilidades. Meu perfil linkedIn pode ser encontrado aqui.
Comparando algumas estratégias de fácil volatilidade de investimento e o comando Table. Drawdowns.
Esta publicação será sobre comparar estratégias do papel & # 8220; Easy Volatility Investing & # 8221 ;, juntamente com uma demonstração do comando de R & # 8217; s table. Drawdowns.
Em primeiro lugar, antes de ir mais longe, enquanto penso que os pressupostos de execução encontrados no EVI não oferecem boas estratégias para o comércio vivo real (embora os compromissos de risco / recompensa também deixem muito espaço para melhorar), acho que essas estratégias são excelentes como benchmarks.
Então, há algum tempo, fiz um teste fora de amostra para uma das estratégias encontradas no EVI, que pode ser encontrada aqui.
Usando a mesma fonte de dados, eu também obtive dados para o SPY (embora, novamente, o AlphaVantage também possa fornecer este serviço gratuitamente para aqueles que não usam Quandl).
Aqui é o novo código.
Então, uma explicação: há quatro fluxos de retorno aqui e compre e segure XIV, o impulso DDN de uma publicação anterior e outras duas estratégias.
O mais simples, chamado VRatio, é simplesmente a proporção do VIX sobre o VXV. Perto do fechamento, verifique esta quantidade. Se isso for menor que um, compre XIV, caso contrário, compre o VXX.
O outro, denominado estratégia de Risco de Volatilidade Premium (ou VRP para breve), compara a volatilidade histórica de 10 dias (ou seja, o desvio padrão de dez dias de duração anualizado) do S & amp; P 500, o subtrai do VIX e leva uma média móvel de 5 dias disso. Perto do fechamento, quando esse acima de zero (ou seja, VIX é maior do que a volatilidade histórica), siga o XIV longo, caso contrário, vá ao VXX longo.
Mais uma vez, todas essas estratégias são efetivamente observadas perto / no fechamento, compre no próximo & # 8221 ;, por isso são úteis para fins de demonstração, embora não para fins de implementação em qualquer conta em grande sem incorrer no impacto do mercado.
Aqui estão os resultados, desde 2018 (ou seja, em torno da época do início real do XIV & # 8217;
Para observar, tanto o impulso como a estratégia VRP conseguiram um desempenho inferior à compra e retenção do XIV desde 2018. A estratégia VRatio, por outro lado, supera a performance.
Aqui, uma função de estatísticas de resumo que compila algumas métricas de desempenho de nível superior.
Para observar, todas as estratégias de benchmark sofreram grandes cortes desde o início do XIV & # 8217; nós podemos examinar usando o comando table. Drawdowns, como se vê abaixo:
Observe que o comando table. Drawdowns examina apenas um fluxo de retorno por vez. Além disso, o argumento principal especifica quantos levantamentos a serem vistos, ordenados pela maior retirada primeiro.
Uma das razões pelas quais eu penso que essas estratégias parecem sofrer as reduções que eles fazem é que eles são todos ativos em um ativo, ou seu oposto exato, sem espaço para erros.
Uma última coisa, para os curiosos, aqui está a comparação com a minha estratégia desde 2018 (essencialmente no início do XIV), comparado com as estratégias do EVI (que tenho negociado com o capital real desde setembro e abriram recentemente um serviço de inscrição para):
Obrigado pela leitura.
NOTA: Atualmente, estou procurando oportunidades em rede e em tempo integral relacionadas ao meu conjunto de habilidades. Meu perfil do LinkedIn pode ser encontrado aqui.
Lançamento do meu serviço de assinatura.
Depois de avaliar o interesse de meus leitores, eu decidi abrir um serviço de assinatura. I & # 8217; copiar e colar as perguntas frequentes, ou a minha melhor tentativa de tentar responder tantas perguntas quanto possível antes do tempo e pode responder mais no futuro.
Eu estou escolhendo usar Patreon apenas para terceirizar todos os aspectos técnicos de manipulação de assinaturas e criar uma fonte centralizada para publicar conteúdo baseado em assinatura.
Perguntas frequentes (copiadas da página de inscrição):
Obrigado pela visita. Depois de avaliar o interesse dos meus leitores no meu site principal (quantstrattrader. wordpress), eu criei isso como uma página de inscrição para estratégias quantitativas de investimento, com o objetivo de fazer com que os assinantes transformem seu dinheiro em mais dinheiro, sem taxas de assinatura (espero). Os sistemas que desenvolvo provêm de um aprendizado de profissionais experientes de negociação quantitativa e pesquisadores seniores em grandes empresas. O sistema atual que eu inicialmente publiquei um protótipo por vários anos atrás e assisti que fosse rastreado, antes de começar a implantar minha própria capital no início deste ano e fazer as modificações mais recentes ainda mais recentemente.
E enquanto a performance passada não garante resultados futuros e o passado não se repete, muitas vezes rima, então deixe o dinheiro em mais dinheiro.
Algumas perguntas frequentes sobre a estratégia:
Qual é o preço de assinatura desta estratégia?
Atualmente, depois de avaliar o interesse dos leitores e fazer pesquisas com base em outros sites, o preço tentativo é de US $ 50 / mês. Como esta estratégia cria um histórico, isso pode estar sujeito a mudanças no futuro, e as notificações serão feitas nesse evento.
Qual é a descrição da estratégia?
A estratégia é principalmente um sistema de baixa volatilidade que comercializa XIV, ZIV e VXX. No que diz respeito às estratégias de volatilidade, é bastante conservador na medida em que usa várias verificações diferentes para garantir uma posição.
Qual é a vantagem da estratégia?
Em duas palavras: gerenciamento de riscos. Essencialmente, existem alguns critérios separados para selecionar um investimento, e o sistema gasta um tempo não insignificante sem exposição quando alguns desses critérios fornecem sinais contraditórios. Além disso, o sistema usa metodologias disciplinadas em sua construção para evitar parâmetros livres desnecessários e para manter a estratégia tão parcimoniosa quanto possível.
Você troca seu próprio capital com essa estratégia?
Quando foi o período de treinamento na amostra para este sistema?
Um site que não atualiza seu blog (volatilidade simples), uma vez rastreou uma estratégia mais rudimentar que escrevi há vários anos atrás. Fiquei particularmente satisfeito com os resultados dessa pesquisa e, recentemente, recebi informações para melhorar meu sistema em um grau muito maior, além de ganhar confiança para investir capital vivo nele.
Quantos negócios por ano faz o sistema?
No backtest de 20 de abril de 2008 até o final de 2018, o sistema efetuou 187 transações no XIV (compra e venda), 160 em ZIV e 52 em VXX. Significando ao longo de aproximadamente 9 anos, houve em média 43 transações por ano. Em alguns casos, isso pode simplesmente mudar de XIV para ZIV ou vice-versa. Em outras palavras, os negócios duram cerca de uma semana (alguns podem ser mais longos, alguns mais curtos).
Quando os sinais serão publicados?
Os sinais serão publicados em algum momento entre as 12 horas e o fechamento do mercado (4 PM EST). Em backtesting, eles são testados como um mercado em certas ordens, para que os indivíduos assumam qualquer risco / recompensa executando anteriormente.
Com que frequência este sistema está no mercado?
Cerca de 56%. No entanto, ao longo do backtesting (e negociação ao vivo), apenas cerca de 9% dos meses têm retorno zero.
Qual é a distribuição dos meses de retorno, perda e zero?
No final de outubro de 2017, houve cerca de 65% de meses vencedores (com um ganho médio de 12,8%), 26% meses perdidos (com uma perda média de 4,9%) e 9% zero meses.
Quais são algumas outras estatísticas sobre a estratégia?
Desde 2018 (em torno do tempo em que o XIV entrou oficialmente no início, em oposição ao uso de dados sintéticos), a estratégia apresentou um retorno anualizado de 82%, com uma redução máxima de 24,8% e um desvio padrão anualizado de 35%. Isso significa uma razão de Sharpe (retorno ao desvio padrão) superior a 2, e uma razão de Calmar superior a 3. Também possui um índice de desempenho de úlcera de 10.
Quais são as piores reduções da estratégia?
Desde 2018 (novamente, em torno da época do início do XIV & # 8217; s), a maior retirada foi de 24,8%, a partir de 31 de outubro de 2018, e registrando uma nova alta patrimonial em 12 de janeiro de 2018. A maior retirada começou em 21 de agosto de 2018. , 2018 e recuperado em 10 de abril de 2018, e durou 160 dias de negociação.
O preço da assinatura mudará no futuro?
Se a estratégia continuar a gerar retornos fortes, então pode haver motivos para aumentar o preço, desde que os retornos o dêem conta.
Pode ser fornecido um sinal de risco conservador para aqueles que podem não ser capazes de tolerar uma redução de 25%?
Uma variante da estratégia que alveja cerca de metade do desvio padrão anualizado da estratégia possui um retorno anualizado de 40% para cerca de 12% de desconto desde 2018. No geral, isso tem uma recompensa ligeiramente maior para as estatísticas de risco, mas ao custo de cortar retornos agregados ao meio.
Can & # 8217; t XIV tem um evento de término?
Isso se refere à idéia de que o XIV ETN termina se perder 80% de seu valor em um único dia. Para dar uma idéia da probabilidade deste evento, usando dados sintéticos, o XIV ETN apresentou uma redução massiva de 92% ao longo da crise financeira de 2008. Para a história desse dado sintético (pré-inicial) e realizado (pós-início), o pior dia absoluto foi um dia de queda de 26,8%. Para notar, a estratégia não estava no XIV durante esse dia.
Qual foi o pior dia da estratégia?
Em 16 de setembro de 2018, a estratégia perdeu 16% em um dia. Este foi o final da cauda de um período positivo que fez cerca de 40%.
Quais são os riscos da estratégia?
O primeiro risco é que, dado que esta estratégia é naturalmente tendenciosa para uma baixa volatilidade, que pode ter potencial para algumas reduções bruscas devido à natureza dos picos de volatilidade. O outro risco é que, dado que essa estratégia às vezes gasta seu tempo em ZIV, isso será inferior ao XIV em alguns dias úteis. Este segundo risco é uma conseqüência de camadas adicionais de gerenciamento de risco na estratégia.
Quão complexa é essa estratégia?
Não excessivamente. É apenas um pouco mais complexo do que uma estratégia básica de momentum ao contar parâmetros gratuitos e pode ser explicado em alguns minutos.
Essa estratégia usa metodologias complexas de aprendizado de máquinas?
Não. Os requisitos de dados para tais algoritmos e o ruído no mundo financeiro tornam muito arriscado aplicar essas metodologias e, até o momento, a pesquisa não deu frutos para justificar sua incorporação.
O volume do instrumento será sempre uma preocupação (particularmente ZIV)?
De acordo com um indivíduo que trabalhou na criação do original VXX ETN (e, por extensão, seu inverso, XIV), novas ações de ETNs podem ser criadas pelo emissor (no caso ZIV & # 8217; Credit Suisse) sob demanda. Em suma, a preocupação do volume é mais uma preocupação com a reputação da pessoa que faz o pedido. Em outras palavras, depende de quão bem a estratégia faz.
A estratégia pode ser responsabilizada / responsável / responsável pela perda / retirada de um assinante?
Deixe isso servir como um aviso: ao subscrever, você concorda em renunciar a qualquer reclamação legal contra a estratégia ou seu (s) criador (s) no caso de cobranças, perdas, etc. A subscrição é para visualizar o resultado de um programa e este serviço não gerencia ativamente um centavo de assinantes & # 8217; ativos reais. Os assinantes podem optar por ignorar os sinais da estratégia em um momento de aviso a seu critério. A saída do programa não deve ser considerada como o conselho de investimento proveniente de um CFP, CFA, RIA, etc.
Por que esses sinais devem ser confiáveis?
Porque meu trabalho em outros tópicos foi exibido em exibição pública por vários anos. Ao contrário de outros sites, eu mostrei "backtests" negativos e # 8221 ;, quebrando o adágio de & # 8220; você nunca verá um backtest ruim e # 8221 ;. Eu mostrei minuciosidade em minha pesquisa, e o mesmo rigor foi aplicado para este sistema também. Até que haja um histórico mais longo, de modo que o sistema possa ficar sozinho, a confiança no sistema é a confiança no criador do sistema.
Quem é o público-alvo desses sinais?
O público-alvo é individual, investidores de varejo com uma certa tolerância ao risco, e tem um preço correspondente.
A volatilidade da indústria não é muito arriscada?
É arriscado, na perspectiva do instrumento subjacente, a capacidade de realizar grandes arranjos (superior a 60% e até maior que 90%). No entanto, de um ponto de vista puramente numérico, a empresa assumiu muitas lojas, a Amazon, desde o início, teve uma taxa de retorno anualizada de 37,1%, um desvio padrão de 61,5%, uma pior retirada de 94% e um índice de desempenho de úlcera de 0,9. Em comparação, XIV, a partir de 2008 (usando dados sintéticos), teve uma taxa de retorno anualizada de 35,5%, um desvio padrão de 57,7%, uma pior retirada de 92% e um índice de desempenho de úlceras de 0,6. Se a Amazon for considerada um recurso de alto nível, então, a partir de uma comparação quantitativa, um sistema que busca capitalizar apostas de volatilidade deve ser visto de uma perspectiva similar. Com certeza, o desempenho da estratégia supera muito o de comprar e manter XIV (que ninguém deveria fazer). No entanto, a filosofia dos produtos de volatilidade é muito mais arriscada do que os nomes das máquinas domésticas simplesmente não é válida, a menos que o futuro difira do passado.
Existe a possibilidade de colaborar com outros criadores de estratégias?
Não hesite em contactar-me no meu email ilya. kipnis@gmail para discutir essa possibilidade. Solicito um fluxo diário de retornos antes de iniciar qualquer discussão.
Por ter passado todas as janelas artesanais e interessantes opções de vocabulário, a Patreon é simplesmente uma plataforma que processa pagamentos e cria uma plataforma centralizada para publicar conteúdo baseado em assinatura, em oposição à manutenção de listas de endereços e outras dores de cabeça técnicas. Essencialmente, é simplesmente uma maneira de terceirizar o fim técnico da execução de um negócio, mesmo que o curativo seja pouco ortodoxo.
Obrigado pela leitura.
NOTA: Atualmente, estou interessado em trabalho em rede e em funções de tempo integral com base em minhas habilidades. Meu perfil do LinkedIn pode ser encontrado aqui.
O retorno de dados gratuitos e a possível assinatura de negociação de volatilidade.
Este post será sobre como tirar dados gratuitos do AlphaVantage e avaliar os juros para um serviço de inscrição de importação de volatilidade.
Então, primeiro, desde que os yahoos no Yahoo decidiram desligar seus dados gratuitos, o mundo dos dados diários gratuitos tem estado em uma idade sombria. Bem, graças ao blog. fosstrading / 2017/10 / getsymbols-and-alpha-vantage. html # gpluscommentsJosh Ulrich, Paul Teetor e outros indivíduos R / Finance, a última edição do quantmod (que pode ser instalado no CRAN) agora contém uma maneira de obter dados financeiros gratuitos da AlphaVantage desde o ano 2000, que geralmente é suficiente para a maioria dos backtests, já que essa data é anterior ao início da maioria dos ETFs.
Aqui, é como fazê-lo.
Depois de fazer isso, o download de dados é simples, se não um pouco lento. Aqui, é como fazê-lo.
E os resultados:
Which means if any one of my old posts on asset allocation has been somewhat defunct thanks to bad yahoo data, it will now work again with a slight modification to the data input algorithms.
Beyond demonstrating this routine, one other thing I’d like to do is to gauge interest for a volatility signal subscription service, for a system I have personally started trading a couple of months ago.
Simply, I have seen other websites with subscription services with worse risk/reward than the strategy I currently trade, which switches between XIV, ZIV, and VXX. Currently, the equity curve, in log 10, looks like this:
That is, $1000 in 2008 would have become approximately $1,000,000 today, if one was able to trade this strategy since then.
Since 2018 (around the time of inception for XIV), the performance has been:
Considering that some websites out there charge upwards of $50 a month for either a single tactical asset rotation strategy (and a lot more for a combination) with inferior risk/return profiles, or a volatility strategy that may have had a massive and historically record-breaking drawdown, I was hoping to gauge a price point for what readers would consider paying for signals from a better strategy than those.
Obrigado pela leitura.
NOTE: I am currently interested in networking and am seeking full-time opportunities related to my skill set. My LinkedIn profile can be found here.
The Kelly Criterion — Funciona?
This post will be about implementing and investigating the running Kelly Criterion — that is, a constantly adjusted Kelly Criterion that changes as a strategy realizes returns.
For those not familiar with the Kelly Criterion, it’s the idea of adjusting a bet size to maximize a strategy’s long term growth rate. Both https://en. wikipedia/wiki/Kelly_criterionWikipedia and Investopedia have entries on the Kelly Criterion. Essentially, it’s about maximizing your long-run expectation of a betting system, by sizing bets higher when the edge is higher, and vice versa.
There are two formulations for the Kelly criterion: the Wikipedia result presents it as mean over sigma squared. The Investopedia definition is P-[(1-P)/winLossRatio], where P is the probability of a winning bet, and the winLossRatio is the average win over the average loss.
In any case, here are the two implementations.
Let’s try this with some data. At this point in time, I’m going to show a non-replicable volatility strategy that I currently trade.
For the record, here are its statistics:
Now, let’s see what the Wikipedia version does:
The results are simply ridiculous. And here would be why: say you have a mean return of .0005 per day (5 bps/day), and a standard deviation equal to that (that is, a Sharpe ratio of 1). You would have 1/.0005 = 2000. In other words, a leverage of 2000 times. This clearly makes no sense.
The other variant is the more particular Investopedia definition.
Looks a bit more reasonable. However, how does it stack up against not using it at all?
Turns out, the fabled Kelly Criterion doesn’t really change things all that much.
For the record, here are the statistical comparisons:
Obrigado pela leitura.
NOTE: I am currently looking for my next full-time opportunity, preferably in New York City or Philadelphia relating to the skills I have demonstrated on this blog. My LinkedIn profile can be found here. If you know of such opportunities, do not hesitate to reach out to me.
Leverage Up When You’re Down?
This post will investigate the idea of reducing leverage when drawdowns are small, and increasing leverage as losses accumulate. It’s based on the idea that whatever goes up must come down, and whatever comes down generally goes back up.
I originally came across this idea from this blog post.
So, first off, let’s write an easy function that allows replication of this idea. Essentially, we have several arguments:
One: the default leverage (that is, when your drawdown is zero, what’s your exposure)? For reference, in the original post, it’s 10%.
Next: the various leverage levels. In the original post, the leverage levels are 25%, 50%, and 100%.
And lastly, we need the corresponding thresholds at which to apply those leverage levels. In the original post, those levels are 20%, 40%, and 55%.
So, now we can create a function to implement that in R. The idea being that we have R compute the drawdowns, and then use that information to determine leverage levels as precisely and frequently as possible.
Here’s a quick piece of code to do so:
So, let’s replicate some results.
And our results look something like this:
That said, what would happen if one were to extend the data for all available XIV data?
A different story.
In this case, I think the takeaway is that such a mechanism does well when the drawdowns for the benchmark in question occur sharply, so that the lower exposure protects from those sharp drawdowns, and then the benchmark spends much of the time in a recovery mode, so that the increased exposure has time to earn outsized returns, and then draws down again. When the benchmark continues to see drawdowns after maximum leverage is reached, or continues to perform well when not in drawdown, such a mechanism falls behind quickly.
As always, there is no free lunch when it comes to drawdowns, as trying to lower exposure in preparation for a correction will necessarily mean forfeiting a painful amount of upside in the good times, at least as presented in the original post.
Obrigado pela leitura.
NOTE: I am currently looking for my next full-time opportunity, preferably in New York City or Philadelphia relating to the skills I have demonstrated on this blog. My LinkedIn profile can be found here. If you know of such opportunities, do not hesitate to reach out to me.
Let’s Talk Drawdowns (And Affiliates)
This post will be directed towards those newer in investing, with an explanation of drawdowns–in my opinion, a simple and highly important risk statistic.
Would you invest in this?
As it turns out, millions of people do, and did. That is the S&P 500, from 2000 through 2018, more colloquially referred to as “the stock market”. Plenty of people around the world invest in it, and for a risk to reward payoff that is very bad, in my opinion. This is an investment that, in ten years, lost half of its value–twice!
At its simplest, an investment–placing your money in an asset like a stock, a savings account, and so on, instead of spending it, has two things you need to look at.
First, what’s your reward? If you open up a bank CD, you might be fortunate to get 3%. If you invest it in the stock market, you might get 8% per year (on average) if you held it for 20 years. In other words, you stow away $100 on January 1st, and you might come back and find $108 in your account on December 31st. This is often called the compound annualized growth rate (CAGR)–meaning that if you have $100 one year, earn 8%, you have 108, and then earn 8% on that, and so on.
The second thing to look at is the risk. What can you lose? The simplest answer to this is “the maximum drawdown”. If this sounds complicated, it simply means “the biggest loss”. So, if you had $100 one month, $120 next month, and $90 the month after that, your maximum drawdown (that is, your maximum loss) would be 1 – 90/120 = 25%.
When you put the reward and risk together, you can create a ratio, to see how your rewards and risks line up. This is called a Calmar ratio, and you get it by dividing your CAGR by your maximum drawdown. The Calmar Ratio is a ratio that I interpret as “for every dollar you lose in your investment’s worst performance, how many dollars can you make back in a year?” For my own investments, I prefer this number to be at least 1, and know of a strategy for which that number is above 2 since 2018, or higher than 3 if simulated back to 2008.
Most stocks don’t even have a Calmar ratio of 1, which means that on average, an investment makes more than it can possibly lose in a year. Even Amazon, the company whose stock made Jeff Bezos now the richest man in the world, only has a Calmar Ratio of less than 2/5, with a maximum loss of more than 90% in the dot-com crash. The S&P 500, again, “the stock market”, since 1993, has a Calmar Ratio of around 1/6. That is, the worst losses can take *years* to make back.
A lot of wealth advisers like to say that they recommend a large holding of stocks for young people. In my opinion, whether you’re young or old, losing half of everything hurts, and there are much better ways to make money than to simply buy and hold a collection of stocks.
For those with coding skills, one way to gauge just how good or bad an investment is, is this:
An investment has a history–that is, in January, it made 3%, in February, it lost 2%, in March, it made 5%, and so on. By shuffling that history around, so that say, January loses 2%, February makes 5%, and March makes 3%, you can create an alternate history of the investment. It will start and end in the same place, but the journey will be different. For investments that have existed for a few years, it is possible to create many different histories, and compare the Calmar ratio of the original investment to its shuffled “alternate histories”. Ideally, you want the investment to be ranked among the highest possible ways to have made the money it did.
To put it simply: would you rather fall one inch a thousand times, or fall a thousand inches once? Well, the first one is no different than jumping rope. The second one will kill you.
Here is some code I wrote in R (if you don’t code in R, don’t worry) to see just how the S&P 500 (the stock market) did compared to how it could have done.
This is the resulting plot:
That red line is the actual performance of the S&P 500 compared to what could have been. And of the 1000 different simulations, only 91 did worse than what happened in reality.
This means that the stock market isn’t a particularly good investment, and that you can do much better using tactical asset allocation strategies.
One site I’m affiliated with, is AllocateSmartly. It is a cheap investment subscription service ($30 a month) that compiles a collection of asset allocation strategies that perform better than many wealth advisers. When you combine some of those strategies, the performance is better still. To put it into perspective, one model strategy I’ve come up with has this performance:
In this case, the compound annualized growth rate is nearly double that of the maximum loss. For those interested in something a bit more aggressive, this strategy ensemble uses some fairly conservative strategies in its approach.
In conclusion, when considering how to invest your money, keep in mind both the reward, and the risk. One very simple and important way to understand risk is how much an investment can possibly lose, from its highest, to its lowest value following that peak. When you combine the reward and the risk, you can get a ratio that tells you about how much you can stand to make for every dollar lost in an investment’s worst performance.
Obrigado pela leitura.
NOTE: I am interested in networking opportunities, projects, and full-time positions related to my skill set. If you are looking to collaborate, please contact me on my LinkedIn here.
An Out of Sample Update on DDN’s Volatility Momentum Trading Strategy and Beta Convexity.
The first part of this post is a quick update on Tony Cooper’s of Double Digit Numerics’s volatility ETN momentum strategy from the volatility made simple blog (which has stopped updating as of a year and a half ago). The second part will cover Dr. Jonathan Kinlay’s Beta Convexity concept.
So, now that I have the ability to generate a term structure and constant expiry contracts, I decided to revisit some of the strategies on Volatility Made Simple and see if any of them are any good (long story short: all of the publicly detailed ones aren’t so hot besides mine–they either have a massive drawdown in-sample around the time of the crisis, or a massive drawdown out-of-sample).
Why this strategy? Because it seemed different from most of the usual term structure ratio trades (of which mine is an example), so I thought I’d check out how it did since its first publishing date, and because it’s rather easy to understand.
Here’s the strategy:
Take XIV, VXX, ZIV, VXZ, and SHY (this last one as the “risk free” asset), and at the close, invest in whichever has had the highest 83 day momentum (this was the result of optimization done on volatilityMadeSimple).
Here’s the code to do this in R, using the Quandl EOD database. There are two variants tested–observe the close, buy the close (AKA magical thinking), and observe the close, buy tomorrow’s close.
Here are the results.
Looks like this strategy didn’t pan out too well. Just a daily reminder that if you’re using fine grid-search to select a particularly good parameter (EG n = 83 days? Maybe 4 21-day trading months, but even that would have been n = 82), you’re asking for a visit from, in the words of Mr. Tony Cooper, a visit from the grim reaper.
Moving onto another topic, whenever Dr. Jonathan Kinlay posts something that I think I can replicate that I’d be very wise to do so, as he is a very skilled and experienced practitioner (and also includes me on his blogroll).
A topic that Dr. Kinlay covered is the idea of beta convexity–namely, that an asset’s beta to a benchmark may be different when the benchmark is up as compared to when it’s down. Essentially, it’s the idea that we want to weed out firms that are what I’d deem as “losers in disguise”–I. E. those that act fine when times are good (which is when we really don’t care about diversification, since everything is going up anyway), but do nothing during bad times.
The beta convexity is calculated quite simply: it’s the beta of an asset to a benchmark when the benchmark has a positive return, minus the beta of an asset to a benchmark when the benchmark has a negative return, then squaring the difference. That is, (beta_bench_positive – beta_bench_negative) ^ 2.
Here’s some R code to demonstrate this, using IBM vs. the S&P 500 since 1995.
Obrigado pela leitura.
NOTE: I am always looking to network, and am currently actively looking for full-time opportunities which may benefit from my skill set. If you have a position which may benefit from my skills, do not hesitate to reach out to me. My LinkedIn profile can be found here.
QuantStart.
Junte-se ao portal de membros privados da Quantcademy que atende à comunidade de comerciantes de varejo de varejo em rápido crescimento. Você encontrará um grupo bem informado de mentalistas quant pronto para responder suas perguntas comerciais mais importantes.
Confira meu ebook sobre o comércio de quant, onde eu ensino você como criar estratégias de negociação sistemáticas lucrativas com ferramentas Python, desde o início.
Dê uma olhada no meu novo ebook sobre estratégias de negociação avançadas usando análise de séries temporais, aprendizado de máquina e estatísticas bayesianas, com Python e R.
Por Michael Halls-Moore em 21 de janeiro de 2018.
Eu mencionei anteriormente no artigo QuantStart: 2018 In Review que eu estaria gastando algum escrito em 2018 sobre negociação forex automatizada.
Dado que eu mesmo geralmente realizo pesquisas em mercados de ações e futuros, pensei que seria divertido (e educativo!) Escrever sobre minhas experiências de entrar no mercado de divisas no estilo de um diário. Cada "entrada diária" tentará construir sobre todos aqueles antes, mas também deve ser relativamente autônoma.
Nesta primeira entrada do diário, descreverei como configurar uma nova conta de corretagem de prática com a OANDA, bem como a forma de criar um motor de negociação básico baseado em múltiplos processos que possa executar negócios automaticamente em uma configuração prática e ao vivo.
No ano passado, passamos muito tempo olhando o backtester baseado em eventos, principalmente para ações e ETFs. O que eu apresento abaixo é orientado para o forex e pode ser usado para negociação de papel ou negociação ao vivo.
Eu escrevi todas as instruções a seguir para o Ubuntu 14.04, mas elas devem ser facilmente traduzidas para Windows ou Mac OS X, usando uma distribuição Python, como Anaconda. A única biblioteca adicional usada para o mecanismo comercial Python é a biblioteca de solicitações, que é necessária para a comunicação HTTP para a API OANDA.
Uma vez que este é o primeiro post diretamente sobre o comércio cambial, e o código apresentado abaixo pode ser direto para um ambiente de negociação ao vivo, gostaria de apresentar as seguintes isenções:
Isenção de responsabilidade: a negociação de câmbio na margem possui um alto nível de risco e pode não ser adequada para todos os investidores. O desempenho passado não é indicativo de resultados futuros. O alto grau de alavancagem pode funcionar contra você, bem como para você. Antes de decidir investir em divisas, você deve considerar cuidadosamente seus objetivos de investimento, nível de experiência e apetite de risco. Existe a possibilidade de que você possa sustentar uma perda de algum ou todo seu investimento inicial e, portanto, você não deve investir dinheiro que não pode perder. Você deve estar ciente de todos os riscos associados à negociação cambial e procurar o aconselhamento de um consultor financeiro independente se tiver dúvidas.
Este software é fornecido "tal como está" e quaisquer garantias expressas ou implícitas, incluindo, mas não limitado a, as garantias implícitas de comercialização e adequação para um propósito específico são negadas. Em nenhum caso, os regentes ou contribuidores serão responsáveis por quaisquer danos diretos, indiretos, incidentais, especiais, exemplares ou conseqüentes (incluindo, mas não limitado a, aquisição de bens ou serviços de substituição, perda de uso, dados ou lucros, ou interrupção do negócio), no entanto, causou e em qualquer teoria da responsabilidade, seja no contrato, responsabilidade restritiva ou delito (incluindo negligência ou outra) decorrente de qualquer uso do software, mesmo que seja avisado da possibilidade de tal dano.
Configurando uma conta com OANDA.
A primeira pergunta que vem à mente é "Por que escolher OANDA?". Simplificando, depois de um pouco de Googling em torno de corretores de Forex que possuíam APIs, vi que a OANDA havia lançado recentemente uma API REST adequada que poderia ser facilmente comunicada com quase qualquer idioma de uma maneira extremamente direta. Depois de ler a documentação da API do desenvolvedor, eu decidi fazer uma tentativa, pelo menos com uma conta prática.
Para ser claro - não tenho relação anterior ou existente com a OANDA e estou fornecendo apenas esta recomendação com base em minha experiência limitada ao brincar com sua API prática e algum uso breve (para download de dados de mercado) enquanto empregado em um fundo anteriormente. Se alguém se deparou com outros corretores forex que também tenham uma API similarmente moderna, então eu ficaria feliz em dar-lhes um olhar também.
Antes de utilizar a API, é necessário se inscrever para uma conta prática. Para fazer isso, vá para o link de inscrição. Você verá a seguinte tela:
Você poderá fazer login com suas credenciais de login. Certifique-se de selecionar a guia "fxTradePractice" na tela de login:
Uma vez que você precisa fazer uma anotação da sua identificação da conta. Ele está listado abaixo do cabeçalho preto "Meus fundos" ao lado de "Primário". O meu é um número de 7 dígitos. Além disso, você também precisará gerar um token de API pessoal. Para fazer isso, clique em "Gerenciar Acesso da API" abaixo da guia "Outras Ações" no canto inferior esquerdo:
Nesta fase, você poderá gerar um token de API. Você precisará da chave para o uso mais tarde, então certifique-se de anotá-la também.
Agora você deseja iniciar o aplicativo FXTrade Practice, o que nos permitirá ver as ordens executadas e nosso (paper!) Profit & amp; perda.
Se você estiver executando um sistema Ubuntu, você precisará instalar uma versão ligeiramente diferente do Java. Em particular, a versão Oracle do Java 8. Se você não fizer isso, o simulador de prática não será carregado a partir do navegador. Executei esses comandos no meu sistema:
Agora você poderá iniciar o ambiente comercial da prática. Volte para o painel de controle OANDA e clique no link verde "Lançar FXTrade Practice". Ele abrirá uma caixa de diálogo Java perguntando se deseja executá-lo. Clique em "Executar" e a ferramenta FxTrade Practice será carregada. O meu padrão foi ajustado para um gráfico de velas de 15 minutos de EUR / USD com o Painel de Citações à esquerda:
Tela de prática OANDA fxTrade.
Neste ponto, estamos prontos para começar a projetar e codificar nosso sistema automatizado de trading forex contra a API OANDA.
Visão geral da arquitetura comercial.
Se você acompanha a série de backtester com base em eventos para ações e ETFs que eu criei no ano passado, você estará ciente de como esse sistema de negociação baseado em eventos funciona. Para aqueles que são novos para o software dirigido a eventos, eu sugeriria fortemente a leitura do artigo, a fim de obter informações sobre como eles funcionam.
Em essência, todo o programa é executado em um loop infinte while que só termina quando o sistema comercial é desligado. O mecanismo de comunicação central do programa é fornecido através de uma fila que contém eventos.
A fila é constantemente consultada para verificar novos eventos. Uma vez que um evento foi retirado do topo da fila, ele deve ser tratado por um componente apropriado do programa. Portanto, um feed de dados do mercado pode criar o TickEvent s que são colocados na fila quando um novo preço de mercado chega. Um objeto de estratégia gerador de sinal pode criar OrderEvent s que devem ser enviados para uma corretora.
A utilidade de tal sistema é dada pelo fato de que não importa qual ordem ou tipos de eventos são colocados na fila, pois eles sempre serão tratados corretamente pelo componente certo dentro do programa.
Além disso, diferentes partes do programa podem ser executadas em segmentos separados, o que significa que nunca há espera por nenhum componente específico antes de processar qualquer outro. Isso é extremamente útil em situações de negociação algorítmica, onde manipuladores de feed de dados de mercado e geradores de sinal de estratégia possuem características de desempenho muito diferentes.
O principal ciclo de negociação é dado pelo seguinte pseudo-código Python:
Como afirmamos acima, o código é executado em um loop infinito. Em primeiro lugar, a fila é polida para recuperar um novo evento. Se a fila estiver vazia, o loop simplesmente será reiniciado após um período de sono curto conhecido como "batimento cardíaco". Se um evento for encontrado, seu tipo é avaliado e, em seguida, o módulo relevante (seja a estratégia ou o manipulador de execução) é chamado a lidar com o evento e possivelmente gerar novos que voltem para a fila.
Os componentes básicos que criaremos para o nosso sistema comercial incluem o seguinte:
Manipulador de preços de transmissão - Isso manterá uma conexão de longa duração aberta aos servidores OANDAs e enviará dados de marca (por exemplo, lance / pedido) em toda a conexão para quaisquer instrumentos nos quais estamos interessados. Estratégia Gerador de Sinal - Isso levará uma seqüência de tiques eventos e use-os para gerar ordens de negociação que serão executadas pelo manipulador de execução. Manipulador de Execução - Executa um conjunto de eventos de ordem e depois os executa cegamente com OANDA. Eventos - Esses objetos constituem as "mensagens" que são transmitidas na fila de eventos. Exigimos apenas dois para esta implementação, nomeadamente o TickEvent e o OrderEvent. Ponto de entrada principal - O ponto de entrada principal também inclui o loop "trade" que pesquisa continuamente a fila de mensagens e envia mensagens para o componente correto. Isso geralmente é conhecido como "loop de eventos" ou "manipulador de eventos".
Vamos agora discutir a implementação do código em detalhes. Na parte inferior do artigo está a listagem completa de todos os arquivos de código fonte. Se você colocá-los no mesmo diretório e executar o python trading. py, você começará a gerar ordens, assumindo que você tenha preenchido o ID da sua conta e o token de autenticação da OANDA.
Implementação do Python.
É uma prática ruim armazenar senhas ou chaves de autenticação dentro de uma base de códigos, pois você nunca pode prever quem será, eventualmente, permitido o acesso a um projeto. Em um sistema de produção, nós armazenamos essas credenciais como variáveis de ambiente com o sistema e, em seguida, consultamos esses "envvars" cada vez que o código é redistribuído. Isso garante que as senhas e os tokens de autenticação nunca sejam armazenados em um sistema de controle de versão.
No entanto, uma vez que estamos apenas interessados em construir um sistema de comércio de "brinquedos" e não nos preocupamos com detalhes de produção neste artigo, em vez disso, separaremos estes tokens de autenticação em um arquivo de configurações.
No seguinte arquivo de configuração settings. py, temos um dicionário chamado AMBIENTES que armazena os pontos finais da API tanto para a API de transmissão de preços OANDA como para a API de negociação. Cada subdiretor contém três pontos de extremidade de API diferentes: real, prática e sandbox.
A API do sandbox é puramente para testar o código e verificar se não há erros ou erros. Não possui as garantias de tempo de atividade das APIs reais ou de prática. A API prática, em essência, oferece a capacidade de comércio de papel. Ou seja, ele fornece todos os recursos da API real em uma conta de prática simulada. A API real é apenas isso - é uma negociação ao vivo! Se você usa esse ponto final em seu código, ele será negociado contra o saldo da sua conta ao vivo. SEJA EXTREMAMENTE CUIDADOSO!
IMPORTANTE: quando negociar contra a prática, lembre-se de que um custo de transação importante, o impacto de mercado, não é considerado. Uma vez que nenhum negócio é realmente colocado no meio ambiente, esse custo deve ser contabilizado de outra maneira em outro lugar usando um modelo de impacto de mercado, se você deseja avaliar de forma realista o desempenho.
No seguinte, estamos usando a conta prática conforme a configuração DOMAIN. Precisamos de dois dicionários separados para os domínios, um para os componentes da API de transmissão e transmissão. Finalmente, temos ACCESS_TOKEN e ACCOUNT_ID. Eu preenchi os dois abaixo com IDs fofos, então você precisará usar o seu próprio, que pode ser acessado a partir da página da conta OANDA:
O próximo passo é definir os eventos que a fila usará para ajudar todos os componentes individuais a se comunicarem. Precisamos de dois: TickEvent e OrderEvent. O primeiro armazena informações sobre dados do mercado de instrumentos, como o (melhor) lance / pedido e o tempo de troca. O segundo é usado para transmitir ordens ao manipulador de execução e, portanto, contém o instrumento, o número de unidades a negociar, o tipo de ordem ("mercado" ou "limite") e o "lado" (ou seja, "comprar" e "vender" ).
Para o futuro do nosso código de eventos, vamos criar uma classe base chamada Evento e ter todos os eventos herdados disto. O código é fornecido abaixo em events. py:
A próxima classe que vamos criar irá lidar com a estratégia de negociação. Nesta demonstração, vamos criar uma estratégia bastante absurda que simplesmente receba todos os carrapatos do mercado e, em cada 5º tick, compra ou vende de maneira aleatória 10 mil unidades de EUR / USD.
Claramente, esta é uma "estratégia" ridícula. No entanto, é fantástico para fins de teste porque é direto codificar e entender. Em futuras entradas no diário, estaremos substituindo isso por algo significativamente mais emocionante que (espero) gire um lucro!
O arquivo strategy. py pode ser encontrado abaixo. Vamos trabalhar com isso e ver o que está acontecendo. Em primeiro lugar, importamos a biblioteca aleatória e o objeto OrderEvent de events. py. Precisamos da libação aleatória para selecionar uma ordem de compra ou venda aleatória. Precisamos do OrderEvent, pois é assim que o objeto de estratégia enviará ordens para a fila de eventos, que posteriormente será executada pelo manipulador de execução.
A classe TestRandomStrategy simplesmente leva o instrumento (neste caso EUR / USD), o número de unidades e a fila de eventos como um conjunto de parâmetros. Em seguida, cria um contador de tiques que é usado para contar quantas instâncias do TickEvent já viu.
A maior parte do trabalho ocorre no método calculate_signals, que simplesmente leva um evento, determina se é um TickEvent (ignore) e incrementa o contador de tiques. Em seguida, verifica se a contagem é divisível em 5 e, em seguida, compra ou vende aleatoriamente, com uma ordem de mercado, o número especificado de unidades. Certamente, não é a maior estratégia de negociação do mundo, mas será mais do que adequada para os nossos testes de API de corretagem da OANDA!
O próximo componente é o manipulador de execução. Esta classe é encarregada de atuar sobre as instâncias do OrderEvent e fazer solicitações ao corretor (neste caso, OANDA) de forma "burra". Ou seja, não há gerenciamento de risco ou sobreposição de construção de potfolio. O manipulador de execução simplesmente executará qualquer ordem que tenha sido dada.
Devemos passar todas as informações de autenticação para a classe Execution, incluindo o "domínio" (prática, real ou sandbox), o token de acesso e identificação da conta. Em seguida, criamos uma conexão segura com o httplib, um dos Pythons criados em bibliotecas.
A maior parte do trabalho ocorre em execute_order. O método requer um evento como um parâmetro. Em seguida, constrói dois dicionários - os cabeçalhos e os params. Esses dicionários serão corretamente codificados (parcialmente por urllib, outra biblioteca Python) para serem enviados como uma solicitação HTTP POST para a API OANDAs.
Passamos os parâmetros de cabeçalho do tipo de conteúdo e autorização, que incluem nossas informações de autenticação. Além disso, codificamos os parâmetros, que incluem o instrumento (EUR / USD), unidades, tipo de ordem e lado (compra / venda). Finalmente, fazemos o pedido e salvamos a resposta:
O componente mais complexo do sistema de negociação é o objeto StreamingForexPrices, que lida com as atualizações de preços de mercado da OANDA. Existem dois métodos: connect_to_stream e stream_to_queue.
O primeiro método usa a biblioteca de solicitações Python para se conectar a um soquete de transmissão com os cabeçalhos e parâmetros apropriados. Os parâmetros incluem o ID da conta e a lista de instrumentos necessários que devem ser ouvidos para atualizações (neste caso, é apenas EUR / USD). Observe a seguinte linha:
Isso diz que a conexão deve ser transmitida e, portanto, mantida aberta de uma maneira longa.
O segundo método, stream_to_queue, realmente tenta se conectar ao fluxo. Se a resposta não for bem sucedida (ou seja, o código de resposta não é HTTP 200), então simplesmente retornamos e saímos. Se for bem sucedido, tentamos carregar o pacote JSON retornado para um dicionário Python. Finalmente, convertemos o dicionário Python com o instrumento, lance / perguntar e timestamp em um TickEvent que é enviado para a fila de eventos:
Agora temos todos os principais componentes no local. O passo final é encerrar tudo o que escrevemos até agora em um programa "principal". O objetivo deste arquivo, conhecido como trading. py, é criar dois segmentos separados, um dos quais executa o manipulador de preços e o outro que administra o manipulador de negociação.
Por que precisamos de dois segmentos separados? Simplificando, estamos executando dois pedaços de código "separados", ambos em execução contínua. Se formássemos um programa não-threaded, o soquete de transmissão usado para as atualizações de preços nunca mais "liberaria" de volta para o caminho do código principal e, portanto, nunca realizaríamos nenhuma negociação. Da mesma forma, se corremos o loop de comércio (veja abaixo), nunca retornaríamos o caminho do fluxo para o soquete de transmissão de preços. Portanto, precisamos de múltiplos tópicos, um para cada componente, para que eles possam ser realizados de forma independente. Ambos se comunicarão entre si através da fila de eventos.
Vamos examinar isso um pouco mais. Criamos dois segmentos separados com as seguintes linhas:
Passamos o nome da função ou do método para o argumento de palavra-chave alvo e passamos uma iterável (como uma lista ou uma tupla) para o argumento de palavras-chave args, que passa esses argumentos para o método / função real.
Finalmente, começamos os dois tópicos com as seguintes linhas:
Assim, somos capazes de executar dois, efetivamente infinitos looping, segmentos de código independentemente, que ambos se comunicam através da fila de eventos. Observe que a biblioteca de threading do Python não produz um ambiente multi-core multi-core real devido à implementação do CPython do Python e do Bloqueio do Intérprete Global (GIL). Se você quiser ler mais sobre multithreading no Python, veja este artigo.
Vamos examinar o resto do código em detalhes. Em primeiro lugar, importamos todas as bibliotecas necessárias, incluindo Fila, encadeamento e tempo. Em seguida, importamos todos os arquivos de código acima. Pessoalmente, eu prefiro capitalizar quaisquer configurações, o que é um hábito que eu tirei do trabalho com o Django!
Depois disso, definimos a função comercial, que foi explicada em pseudocódigo Python acima. Um loop while infinito é executado (enquanto True:) que pesquisa continuamente a partir da fila de eventos e apenas ignora o loop se ele for encontrado vazio. Se um evento for encontrado, então é um TickEvent ou um OrderEvent e, em seguida, o componente apropriado é chamado para executá-lo. Nesse caso, é uma estratégia ou um manipulador de execução. O loop, em seguida, simplesmente dorme para "heartbeat" segundos (neste caso, 0,5 segundos) e continua.
Finalmente, definimos o ponto de entrada principal do código na função __main__. É bem comentado abaixo, mas vou resumir aqui. Em essência, instanciamos a fila de eventos e definimos os instrumentos / unidades. Em seguida, criamos a classe de transmissão de preços StreamingForexPrices e, posteriormente, o processador de execução Execução. Ambos recebem os detalhes de autenticação necessários fornecidos pela OANDA ao criar uma conta.
Em seguida, criamos a instância TestRandomStrategy. Finalmente, definimos os dois tópicos e depois os iniciamos:
Para executar o código, você simplesmente precisa colocar todos os arquivos no mesmo diretório e chamar o seguinte no terminal:
Note-se que, para parar o código nesta fase, é necessária uma dura matança do processo Python, através de "Ctrl-Z" ou equivalente! Eu não adicionei um tópico adicional para lidar com a procura do sys. exit () que seria necessário para parar o código com segurança. Uma maneira potencial de parar o código em uma máquina Ubuntu / Linux é digitar:
E depois passar a saída deste (um número de processo) para o seguinte:
Onde PROCESS_ID deve ser substituído pela saída de pgrep. Observe que esta não é particularmente boa prática!
Em artigos posteriores, estaremos criando um mecanismo de parada / início mais sofisticado que faz uso da supervisão do processo do Ubuntu para que o sistema comercial seja executado 24/7.
A saída após 30 segundos ou mais, dependendo da hora do dia em relação ao horário de negociação principal para EUR / USD, para o código acima, é dada abaixo:
As primeiras cinco linhas mostram os dados de marca JSON retornados de OANDA com os preços de lances / pedidos. Posteriormente, você pode ver a ordem de execução! saída, bem como a resposta JSON retornou da OANDA confirmando a abertura de um comércio de compra por 10.000 unidades de EUR / USD e o preço alcançado em.
Isso continuará funcionando indefinidamente até você matar o programa com um comando "Ctrl-Z" ou similar.
Qual é o próximo?
Em artigos posteriores, vamos realizar algumas melhorias tão necessárias, incluindo:
Estratégias reais - Estratégias forex adequadas que geram sinais lucrativos. Infraestrutura de produção - Implementação de servidor remoto e sistema de comércio monitorado 24/7, com capacidade de parada / início. Gerenciamento de portfólio e risco - Carteira e sobreposições de risco para todas as encomendas sugeridas da estratégia. Múltiplas estratégias - Construindo um portfólio de estratégias que se integram na sobreposição de gerenciamento de riscos.
Tal como acontece com o backtester baseado em eventos de ações, também precisamos criar um módulo forex backtesting. Isso nos permitirá realizar pesquisas rápidas e facilitar a implantação de estratégias.
settings. py (lembre-se de alterar ACCOUNT_ID e ACCESS_TOKEN!):
Apenas iniciando o comércio quantitativo?
3 razões para se inscrever para a lista de e-mails QuantStart:
1. Quant Trading Lessons.
Você terá acesso instantâneo a um curso de e-mail gratuito de 10 partes, repleto de sugestões e dicas para ajudá-lo a começar a negociação quantitativa!
2. Todo o conteúdo mais recente.
Todas as semanas, vou enviar-lhe um envoltório de todas as atividades no QuantStart para que você nunca mais perca uma postagem novamente.
Real, dicas de negociação viáveis, sem tonturas.
Comments
Post a Comment