0
focar em
79
Seguidores

Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática

Criado em: 2019-06-25 15:48:58, atualizado em: 2023-10-31 21:01:08
comments   2
hits   14695

8a92fb09ee637bb.png Figura 4-26

Etapa 3: Faça um pedido

Com os dados acima, você pode escrever a lógica de negociação e o código para colocar ordens. O formato também é muito simples. O mais comumente usado é a “instrução if”, que pode ser descrita em palavras como: se a condição 1 e a condição 2 forem atendidas, faça um pedido; se a condição 3 ou a condição 4 forem atendidas, faça um pedido. Conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-27

Na imagem acima, as linhas 21 a 24 são a lógica de negociação e os códigos de colocação de ordens. De cima para baixo, elas são: fechar longo, fechar curto, abrir longo, abrir curto.

Tomando a abertura de uma posição longa (linha 23) como exemplo, esta é uma “instrução if”. Se apenas uma linha de código for executada nesta instrução, as chaves “{}” podem ser omitidas. Esta declaração é traduzida em texto como: Se a posição atual for 0, e o preço de fechamento for maior que a faixa superior, e o tempo da linha K não for 14:45, então “retorne 1”

Pessoas cuidadosas podem descobrir que há “retorno 1” e “retorno -1” nessas linhas. Este é um formato fixo, o que significa: se for uma compra, escreva “retorno 1”; se for uma venda, escreva “retorno -1”. Abrir uma posição longa e fechar uma posição curta são ambas compras, então escreva “retorno 1”; abrir uma posição curta e fechar uma posição longa são ambas vendas, então escreva “retorno -1”.

Código de estratégia completo

Neste ponto, um código de estratégia completo foi escrito. Se a estrutura de negociação, dados de negociação, lógica de negociação, colocação de ordens, etc. forem escritos separadamente, não seria muito simples? O seguinte é o código inteiro desta estratégia: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-28

Há dois pontos a serem observados: tente (mas não necessariamente) escrever a lógica da estratégia de modo que, quando a condição da linha K raiz for atendida, a próxima ordem da linha K seja colocada, ou quando a condição da linha K anterior for atendida, a ordem da linha K raiz seja colocada. Dessa forma, os resultados do backtest não serão muito diferentes dos resultados reais. Você não precisa escrever dessa forma, mas deve prestar atenção se a lógica da estratégia está correta. Em termos gerais, a lógica de fechar uma posição deve ser escrita antes da lógica de abrir uma posição. O propósito de fazer isso é tornar a lógica da estratégia o mais consistente possível com suas expectativas. Por exemplo: se a lógica da estratégia alcançar a posição reversa, a regra da posição reversa é fechar a posição primeiro e depois abrir uma nova posição. Em vez de abrir uma nova posição primeiro e depois fechá-la. Se escrevermos a lógica de fechamento diretamente antes da lógica de abertura, esse problema não ocorrerá.

Resumir

Acima, aprendemos cada etapa do desenvolvimento de uma estratégia completa de negociação quantitativa intradiária, incluindo: introdução à estratégia, método de cálculo do indicador de Bandas de Bollinger, lógica da estratégia, condições de compra e venda, implementação do código de estratégia, etc. Por meio deste caso de estratégia, você não apenas pode se familiarizar com o método de programação da ferramenta quantitativa do inventor, mas também adaptá-lo a diferentes estratégias com base neste modelo.

Estratégias quantitativas de trading nada mais são do que resumos de experiências ou sistemas subjetivos de trading. Se anotarmos as experiências ou sistemas usados ​​em trading subjetivo antes de escrever estratégias, e então traduzi-los em códigos um por um, você descobrirá que escrever estratégias será muito mais fácil. Experimente!

Próxima Seção Prévia

No desenvolvimento de estratégias quantitativas de negociação, se você puder escolher apenas uma linguagem de programação, então, sem hesitação, você deve escolher Python. Da aquisição de dados ao backtesting de estratégia para negociação, Python cobriu toda a cadeia de negócios. Ela ocupa uma posição importante no campo do investimento quantitativo financeiro. No próximo curso, aprenderemos o conhecimento básico da linguagem Python.

Trabalho de casa

  1. Tente usar o conhecimento desta seção para implementar uma estratégia de média móvel dupla.
  2. Tente implementar o algoritmo do indicador KDJ usando a linguagem JavaScript na ferramenta quantitativa Inventor.

4.3 Introdução rápida à linguagem Python

resumo

No desenvolvimento de estratégias quantitativas de negociação, se você puder escolher apenas uma linguagem de programação, então, sem hesitação, você deve escolher Python. Da aquisição de dados ao backtesting de estratégia para negociação, Python cobriu toda a cadeia de negócios. Ocupa uma posição importante no campo do investimento financeiro quantitativo. Neste curso, aprenderemos o conhecimento básico da linguagem Python.

Por que aprender tantas linguagens de programação?

Olhando para os cursos anteriores, aprendemos um total de: linguagem Mai, linguagem visual, linguagem JavaScript, incluindo a linguagem Python a ser aprendida nesta seção. Alguns amigos podem ter perguntas. Estou aqui para aprender negociação quantitativa, por que tenho que aprender tantas linguagens de programação?

Na verdade, cada linguagem de programação tem suas próprias características de linguagem, e não há distinção entre linguagens boas e ruins. Depende mais de qual linguagem de programação sua estratégia é mais adequada e se essa linguagem de programação combina com você. Então, há um ditado que diz que você só saberá se tentar. É por isso que dedicamos tanto espaço para falar sobre linguagens de programação. Se você quer fazer seu trabalho bem, primeiro precisa afiar suas ferramentas.

Ao mesmo tempo, também estamos comprometidos em abrir a porta para a pesquisa quantitativa para todos e popularizar o conhecimento de várias linguagens de programação. A pesquisa quantitativa não é tão misteriosa e fora de alcance quanto imaginamos. Acredito que a pesquisa quantitativa se tornará popular e acessível ao público em geral no futuro.

Por que escolher Python para negociação quantitativa

O processo de negociação quantitativa nada mais é do que adquirir dados, analisar e calcular dados, processar dados, etc. Em termos de análise de dados, nenhuma outra linguagem pode ser tão boa em cálculos e manter o desempenho quanto Python. Especialmente no processamento de dados de análise de séries temporais (K-line são dados de séries temporais), Python tem a vantagem de ser mais simples e conveniente. Além disso, comparado a outras linguagens de programação, Python é mais conciso e fácil de aprender. Ler um bom programa Python é como ler inglês.

Cinco razões para escolher Python

1. A aplicação quantitativa é extensa:

Tanto a Quantopian nos Estados Unidos quanto a Inventor Quant na China podem usar a linguagem Python.

2. Fácil de aprender:

A filosofia de design do Python é centrada no usuário e é uma linguagem interpretada fácil de depurar.

3. Livre e de código aberto:

Sem custo de uso, compartilhamento de código-fonte aberto e maior eficiência de aprendizado e uso.

4. Biblioteca rica:

Processamento de dados, computação de dados, visualização, análise estatística, análise técnica, aprendizado de máquina…

5. Interface do aplicativo:

Interfaces para aquisição, armazenamento, chamada e colocação de ordens com base em informações de mercado em tempo real das principais plataformas.

Estratégia completa

Para ajudar você a entender rapidamente o conhecimento essencial desta seção, antes de apresentar a introdução rápida à linguagem JavaScript quantizada do inventor, você deve primeiro ter uma compreensão preliminar dos conceitos desta seção. Vamos pegar a estratégia mais simples de média móvel dupla como exemplo:

Abertura de posição longa: Se não houver posição atual e a média móvel de 5 períodos for maior que a média móvel de 20 períodos. Abra uma posição curta: Se não houver posição atual e a média móvel de 5 períodos for menor que a média móvel de 20 períodos. Fechamento de posição longa:Se você atualmente mantém uma posição longa e a média móvel de 5 períodos é menor que a média móvel de 20 períodos. Fechamento de posição curta: Se você atualmente mantém uma posição curta e a média móvel de 5 períodos é maior que a média móvel de 20 períodos.

Se escrito em Python, ficaria assim: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-29

O código na figura acima é uma estratégia de negociação quantitativa completa escrita em Python. Ele pode ser executado em tempo real e fazer pedidos automaticamente. Em termos de quantidade de código, Python é melhor que JavaScript, porque não usamos a estrutura de negociação CTA.

No entanto, o processo de design de toda a estratégia é quase o mesmo: definir tipos de mercado, obter dados da linha K, obter informações de posição, calcular a lógica de negociação e colocar ordens de compra e venda. Em outras palavras, embora a sintaxe de programação seja diferente, a lógica da estratégia escrita é a mesma, então, a seguir, vamos aprender a sintaxe básica do Python!

Seleção de versão

Existem duas versões do Python, a saber: Python2 e Python3. Houve uma vez uma piada que dizia que Python é como uma arma de dois canos, mas você só pode usar um cano para disparar balas por vez, mas você nunca saberá qual é mais preciso. Então, se você é novo em Python, é recomendável aprender Python 3 diretamente porque é o mais recente e foi mantido pela comunidade Python. Nossos cursos também são ministrados em Python 3.

Identificador

O identificador é o nome da variável, como teste, teste, teste10,demonstração, etc. Tudo em Python (variáveis, nomes de funções e operadores) diferencia maiúsculas de minúsculas, o que significa que o nome da variável test e o nome da variável Test são duas variáveis ​​diferentes. O primeiro caractere de um identificador (nome de uma variável, função, propriedade, parâmetro de função) deve ser uma letra, um sublinhado (), os caracteres que o seguem também podem ser números, conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-30

Comentários

Um comentário é uma tradução ou explicação de uma linha de código. As regras são muito simples e incluem comentários de linha única e comentários de nível de bloco. Um comentário de linha única começa com um sinal de cerquilha (#), e um comentário em bloco começa com três aspas simples (“‘) ou três aspas duplas (”“”) e termina com três aspas simples (“’) ou três aspas duplas (”“”), conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-31

Linhas e recuos

A característica mais marcante do Python é o uso de recuo para indicar blocos de código, sem a necessidade de chaves {}. O número de espaços para recuo é variável, mas instruções no mesmo bloco de código devem conter o mesmo número de espaços para recuo. Conforme mostrado abaixo: Neste caso, o programa reportará um erro. Mesmo que a condição if seja verdadeira, “True” não será emitido, porque o Python detectará automaticamente se a sintaxe do código está correta antes que o código seja executado. Se o formato do código estiver incorreto, o programa não será executado. O motivo é que a 5ª linha de código não tem um formato de recuo de código unificado. O recuo de quatro espaços é um formato fixo para Python e todos precisam estar familiarizados com ele. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-32

Variações

Variáveis ​​podem armazenar qualquer tipo de dado. Simplesmente escrever o nome da variável é criar a variável. No entanto, ao criar uma variável, você precisa definir o valor da variável ao mesmo tempo, caso contrário, o programa relatará um erro. O lado esquerdo do operador de sinal de igual (=) é um nome de variável, e o lado direito do operador de sinal de igual (=) é o valor armazenado na variável. Conforme mostrado na figura abaixo: name2 é o nome da variável e “inventor quantification” é o valor da variável. Se você não definir um novo valor para name2, o valor de name2 sempre será “quantificação do inventor”. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-33

dados

Python tem seis tipos de dados, três dos quais são imutáveis ​​e três são mutáveis. Como o nome indica, uma vez que dados imutáveis ​​são criados, seu valor não pode ser alterado e seu endereço na memória é único; dados mutáveis ​​são uma referência a um endereço na memória e, se seu valor for alterado, seu endereço de memória permanecerá inalterado. Dados imutáveis ​​(3): Número, String, Tupla; Dados mutáveis ​​(3): Lista, Dicionário, Conjunto. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-34

Números

Os tipos numéricos do Python suportam int (inteiro), float (ponto flutuante), bool (booleano) e complex (número complexo). A função interna type() pode ser usada para consultar o tipo de objeto ao qual uma variável se refere. Conforme mostrado abaixo: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-35

Operador

Como na maioria das linguagens, a matemática em Python é simples. Sejam operadores aritméticos, operadores de comparação ou operadores lógicos, todos eles são iguais aos que aprendemos na escola. Entre eles, os operadores aritméticos são operações matemáticas de adição, subtração, multiplicação e divisão. Os operadores de comparação podem comparar se dois valores são menores que ou menores que. Os principais operadores lógicos são: AND lógico, OR lógico e NOT lógico. [Você pode falar brevemente sobre as strings comumente usadas em estratégias de negociação?] Por exemplo, em nossas estratégias de negociação, a string mais comumente usada é o código do produto, como: “rb1910”, “MA1910”. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-36

Vale ressaltar que “e” é um AND lógico, que significa “e”. “ou” é um OU lógico, que significa “qualquer um”. “!” é uma negação lógica, que significa “não”: “e” significa que quando todas as condições são “verdadeiras”, a condição final é “verdadeira”; “ou” significa que entre todas as condições, enquanto qualquer uma delas for “verdadeira”, a condição final será “verdadeira”.

Prioridade

Se houver um 100*Para a expressão (10-1)/(10+5), qual etapa o programa calcula primeiro? A matemática do ensino médio nos diz: ① Se for uma operação do mesmo nível, geralmente é calculada da esquerda para a direita. ② Se houver adição e subtração, bem como multiplicação e divisão, calcule primeiro a multiplicação e a divisão, depois a adição e a subtração. ③Se houver colchetes, calcule primeiro o conteúdo dos colchetes. ④ Se estiver em conformidade com as leis de operação, as leis de operação podem ser usadas para simplificar o cálculo. A prioridade da linguagem Mai é a mesma mostrada abaixo: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-37

Booleano

Booleano representa verdadeiro ou falso e geralmente é usado em julgamentos condicionais e instruções de loop. Python define duas constantes “True” e “False” para representar verdadeiro e falso. De fato, qualquer objeto pode ser convertido para o tipo booleano e também pode ser usado diretamente para julgamento condicional, conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-38

Estribo

Strings são texto. Strings, como “if1905”, são frequentemente usadas ao definir códigos de produtos. Strings em Python são colocadas entre aspas simples ‘ ou aspas duplas “. O sinal de mais + é o operador de concatenação de strings. Você pode obter um caractere em uma string com base no valor do índice, conforme mostrado abaixo: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-39

Lista

Lista é o tipo de dado mais frequentemente usado em Python. Você pode pensar em uma lista como um contêiner, exceto que os elementos no contêiner são organizados em ordem da esquerda para a direita. O primeiro elemento é 0, o segundo elemento é 1, e assim por diante. Além disso, as listas do Python podem armazenar qualquer tipo de dado, conforme mostrado abaixo: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-40

função

Funções em Python são essencialmente as mesmas funções que aprendemos no ensino médio. Você pode pensar nisso como o que é passado e o que é produzido através do cálculo da função, como mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-41

Declaração if

Se afirmações aparecem frequentemente em nossas vidas, por exemplo: Se chover hoje, segurarei um guarda-chuva. Ou seja, a instrução executará o código somente quando a condição especificada for Verdadeira. Observe que preste atenção ao formato de recuo do código, caso contrário, um erro do Python será gerado! Conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-42

declaração if…else

As instruções If…else também são instruções comumente usadas, por exemplo: Se chover hoje, segurarei um guarda-chuva; caso contrário, não segurarei um guarda-chuva. A instrução else é uma extensão da instrução if, ou seja, o código após else será executado somente quando a condição especificada for False. Conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-43

Declaração elif

Como o Python não suporta instruções switch, ele só pode usar instruções elif para implementar múltiplos julgamentos condicionais. Por exemplo: se for uma linha positiva, estarei otimista; caso contrário, se for uma linha negativa, estarei pessimista; caso contrário, esperarei para ver. Conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-44

para laço

Às vezes, precisamos obter os dados da linha K dos últimos dias, e precisamos obtê-los do array da linha K em sequência de acordo com a posição dos dados da linha K. Então é muito conveniente usar um loop for, como mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-45

Enquanto Laço

Todos nós sabemos que o mercado está mudando constantemente. Se você quiser obter o array K-line mais recente, você tem que continuar executando o mesmo código repetidamente. Então use o loop whilex. Enquanto a condição especificada for verdadeira, o loop sempre pode obter o array K-line mais recente. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-46

instrução break e instrução continue

O loop tem uma pré-condição. Somente quando a pré-condição for “true” o loop começará a fazer algo repetidamente, e o loop não terminará até que a pré-condição seja “false”. Entretanto, a instrução break pode sair imediatamente do loop durante a execução do loop; a instrução continue pode interromper um determinado loop e então continuar o próximo loop. Conforme mostrado na figura a seguir: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-47

declaração de retorno

A instrução return encerra a execução de uma função e retorna o valor da função. A declaração return só pode aparecer em um corpo de função. Se aparecer em qualquer outro lugar no código, causará um erro de sintaxe! Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-48

Estrutura de estratégia

Você pode entender a arquitetura da estratégia como um formato fixo da estratégia. A ferramenta quantitativa do inventor adota um modo de votação. A seguir está uma arquitetura clássica de estratégia de futuros de commodities.

As linhas 4 a 7 são as principais funções de entrada de todo o programa, ou seja, o computador começa a executar o código da linha 4; então ele executa diretamente a linha 5 e entra em um loop infinito; então a função lógica de estratégia (onTick) e a função sleep (Sleep) são executadas no loop infinito; a função onTick é o código na linha 1, e você pode escrever a lógica de estratégia na linha 2; sabemos que no loop, a velocidade de execução do programa é muito rápida, então usar a função sleep (Sleep) pode pausar o programa por um tempo. O código a seguir Sleep(500) significa que ele dorme por 500 milissegundos toda vez que o loop é concluído. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-49

Resumir

O acima é uma rápida introdução à linguagem Python. Embora seja apenas um conhecimento básico simples, ainda não é problema usá-lo para escrever uma estratégia de negociação quantitativa simples. Se precisar escrever estratégias mais complexas, você pode consultar a documentação da API da linguagem Python da Ferramenta Quantitativa Inventor.

Próxima Seção Prévia

Entre as estratégias de tendências no campo da análise técnica, a média móvel e o rompimento de canal são, sem dúvida, as duas principais escolas. Embora o objetivo seja capturar a tendência dos movimentos de preços, as filosofias de negociação e as características de risco dessas duas estratégias são completamente diferentes. Depois de aprender a introdução à linguagem Python nesta seção, na próxima seção mostraremos como escrever uma estratégia de negociação quantitativa para rompimento de canal.

Trabalho de casa

  1. Tente usar a linguagem Python na ferramenta quantitativa do Inventor para obter dados históricos da linha K.
  2. Tente escrever o código da estratégia no início desta seção e adicione comentários.

4.4 Como implementar negociação de estratégia usando a linguagem Python

resumo

No artigo anterior, aprendemos a introdução, a sintaxe básica, a estrutura de estratégia, etc. da linguagem Python. Embora o conteúdo seja chato, é uma habilidade essencial para você implementar sua estratégia de negociação e você deve aprendê-la. Neste artigo, atacaremos enquanto o ferro está quente e continuaremos com o conhecimento básico de Python do artigo anterior. Começaremos com uma estratégia simples, aprenderemos enquanto usamos e ajudaremos todos a realizar uma estratégia de negociação quantitativa viável passo a passo.

Introdução à estratégia

Entre muitas estratégias de negociação, a estratégia do Canal Donchian deve ser uma das estratégias de avanço mais clássicas. Era bem conhecida já em 1970. Naquela época, uma empresa estrangeira conduziu testes de simulação e pesquisa sobre estratégias de negociação de programas convencionais. Os resultados mostraram que, entre todos os testes de estratégia, a estratégia do Canal Donchian foi a mais bem-sucedida.

Mais tarde, o treinamento de trader “Tartaruga” mais famoso da história do trading ocorreu nos Estados Unidos, o que levou a um enorme sucesso. Naquela época, os métodos de negociação das “Tartarugas” eram mantidos em segredo, mas mais de dez anos depois, quando as “Regras de Negociação das Tartarugas” foram tornadas públicas, as pessoas descobriram que as “Tartarugas” estavam usando uma versão melhorada do Canal Donchian. estratégia.

Estratégias de negociação de ruptura são adequadas para negociar produtos com tendências relativamente suaves. O método de negociação de ruptura mais comum é usar a relação de posição relativa entre preço e suporte e resistência para determinar pontos de compra e venda de negociação específicos. A estratégia do Canal Donchian nesta seção é baseada neste princípio.

Regras da estratégia do canal Donchian

O Canal Donchian é um indicador de tendência e sua aparência e sinais são um pouco semelhantes ao indicador Bandas de Bollinger. Mas o canal de preços da Donchian é construído com base nos preços mais altos e mais baixos dentro de um determinado período de tempo. Por exemplo: calcule o valor máximo do preço mais alto das últimas 50 linhas K para formar a trilha superior; calcule o valor mínimo do preço mais baixo das últimas 50 linhas K para formar a trilha inferior. Este indicador consiste em três curvas de cores diferentes. O padrão são os preços mais altos e mais baixos dentro de 20 períodos para mostrar a volatilidade dos preços de mercado. Quando o canal é estreito, significa que a volatilidade do mercado é pequena. Por outro lado, um canal largo significa que a volatilidade do mercado é relativamente grande.

Se o preço subir acima da faixa superior, é um sinal de compra; inversamente, se o preço cair abaixo da faixa inferior, é um sinal de venda. Como as linhas superior e inferior do canal são calculadas usando os preços mais altos e mais baixos, em circunstâncias normais, os preços raramente sobem e descem abaixo das linhas superior e inferior do canal ao mesmo tempo. Na maioria dos casos, os preços se movem unilateralmente ao longo da faixa superior ou inferior, ou entre as faixas superior e inferior.

Método de cálculo do canal Donchian

Na Inventor Quantitative Tool, o método de cálculo do Canal Donchian é muito simples. Você pode usá-lo diretamente para obter o preço mais alto ou o preço mais baixo dentro do período especificado, conforme mostrado na figura abaixo: a 5ª linha é para obter o valor máximo do preço mais alto de 50 períodos, e a 6ª linha é para obter o valor mínimo do preço mais baixo de 50 períodos. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-50

Estratégia Lógica

Há muitas maneiras de usar o Canal Donchian. Ele pode ser usado sozinho ou em combinação com outros indicadores. Neste curso usaremos o método mais simples. Ou seja, quando o preço rompe a trilha superior de baixo para cima, ou seja, rompe a linha de pressão superior, acreditamos que a força de alta está ficando mais forte, uma onda de alta do mercado foi formada e um sinal de abertura de compra é gerado; quando o preço cai de cima para baixo e rompe a faixa inferior, ou seja, quando cai abaixo da linha de suporte, acreditamos que o lado curto está ficando mais forte, uma tendência de baixa foi formada e uma abertura de venda o sinal é gerado. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-51

Se o preço cair de volta para o meio do Canal Donchian após a abertura de uma posição longa, acreditamos que os touros estão enfraquecendo ou os ursos estão se fortalecendo, e um sinal de liquidação é gerado; se o preço cair de volta para o meio trilha do Canal Donchian após uma posição curta ser aberta, acreditamos que os touros estão enfraquecendo ou os ursos estão se fortalecendo, e um sinal de liquidação é gerado; Quando ele sobe de volta para a trilha do meio do Canal Donchian, acreditamos que a força dos ursos está enfraquecendo, ou a força dos touros está se fortalecendo, e um sinal de compra para fechamento é gerado.

Condições de negociação Abertura de posição longa: Se não houver posição e o preço de fechamento for maior que a faixa superior Abra uma posição curta: Se não houver posição e o preço de fechamento for menor que a faixa inferior Fechamento de posição longa:Se você mantiver uma ordem longa e o preço de fechamento for menor que o preço médio Fechamento de posição curta:Se você mantiver uma ordem curta e o preço de fechamento for maior que o preço médio

Implementação do código de estratégia

O primeiro passo para implementar uma estratégia é obter dados, porque dados são um pré-requisito para uma estratégia de negociação. Imagine quais dados precisamos? E como obter esses dados? Em seguida, projetamos a lógica de negociação com base nesses dados; por fim, colocamos ordens de compra e venda de acordo com a lógica de negociação. As etapas específicas são as seguintes:

Etapa 1: use a biblioteca de negociação

Você pode pensar na biblioteca de trading como um módulo funcional. A vantagem de usar a biblioteca de trading é que ela permite que você se concentre em escrever lógica de estratégia. Por exemplo: quando usamos a biblioteca de negociação, ao abrir e fechar posições, podemos usar diretamente a API de ordens na biblioteca de negociação; mas se não usarmos a biblioteca de negociação, ao abrir e fechar posições, precisamos obter o preço de mercado, considerar o problema de colocar ordens, mas elas não serem executadas, considerar o problema de cancelar ordens, etc. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-52

A imagem acima é a estrutura da estratégia CTA usando as ferramentas quantitativas do inventor. Este é um formato de código fixo, e todos os códigos de lógica de transação são escritos a partir da linha 4. Nenhuma modificação é necessária em nenhum outro lugar.

A biblioteca de modelos do JavaScript é integrada, o Python precisa copiar e salvar este modelo: https://www.fmz.com/strategy/24288. Em seguida, clique em Referência na página de edição de políticas. Claro, você também pode completar a estratégia sem usar a biblioteca de modelos.

Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática

Etapa 2: Obtenha vários dados

Pense bem: quais dados você precisa? A partir da nossa lógica de negociação estratégica, descobrimos que: primeiro precisamos obter o status da posição atual, depois comparar a relação entre o preço de fechamento e as faixas superior, média e inferior do indicador Bandas de Bollinger e, finalmente, determinar se o mercado está prestes a fechar. Então vamos pegar esses dados.

Obter dados de linha K

O primeiro passo é obter o array K-line e o preço de fechamento atual do K-line. Somente com o array K-line podemos chamar a API para obter o preço mais alto ou mais baixo de N períodos. É assim que fica no código: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-53 Conforme mostrado na figura acima: Linha 4: Obtenha a matriz K-line, que é um formato fixo. Linha 5: Filtra o comprimento da K-line. Como calculamos o preço mais alto ou mais baixo de N períodos, o parâmetro usado é 50. Quando o número de K-lines é menor que 50, ele não pode ser calculado. Portanto, precisamos filtrar o comprimento da linha K aqui. Se houver menos de 50 linhas K, pule este loop e continue esperando pela próxima linha K. Linha 6: Usamos o código “records[len(records) - 1]” primeiro obtém os últimos dados do array K-line, ou seja, os últimos dados K-line. Esses dados são um objeto, que contém: preço de abertura, preço mais alto, preço mais baixo, preço de fechamento, volume de negociação, tempo e outros dados. Como é um objeto, podemos usar diretamente “.Close” para obter o último preço de fechamento K-line.

Obter dados de posição

As informações de posição são uma condição muito importante em estratégias quantitativas de trading. Quando as condições de trading são atendidas, também é necessário determinar se deve ser feita uma ordem com base no status da posição e no número de posições. Por exemplo: quando as condições para abrir uma posição de compra forem atendidas, se você tiver uma posição, não precisará colocar uma ordem novamente; se não tiver uma posição, poderá colocar uma ordem. Desta vez, encapsulamos diretamente as informações de posição em uma função, e podemos usá-las apenas chamando esta função: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-54

Conforme mostrado na figura acima: Esta é uma função que obtém informações de posição. Se for uma posição curta, retorna 0; se for uma posição longa, retorna 1; se for uma posição curta, retorna -1. Observe o código acima: Linha 2: Crie uma função chamada mp, que não tem parâmetros. Linha 3: Obtenha a matriz de posição, que é um formato fixo. Linha 4: Determina o comprimento do array de posições. Se seu comprimento for igual a , deve ser uma posição vazia, então retorna 0 Linha 6: Use um loop for para começar a percorrer o array. A lógica a seguir é muito simples. Se você mantiver uma posição longa, ele retornará 1; se você mantiver uma posição curta, ele retornará -1. Linha 18: Chame a função mp que acabamos de escrever para obter as informações de posição.

Obtenha os preços mais altos e mais baixos das últimas 50 linhas K

Na Ferramenta Quantitativa do Inventor, você pode obtê-lo diretamente usando as funções “TA.Highest” e “TA.Lowest” sem precisar escrever os cálculos lógicos você mesmo. E os resultados retornados pelas funções “TA.Highest” e “TA.Lowest” são valores específicos e não matrizes. Isso é muito conveniente. Não só isso, o oficial tem centenas de funções indicadoras incorporadas. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-55

Conforme mostrado na figura acima: Linha 19: Chame a função “TA.Highest” para obter o valor máximo do preço mais alto em 50 períodos Linha 20: Chame a função “TA.Lowest” para obter o valor mínimo do menor preço em 50 períodos Linha 21: Calcular o valor médio com base no valor máximo do preço mais alto em 50 períodos e no valor mínimo do preço mais baixo em 50 períodos

Etapa 3: Faça um pedido

Com os dados acima, você pode escrever a lógica de negociação e o código para colocar ordens. O formato também é muito simples. O mais comumente usado é a “instrução if”, que pode ser descrita em palavras como: se a condição 1 e a condição 2 forem atendidas, faça um pedido; se a condição 3 ou a condição 4 forem atendidas, faça um pedido. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 4-56

Conforme mostrado na figura acima: Linha 22: Use a biblioteca de transações, que é um formato fixo Linhas 23 e 24: Esta é uma declaração para fechar uma posição longa, que usa os “operadores de comparação” e “operadores lógicos” que aprendemos antes. Isso significa que se você atualmente mantém uma posição longa e o preço de fechamento é menor do que o preço médio, todas as posições serão fechadas. Linhas 25 e 26: Esta é uma declaração para fechar uma ordem curta, que usa os “operadores de comparação” e “operadores lógicos” que aprendemos antes. Isso significa que se você atualmente mantém uma ordem curta e o preço de fechamento é maior do que o do meio, todas as posições serão fechadas. Linha 27: Determine o status da posição atual. Se a posição for curta, prossiga para a próxima etapa. Linhas 28 e 29: Determine se o preço de fechamento é maior que a trilha superior. Se o preço de fechamento subir acima da trilha superior, compre para abrir uma posição. Linhas 30 e 31: Determine se o preço de fechamento é menor que a faixa inferior. Se o preço de fechamento cair abaixo da faixa inferior, venda e abra uma posição.

Resumir

Acima, aprendemos cada etapa do desenvolvimento de uma estratégia de negociação quantitativa completa usando Python, incluindo: introdução à estratégia, método de cálculo do canal Donchian, lógica da estratégia, condições de compra e venda, implementação do código da estratégia, etc. Esta seção é apenas uma estratégia simples, como um ponto de partida. Há mais de um método. Você pode sobrepor diferentes métodos de negociação de acordo com seu próprio sistema de negociação para formar sua própria estratégia quantitativa de negociação.

Próxima Seção Prévia

No desenvolvimento de estratégias de negociação quantitativa, da perspectiva da velocidade de execução da linguagem de programação, se perguntarmos qual linguagem é a mais rápida, ela só pode ser C++. Especialmente no campo de derivativos e negociação de alta frequência, C++ tem especificidade de linguagem única e vantagens em cálculos numéricos. Sua velocidade pode ser aumentada em várias ordens de magnitude em comparação com JavaScript e Python. Se você quer se desenvolver no campo de derivativos e negociação de alta frequência no futuro, este será um curso que você não pode perder.

Trabalho de casa

  1. Comece copiando e implementando as estratégias desta seção.
  2. Tente adicionar um indicador de média móvel à estratégia nesta seção para reduzir a frequência de transações.

Capítulo 5 Estratégia Backtesting, Depuração e Melhoria

5.1 A importância e as armadilhas do backtesting

resumo

O backtesting é a maior diferença entre o trading quantitativo e o trading tradicional. Com base em dados reais de mercado que ocorreram na história, ele simula rapidamente o acionamento de sinais de estratégia e transações correspondentes para obter relatórios de desempenho e outros dados ao longo de um período de tempo. É um dos componentes mais importantes do desenvolvimento de estratégias para ações nacionais e estrangeiras, futuros de commodities, câmbio e outros mercados.

A importância do backtesting

Nos capítulos anteriores, aprendemos os fundamentos das principais linguagens de programação e ensinamos como usar esses fundamentos de programação para escrever algumas estratégias de negociação simples. Pode-se dizer que já passamos da metade do caminho da longa marcha. No entanto, uma vez que uma estratégia é escrita, ela não pode ser colocada em prática diretamente. Ela ainda requer backtesting contínuo - depuração - backtesting - depuração - e assim por diante, até que a estratégia possa implementar completamente o conteúdo do modelo e rodar suavemente.

Da perspectiva da lógica quantitativa de trading, as estratégias são, na verdade, baseadas em uma série de cognições e suposições sobre o mercado. O backtesting pode determinar eficientemente se essas suposições são válidas e estáveis. Quais perdas podem ocorrer durante períodos historicamente instáveis ​​e como ajudar na tomada de decisões para evitar essas perdas.

Além disso, da perspectiva da operação de negociação quantitativa, o backtesting pode ajudar a detectar bugs na lógica da estratégia, como funções futuras, roubo de preço, ajuste múltiplo, etc. Forneça evidências confiáveis ​​de que a estratégia pode ser usada em negociações reais.

  • Verifique a precisão dos sinais de negociação.
  • Verifique a lógica da transação e se suas ideias são viáveis.
  • Descubra falhas no seu sistema de negociação e melhore sua estratégia original.

Portanto, a importância do backtesting é restaurar o processo de negociação real da forma mais realista possível por meio de dados históricos, verificar a eficácia da estratégia, evitar pagar um preço alto por estratégias erradas e nos ajudar a filtrar, melhorar e otimizar as estratégias de negociação.

Armadilhas do Backtesting

Sinal de armadilha de backtesting piscando:

As estratégias de negociação são testadas com base em dados históricos estáticos. Os dados reais da transação são dinâmicos. Por exemplo: se o preço mais alto for maior que o preço de fechamento de ontem, então compre para abrir uma posição. Na negociação real, se a linha K ainda não tiver sido concluída, o preço mais alto será dinâmico e o sinal de negociação poderá piscar para frente e para trás. Durante o backtesting, o mecanismo de backtesting pode simular transações correspondentes com base em dados históricos estáticos.

Armadilha de backtesting de função futura:

A função futura usa preços futuros, o que significa que as condições atuais podem ser modificadas no futuro. A função futura também pode causar flashes de sinal. Portanto, qualquer função tem as características de uma função futura, como a “função ziguezague”.

Conforme mostrado na figura abaixo: A função ZigZag indica os pontos de virada de picos e vales. Ela pode ajustar seu valor de acordo com o último preço em tempo real. No entanto, se o preço atual mudar, o resultado calculado pela função ZigZag também mudará. Se uma função com uma função futura for usada, o sinal de ordem atual poderá ser estabelecido e a ordem poderá ser colocada, mas o sinal poderá não ser estabelecido depois de um tempo. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-1

Armadilha de Backtesting: Roubo de Preço

O chamado roubo de preços se refere ao uso de preços passados ​​para negociar. Por exemplo: se o preço mais alto for maior que um preço fixo, compre pelo preço de abertura. Essa condição é roubo de preços, porque no mercado real, quando o preço mais alto é maior que um determinado preço, o preço já está uma certa distância acima do preço de abertura e, neste momento, não pode ser comprado pelo preço de abertura. Mas no backtest, há um sinal de compra e a transação pode ser concluída.

Há outra situação. Se o preço saltar mais alto e abrir mais alto do que o preço fixo definido pela estratégia, a transação pode ser concluída no preço fixo durante o backtesting, mas esse preço fixo obviamente não está disponível no mercado real.

Armadilha de Backtesting: Preços de Transação Impossíveis

Existem várias situações em que os preços não podem ser negociados: Primeiro: na negociação real, geralmente você não pode comprar quando o preço atinge o limite superior, e vice-versa. No entanto, é possível negociar no backtest.

O segundo tipo: O mecanismo de correspondência de câmbio é: prioridade de preço e prioridade de tempo. Algumas variedades geralmente têm ordens enormes no mercado. Se você fizer uma ordem de compra ou venda durante uma negociação real, precisará esperar que a espessura do mercado seja preenchida antes que a transação possa ser concluída, ou mesmo não possa ser concluída. Entretanto, durante o backtesting, ordens pendentes de compra e venda podem ser executadas.

O terceiro tipo: se for uma estratégia de arbitragem, o lucro do backtesting será muito alto, porque toda vez durante o backtesting, presume-se que essas diferenças de preço foram aproveitadas. Na realidade, muitos spreads não podem ser agarrados, ou apenas uma perna é agarrada. Em termos gerais, aquele que não for favorável à sua direção será executado primeiro, então você precisa preencher a outra perna imediatamente. Neste momento, o deslizamento não é mais de 1 ou 2 pontos, e a própria estratégia de arbitragem ganha o spread desses poucos pontos. Esta situação não pode ser simulada em backtesting. O lucro real não é tão bom quanto o do backtest.

O quarto tipo: evento cisne negro. Conforme mostrado no círculo vermelho na figura abaixo, no evento cisne negro do câmbio do franco suíço, embora haja preços de abertura, preços mais altos, preços mais baixos e preços de fechamento na superfície, na verdade, nas condições extremas de mercado do dia, o preço no meio é um vácuo, um grande número de ordens de stop-loss causou debandada, a liquidez era zero e as transações eram muito difíceis, mas os stop losses podiam ser alcançados no backtesting. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-2

Armadilha do Backtesting: Overfitting

Toda vez que vejo a imagem abaixo, sinto: Hahahaha… Pela imagem abaixo, você pode ver que um modelo absurdo, desde que seja complexo o suficiente, pode se adaptar perfeitamente aos dados. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-3

Para negociação quantitativa, o backtesting é baseado em dados históricos, mas as amostras de dados históricos são limitadas. Se a estratégia de negociação tiver muitos parâmetros ou a lógica de negociação for muito complicada, a estratégia de negociação será excessivamente adaptada aos dados históricos.

O processo de modelagem de estratégias quantitativas é essencialmente um processo de encontrar dados locais não aleatórios a partir de uma grande quantidade de dados aparentemente aleatórios. Sem a ajuda do conhecimento estatístico, é fácil cair na armadilha do overfitting.

Então, não se engane. Se você descobrir que os dados fora da amostra não apresentam um bom desempenho e achar uma pena descartar o modelo ou não estiver disposto a admitir que seu modelo não é bom e continuar a otimizar o modelo nos dados fora da amostra até que ele tenha um desempenho tão bom, então, no final, será seu dinheiro arduamente ganho que será prejudicado.

Armadilha do Backtesting: Viés do Sobrevivente

Há uma piada popular em Wall Street: Suponha que haja 1.000 macacos participando de investimentos no mercado. No primeiro ano, 500 macacos que perderem para o mercado serão eliminados. No segundo ano, metade dos macacos foi eliminada novamente, restando 250 macacos. No final do terceiro ano, restavam 125 macacos. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-4

No nono ano, restava apenas um macaco. Então você olha para ele, para a esquerda e para a direita, e ele parece familiar. Finalmente, quando vi a capa de uma revista financeira, de repente me lembrei: “Ah, esse não é o Buffett!”

Claro que isso é só uma brincadeira, mas você já pensou que se houver 1.000 gestores de fundos, depois de 10 anos, cerca de 10 gestores de fundos terão desempenho superior ao do mercado por 10 anos consecutivos? Mas isso pode ser determinado pela aleatoriedade e sorte, e não tem nada a ver com as habilidades dos gestores de fundos.

Assim como o desempenho do backtest no lado esquerdo da imagem abaixo, acredito que a maioria dos investidores ficará surpresa. Essa estratégia de investimento teve um desempenho muito sólido, quase sem quedas significativas. Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-5

Espere um minuto, como mostra a imagem à direita, a situação real é lá dentro. Acontece que a curva de backtest à esquerda é simplesmente a de melhor desempenho entre muitos backtests. Ou seja, no backtest da esquerda, há muitas situações com desempenho ainda pior.

Armadilha do Backtesting: Custo de Impacto

Em um ambiente de negociação real, os preços estão constantemente flutuando. Quando você vê uma oportunidade de negociação e faz uma ordem, o preço pode ter mudado. Portanto, o problema de deslizamento é inevitável, seja em negociações subjetivas ou quantitativas.

No entanto, o backtesting é baseado em dados estáticos e é difícil simular um ambiente de negociação real. Por exemplo: o preço da ordem é de compra a 1050, mas o preço real da transação pode ser 1051. Há muitas razões para esse fenômeno, tais como: vácuo de liquidez em condições extremas de mercado, atrasos na rede, sistemas de software e hardware, resposta do servidor, etc.

Backtesting sem deslizamento

Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-6

Conforme mostrado na figura acima, este é um backtest sem slippage. A curva de capital parece melhor, mas há uma diferença entre o preço de transação real em trading real e o preço de transação ideal do backtest de estratégia. Portanto, para reduzir esse erro, ao fazer o backtest da estratégia, você pode definir 2 pontos de deslizamento para aumentar o preço de compra ou diminuir o preço de venda.

Backtesting com Slippage

Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-7

Conforme mostrado na figura acima, para a mesma estratégia, se o resultado do backtest for significativamente diferente do resultado do backtest sem deslizamento após adicionar o deslizamento de 2 saltos, isso significa que essa estratégia precisa ser melhorada ou substituída por uma nova. Especialmente para estratégias com uma frequência de negociação relativamente alta, adicionar um deslizamento de 1 a 2 saltos durante o backtest pode deixar o backtest mais próximo do ambiente de negociação real.

Resumir

Alguns amigos podem perguntar: já que pode haver tantos problemas na negociação quantitativa, como devo provar que minha estratégia está correta? Na verdade, a resposta é muito simples. Antes de implementar a estratégia na prática, você deve primeiro simular a transação por um período de tempo. Se o preço da transação simulada for quase o mesmo que o preço da transação durante o backtest, então isso prova que não há problema com a estratégia, pelo menos não há problema com a lógica da estratégia.

Em qualquer caso, o backtesting é essencial para um desenvolvedor de sistema de negociação experiente. Porque ele pode dizer se uma ideia estratégica pode ser verificada como eficaz em transações históricas. Mas muitas vezes o backtesting não significa lucratividade futura. Como há muitas armadilhas no backtesting, você não vai entendê-lo a menos que gaste dinheiro para aprender algumas lições. E essas lições são aprendidas com dinheiro real. Acredito que ler este artigo pode pelo menos ajudar você a evitar muitos desvios e armadilhas quantitativas.

Trabalho de casa

  1. O que é overfitting e como evitá-lo?
  2. Quais são alguns exemplos de preconceito de sobrevivência na vida real?

5.2 Como fazer backtesting de negociação quantitativa

resumo

A significância e importância do backtesting estão além de dúvidas. Ao conduzir backtesting quantitativo, deve-se tentar manter a estratégia no ambiente histórico real tanto quanto possível. Se os detalhes no ambiente histórico forem ignorados, todo o backtest quantitativo pode ser inválido. Este artigo explicará como fazer backtesting de negociação quantitativa.

Backtesting é equivalente à reprodução de dados. Ele reproduz dados históricos da linha K e simula regras de negociação reais para comprar e vender, e finalmente resume o índice de Sharpe, a taxa máxima de drawdown, a taxa de retorno anualizada, a curva de capital e outros dados dentro de um período de tempo. Atualmente, existem muitos softwares que podem realizar backtesting, como o Wenhua Finance, que tem uma gama completa de produtos, o VNPY, que pode ser personalizado de forma flexível, e assim por diante.

Como um software comercial de negociação quantitativa, o Inventor Quant vem com um mecanismo de backtesting de alto desempenho e adota uma estrutura de backtesting for-loop (sondagem) para cálculos vetorizados, o que é mais rápido. Ele também unifica os códigos para backtesting e negociação real, resolvendo parcialmente o dilema de “backtesting fácil, negociação real difícil”.

Introdução à interface de backtesting

Vamos tomar a Estratégia de Linguagem Mai do Inventor Quantitative como exemplo e abrir o site oficial da Ferramenta de Negociação Quantitativa do Inventor (www.fmz.com). Clique em Centro de Controle, Biblioteca de Estratégias, Selecione uma Estratégia, Simule Backtest e entre na seguinte página: Introdução do Inventor à Negociação Quantitativa - Do Básico à Prática Figura 5-8