Estamos falando principalmente aqui da implementação de código programado em tempo real para estratégias de negociação de média e baixa frequência.

Estratégia

O nascimento de uma estratégia de negociação quantitativa é geralmente baseado na observação e compreensão do mercado, na geração de uma ideia de estratégia, em seguida, no design dos detalhes específicos da estratégia e, em seguida, no backtesting de múltiplas variedades de dados para obter e verificar o efeito de valores de parâmetros específicos. . Se o efeito for bom e tiver aplicabilidade universal, o próximo passo é testar o mercado real com pequenos fundos. Se a oferta real fora da amostra for viável, você poderá eventualmente aumentar os fundos e executá-la por um longo tempo.

Para evitar a alavancagem, deixe-me explicar que, claro, existem outros métodos para gerar estratégias, como mineração de dados, escavação, escavação, fatores de escavação. Existem também fatores de geração automática, como aprendizado de máquina e aprendizado por reforço. No entanto, é difícil manter esse tipo de método de caixa preta em execução durante o período de retração da estratégia, porque você não sabe quando e por que esses fatores escavados falharão. Ao realizar negociações quantitativas, o mais importante é insistir em negociações firmes. Se o mercado não estiver bom, você poderá reduzir sua posição, mas não poderá fechar. Ninguém pode saber quando o grande mercado irá estourar. Se você perder, sua retração anterior será em vão.

Uma analogia é que o desenho e o backtesting das estratégias equivalem ao “cálculo do templo” mencionado em “A Arte da Guerra” de Sun Tzu “Aquele que não tem batalha, mas o templo é o vencedor, tem que calcular mais; aquele que não tem batalha, mas o templo é o vencedor, tem que calcular mais; quem não lutou mas o templo é quem perde tem que calcular." Menos é mais. Mais significa vitória, menos significa menos, e nada conta!"

Portanto, a estratégia de negociação deve ser bem planejada e cuidadosamente calculada desde o design inicial, caso contrário você realmente perderá antes que a oferta real seja feita. Esta etapa é a mais difícil. Embora o código subsequente não seja fácil, a maior parte é apenas tediosa. Se você gastar mais tempo e esforço, sempre poderá fazê-lo bem. A chave para uma oferta firme é o controle de risco.

As estratégias de negociação, ou regras de negociação, permitem-nos “fazer a coisa certa”, e a implementação específica da oferta real é “fazer a coisa certa”. Muitas vezes, saber a direção certa é muito mais difícil do que caminhar a distância. Assim como a piada sobre consertar equipamentos, cobra mil yuans para traçar um limite. Desenhar a linha em si vale apenas 1 dólar, mas saber onde desenhá-la custa 999.

Estratégia + oferta real juntas formam um sistema de negociação. Em relação ao design de um sistema de negociação, você pode consultar o artigo anterior: Sete Elementos de um Sistema de Negociação Completo. A verdadeira oferta aqui são, na verdade, as operações específicas das próximas 4 etapas do sistema de negociação, "Entrada e Saída de Lucros e Perdas". As três primeiras etapas são basicamente determinadas quando o desenho da estratégia é concluído.

No entanto, mesmo que a estratégia seja boa, se a implementação real não estiver em vigor, o efeito será bastante reduzido e mesmo a estratégia potencial que era originalmente boa será interrompida. Desenvolver uma boa estratégia não é fácil, por isso não deixe de executá-la. Uma boa ideia precisa ser implementada com firmeza no final.

pergunta

1. Tendência repentina do mercado

Este tipo de estratégia só será encontrada se houver sinal dentro da barra. Dentro da barra, o preço de fechamento ou de abertura de uma determinada linha K não é usado, mas o preço intradiário é usado para acionar o sinal.

Aqui está um exemplo de problema encontrado na oferta real há alguns dias. Um exemplo microscópico de um mercado comercial. É bastante comum no círculo monetário.

A imagem abaixo é a linha K de 10 segundos do contrato perpétuo do BNB há alguns dias (2023.7.10 17:21) (uma barra é o significado de OHLCV agregado dos dados da transação em 10 segundos).

Como você pode ver, a amplitude da grande linha positiva é de 3,53%, e a transação foi de cerca de 30 milhões de dólares. Concluído em 10 segundos. Antes do início deste mercado, a tendência era quase monótona.

Veja a imagem abaixo, que é a linha k de 1 segundo naquele momento, você pode obter mais detalhes.

Basicamente, leva cerca de 4 segundos para subir totalmente. Subiu mais de 2 pontos no primeiro segundo. Estes são basicamente os resultados de estratégias de alta frequência (orientadas por eventos, tendências de alta frequência, criação de mercado, etc.) e ordens algorítmicas que podem ser organizadas antecipadamente.

Vejamos a linha K de 4 horas do BNB. A maior linha positiva é o período em que a notícia foi divulgada. Amplitude 4,05%.

Comparando as linhas K desses períodos, podemos ver que esse tipo de flutuação impulsionada por notícias (desta vez a notícia é o novo IEO da Binance, ARKM), geralmente é concluída instantaneamente. Na verdade, o aumento de 4 horas não é muito diferente de 10 segundos, e a inicialização real é de apenas cerca de 4 segundos. Este tipo de campo de batalha pertence às estratégias de alta frequência armadas até os dentes. No entanto, também pode afetar estratégias de média e baixa frequência, causando maior derrapagem.

Não estudaremos estratégias de alta frequência aqui. O que isso significa para estratégias de média e baixa frequência? Há duas coisas principais que vêm à mente:

1. Algumas tendências surgem muito repentinamente e são concluídas num curto período de tempo, pelo que a estratégia não pode ser suspensa casualmente. A oferta real no círculo monetário deve ter a garantia de estar online 24 horas por dia, principalmente se houver posição, e não pode ser desconectada.

2. A derrapagem efetiva pode atingir 2 pontos percentuais. Observe a linha K de 1 segundo acima. Se o seu sinal de compra for baseado em um determinado preço, e esse preço sair na parte inferior da grande linha K, não importa o que aconteça, o preço após você entrar. o mercado pode cair 2 a 3 pontos percentuais. O pior pode chegar a 4 pontos percentuais, e essas ordens de compra estão na ponta da agulha. No entanto, se você estiver vendendo, terá lucros além das suas expectativas. No entanto, de acordo com a lei de Murphy, o pão que cai sempre cai com manteiga. No longo prazo, há uma grande probabilidade de que haja mais derrapagens.

O bom, porém, é que isso acontece apenas um número limitado de vezes. Desde que a estratégia seja boa e a derrapagem seja maior, trata-se apenas de realização de lucros e não afetará os retornos positivos a longo prazo. É como suportar mais um choque e desgaste.

Uma forma de mitigar isso é usar o websocket para obter o preço mais recente. O documento diz que ele atualiza a cada 250 milissegundos, mas às vezes ele atualiza mais rápido, então é possível responder imediatamente. Outra vantagem do websocket é que ele não ocupa o limite de frequência da API Restful da exchange. Isto é mencionado em detalhes posteriormente.

2. A cotação horária

Isto é encontrado por muitas estratégias de tendência, porque a maioria delas usa o preço da posição do switch para calcular os sinais de entrada e saída. Então, assim que passa a hora, todos começam um após o outro.

Na hora, especialmente múltiplos de 8, porque não importa qual seja o ciclo da sua estratégia, todos esses três pontos devem atender ao divisor comum de tempo. Talvez as estratégias automatizadas de todos entrem em ação e as frequências altas, médias e baixas sejam comprimidas. gerar seus próprios sinais, rivais uns dos outros.

Além disso, neste momento, a bolsa também necessita de liquidação e entrega. Embora o contrato perpétuo não seja entregue, poderão haver outras operações para cálculo da taxa de capital de entrega. Por cerca de 6 segundos após as três horas de 08/01/16, o websocket da Binance não enviou informações da linha K, ele parou! Basta perguntar o que fazer? Na realidade, muitas vezes não há solução.

O que é mais grave é que o mercado irá ressoar, especialmente quando o mercado estiver em queda, e o pânico será mais contagioso. Os servidores da bolsa estão ainda mais ocupados e muitas moedas pequenas com condições de mercado ferozes caem imediatamente. Os pedidos não podem ser feitos e todos são erros 1001. Quando você faz um pedido com pressa e consegue, os pedidos negociados na ponta do alfinete podem ser seus.

Portanto, o deslizamento é realmente inevitável. Basta aceitá-lo. Como mencionado antes, trate-o apenas como mais um stop loss.

No entanto, também existem algumas dicas para compartilhar.

O desvio do sinal pode ser calculado antecipadamente n segundos antes da hora. Nesse momento, o congestionamento não começou, porque a maioria das estratégias automatizadas pode esperar até que o preço de fechamento da linha K na hora saia antes de começar a calcular o sinal. No entanto, o problema causado por esta operação é que ela pode gerar sinais falsos. Por exemplo, o preço volta imediatamente. Não deve haver sinal e ocorre um falso positivo. Neste ponto, depende da sua escolha se deseja fazer isso ou não. No entanto, você pode adicionar um determinado limite e acioná-lo quando for excedido, para evitar sinais falsos causados ​​por retornos de preços de curto prazo. O deslizamento pode ser reduzido um pouco.

Existe também um método de utilização de sinais de deslocamento, como deslocamento de horário ou deslocamento da linha k, que não gera sinais na hora, não se envolve com outras pessoas e evita melhor aglomerações. Existem também métodos como o TWAP.

No entanto, estes requerem algumas habilidades e tornarão o código real mais difícil.

oferta firme

Uma estratégia básica de CTA de média a baixa frequência. De modo geral, o código real é muito simples. Existe apenas uma estratégia para uma variedade, não há adição ou subtração de posições e nenhuma informação cruzada é misturada. Então o código local não precisa manter nenhum estado, pois a exchange registra tudo para você. Se existe uma posição, quanta margem é necessária, se o pedido foi concluído, etc. Por ser de média a baixa frequência, você pode verificar as informações da conta da bolsa a qualquer momento, quando necessário, e isso é o mais imediato e preciso. Isso elimina o problema de usar um banco de dados local para registrar o status da transação.

Esta estratégia simples é realmente viável, mas o problema é que a retração pode ser maior, não suficientemente diversificada e o risco é elevado. Um único produto pode não ter mercado, flutuar e retroceder sem voltar atrás, ou encontrar condições de mercado extremas, e outro grande buraco aparecerá na curva de capital. Se você levar isso a sério, ficará assustado e interromperá sua estratégia se não conseguir suportá-la. Se você levar isso de ânimo leve, a experiência de negociação será muito pior. Observe que tudo isso está sob condições de posições razoáveis. Caso contrário, se a posição for demasiado leve, a retracção será pequena, mas o rendimento também será reduzido, e os lucros e perdas virão da mesma fonte, e será uma pena perder a oportunidade se a posição for; muito pesado, será um erro e, mais cedo ou mais tarde, estará acabado.

No entanto, é recomendado que os novatos comecem com a implementação desta estratégia em tempo real. Somente com a prática você poderá melhorar rapidamente seu nível de negociação. Mas certifique-se de manter sua posição leve, e a alavancagem deve ser menor. É melhor não usar alavancagem, para que você possa persistir por um longo período de tempo.

Se você quiser ser mais profissional, reduzir riscos de ponto único, a curva de capital será mais suave e você terá menos com que se preocupar quando a oferta for feita (como mencionado antes, sob posições razoáveis, isso é realmente muito importante, porque é é mais fácil seguir a estratégia e esperar até o risco) é geralmente um modelo multivariado, multiestratégico e multiparâmetro, e depois há adições e subtrações de posições. Isto não significa necessariamente adicionar ou subtrair posições numa estratégia, mas também pode ser alcançado através de múltiplas subestratégias para alcançar o efeito de adicionar ou subtrair posições. Porém, neste caso, a estratégia será mais lotada. Se você também quiser minimizar o deslizamento de abertura e fechamento de posições, a complexidade do código disparará.

Vamos falar sobre as dificuldades causadas por este modelo multivariedade, multiestratégia e multiparâmetros.

dificuldade

1. Limite de frequência da API

A primeira dificuldade com múltiplas estratégias é o limite de frequência da API. Existem muitas variedades e estratégias Para obter preços, posições, pedidos e outras informações em tempo real, é necessário visitar constantemente a bolsa. Como mencionado anteriormente, se a frequência for baixa e lenta, o preço obtido pode não ser o mais recente e a derrapagem pode ser muito maior.

Os recursos do servidor da exchange são limitados, portanto há um limite na frequência de acesso da API. O limite do Binance é de 2.400 por minuto, e há um limite de 10 segundos, e existem outros chamados modos de aprendizado de máquina para detectar comportamento malicioso. De qualquer forma, definitivamente não funcionará se for muito frequente. Se não funcionar, a bolsa tem a palavra final. Nesse caso, você sabe, não existe fórmula.

Embora se diga que é 2.400, testei-o casualmente usando simultaneidade. Se eu solicitar K linhas, mesmo que sejam as 99 linhas mais curtas por vez (o peso da API é 1), se eu solicitar cerca de 75 moedas ao mesmo tempo. , serei banido por alguns minutos. Portanto, não se pode desafiar facilmente os limites.

Se você violá-lo, receberá 429.418 erros e seu IP será banido por alguns minutos a alguns dias. Neste momento, se você tiver uma posição, será péssimo (não há restrições para fazer pedidos). , especialmente liquidando posições existentes, mas você não tem informações de preço, a menos que também haja websocket)

A solução para esse problema é usar o websocket para obter dados, para que a troca possa empurrá-los ativamente em tempo hábil, sem ocupar a API. Pode reduzir alguns deslizamentos. O problema é que você precisa manter outro centro de mercado baseado em websocket. A dificuldade do código ao vivo aumentou e se tornou mais complicada. Não deve ser desconectado por 24 horas e, se for desconectado, deverá ser reconectado automaticamente a tempo, etc.

2. Situação da estratégia

Como mencionado anteriormente, se as estratégias se tornarem mais complexas, é necessário registrar o status de cada estratégia, caso contrário, as posições da bolsa não saberão qual estratégia abriu, quanto cada uma abriu, etc. E se quiser revisar mais tarde, você terá que registrar mais dados.

Neste momento, você deve introduzir um banco de dados (claro, você também pode usar registros de arquivo, a mesma ideia).

A introdução de um banco de dados traz os problemas do banco de dados. No entanto, isso é semelhante ao desenvolvimento de software em outras indústrias e não traz nada de novo. Principalmente no setor de comércio eletrônico, porque se trata de saldos de fundos, gerenciamento de pedidos e outras coisas semelhantes, quem não tem experiência pode ler esses livros e artigos.

Deve-se notar que muitas etapas precisam realizar operações atômicas semelhantes às transações de banco de dados, ou seja, um conjunto de operações ou todas elas são bem-sucedidas. Uma vez que uma determinada etapa falha, você não precisa fazer nada e reverter para o estado original.

Então, por se tratar de uma transação com dinheiro real, para operações de banco de dados de informações de pedidos, é melhor usar o nível mais alto dos quatro níveis de isolamento, Serializable, para eliminar a possibilidade de todas as leituras sujas, leituras não repetíveis e fantasma lê. Ou seja, nenhuma simultaneidade, multithreading ou mesmo uso assíncrono é usado para ler e gravar informações importantes do banco de dados. Todas as operações são concluídas em um thread. Implementação de operações.

Não encare levianamente o desafio da programação simultânea. Se houver um problema com este tipo de sistema, provavelmente será impossível corrigi-lo. É o bug mais difícil de encontrar no desenvolvimento de software. Aqueles que conseguem concluir esse tipo de trabalho com perfeição são programadores com um salário mensal de mais de 50.000.

Não consigo pensar em muitos que usam multi-threading ou assíncrono (multi-threading e assíncrono, é recomendado usar multi-threading, porque assíncrono é como uma doença infecciosa em Python. Uma vez usado, deve ser usado em uma cadeia de chamadas) O que é realmente benéfico é enviar sinais de alerta DingTalk e similares. Como o serviço DingTalk está na China e os servidores de câmbio estão no exterior, seu servidor de código deve ser implantado no exterior, mais próximo da bolsa, portanto, ao enviar o DingTalk, às vezes leva vários segundos para retornar, e às vezes até é bloqueado. dura mais de dez segundos.

afinal

Na verdade, não importa se você não consegue fazer muitas coisas. Contanto que você tenha consciência de aceitar uma derrapagem maior, é possível cuspir quase 1/5 ou até mais lucros. O mais importante é a estratégia. Esperar retornos positivos e poder funcionar sem qualquer tempo de inatividade é a chave.

Em suma, a primeira prioridade de uma oferta firme é continuar e executar de forma estável a lógica estabelecida da estratégia. A derrapagem faz parte da negociação, apenas tente reduzi-la, desde que não quebre seus músculos.

Estratégia de primeira classe, 2 e 3 fluxos são implementados, não há grande problema. Mas se a estratégia não estiver de acordo com o padrão, o principal código de negociação real não ajudará e a perda ainda será uma perda. Portanto, apenas escrever um bom código não pode fazer bem a negociação quantitativa. A estratégia é boa e o código ativo é robusto. Claro que é o melhor. No entanto, quando o tempo é limitado, concentre-se na estratégia.

Continua