As séries temporais referem-se às séries de dados obtidas em um intervalo contínuo de tempo igual. No investimento quantitativo, esses dados são refletidos principalmente no preço e no movimento dos pontos de dados do objeto de investimento rastreado. Por exemplo, para preços de ações, os dados das séries temporais registrados regularmente dentro de um período de tempo especificado podem se referir ao gráfico a seguir, que dará aos leitores uma compreensão mais clara:
Como pode ver, a data está no eixo x e o preço é exibido no eixo y. Neste caso,
No entanto, quando você usa dados de séries temporais, muitas vezes você verá mais do que apenas esse tipo de dados que contém apenas duas colunas: data e preço. Na maioria dos casos, você usará cinco colunas de dados: período de dados, preço de abertura, preço mais alto, preço mais baixo e preço de fechamento. Isso significa que, se seu período de dados for definido no nível diário, as mudanças de preço alto, aberto, baixo e fechado do dia serão refletidas nos dados desta série de tempo.
Os dados Tick são a estrutura de dados de negociação mais detalhada na bolsa. É também uma forma estendida de dados de séries temporais mencionados acima, incluindo: preço de abertura, preço mais alto, preço mais baixo, último preço, quantidade de negociação e volume de negócios. Se os dados de transação forem comparados a um rio, os dados Tick são os dados do rio em uma determinada seção transversal.
Todas as ações das bolsas estrangeiras serão empurradas para o mercado em tempo real, enquanto a câmbio doméstico verifica duas vezes por segundo.
Todos os códigos e a aquisição de dados de séries temporais neste tutorial serão concluídos na plataforma FMZ Quant.
Embora os dados do Tick doméstico não sejam um Tick real, ele pode ser infinitamente próximo e restaurar a realidade pelo menos usando esses dados para backtesting. Cada tick exibe os principais parâmetros do produto no mercado naquele momento, e nosso código no bot real é calculado de acordo com o Tick teórico de duas vezes por segundo.
Não só isso, no FMZ Quant, mesmo que os dados com um período de 1 hora sejam carregados, a granularidade dos dados ainda pode ser ajustada, como ajustar a granularidade dos dados para 1 minuto. Neste momento, a linha K de 1 hora é composta por dados de 1 minuto. Claro, quanto menor a granularidade, maior a precisão. O que é mais poderoso é que, se você mudar os dados para um bot real Tick, você pode restaurar o ambiente real do bot sem problemas. Ou seja, os dados reais do Tick Exchange de duas vezes por segundo.
Agora você aprendeu os conceitos básicos que você precisa entender para completar este tutorial. Estes conceitos voltarão em breve, e você vai aprender mais sobre eles mais tarde neste tutorial.
Melhores ferramentas fazem um bom trabalho. Precisamos implantar um docker na plataforma FMZ Quant primeiro. No que diz respeito ao conceito de um docker, os leitores com experiência em programação podem imaginá-lo como um sistema Docker oficialmente empacotado, que encapsula as interfaces públicas de API de várias exchanges mainstream e os detalhes técnicos de escrita de estratégia e backtesting. A intenção original de estabelecer este sistema é fazer com que os traders quantitativos se concentrem na escrita e design de estratégia ao usar a plataforma FMZ Quant. Esses detalhes técnicos são apresentados aos escritores de estratégia em uma fórmula encapsulada para economizar muito tempo e esforço.
Método A: Os usuários podem alugar ou comprar servidores e implantá-los em várias plataformas de computação em nuvem, como AWS, Alibaba Cloud, Digital Ocean e Google Cloud. A vantagem é que tanto a segurança da estratégia quanto a segurança do sistema são garantidas. Para a plataforma FMZ Quant, os usuários são encorajados a usar este método. A implantação distribuída elimina o perigo oculto de ataques ao servidor (seja o cliente ou a própria plataforma).
Método B: Use o servidor público da plataforma FMZ Quant para implantação, a plataforma fornece quatro locais para implantação em Hong Kong, Cingapura, Japão e leste dos EUA. Os usuários podem implantar de acordo com a localização da bolsa que desejam negociar e o princípio de proximidade. A vantagem deste aspecto é que é simples e fácil de completar com um clique, o que é especialmente adequado para usuários iniciantes. Não precisa saber muitas coisas sobre a compra de servidores Linux, e também economiza tempo e energia de aprender comandos Linux. O preço é relativamente barato. Para usuários com pequenos fundos, a plataforma recomenda o uso deste método de implantação.
Para o entendimento dos iniciantes, este artigo adoptará o método B.
As operações específicas são:FMZ.COM, clique em Painel, Docker e clique em Alugar um docker VPS para alugar o docker.
Digite a senha, conforme mostrado abaixo após a implantação bem-sucedida:
Criar um robô é muito simples. Após a implantação do docker, clique na coluna Bot à esquerda, clique em Adicionar bot, preencha um nome no nome da tag e selecione o docker recém-implantado. Os parâmetros e o período de linha K abaixo podem ser definidos de acordo com a situação específica, principalmente em coordenação com a estratégia de negociação.
Até agora, o nosso ambiente de trabalho foi construído. Pode-se ver que é muito simples e eficaz, e cada função desempenha suas próprias funções. Em seguida, vamos começar a escrever uma estratégia quantitativa.
Nós mencionamos os conceitos de dados de séries temporais e dados Tick acima.
Quando a EMA de período rápido cruza a EMA de período lento, chamamos-lhe Golden Cross; quando a EMA de período lento desce através da EMA de período rápido, chamamos-lhe Bearish Crossover.
A base para a abertura de uma posição é abrir posições longas com uma Cruz de Ouro e abrir posições curtas com um Crossover Bearish.
Vamos abrir.FMZ.COM, entre na conta, no painel, na biblioteca de estratégia e crie uma nova estratégia. Selecione Python na linguagem de escrita de estratégia no canto superior esquerdo. A seguir está o código desta estratégia. Cada linha tem comentários detalhados. Por favor, tome seu tempo para entender. Esta estratégia não é uma estratégia de bot real. Não experimente com dinheiro real. O objetivo principal é dar-lhe uma ideia geral de escrita de estratégia e um modelo para aprender.
import types # Import the Types module library, which is designed to handle the various data types that will be used in the code.
def main(): # The main function, where the strategy logic begins.
STATE_IDLE = -1 # Mark position status variables
state = STATE_IDLE # Mark the current position status
initAccount = ext.GetAccount() # The spot digital currency trading class library (python version) is used here. Remember to check it when writing the strategy to obtain the initial account information.
while True: # Enter the loop
if state == STATE_IDLE : # Here begins the logic of opening positions.
n = ext.Cross(FastPeriod,SlowPeriod) # The indicator crossover function is used here, for details please see: https://www.fmz.com/strategy/21104.
if abs(n) >= EnterPeriod : # If n is greater than or equal to the market entry observation period, the market entry observation period here is to prevent positions from being opened indiscriminately as soon as the market opens.
opAmount = _N(initAccount.Stocks * PositionRatio,3) # Opening position quantity, for the usage of _N, please check the official API documentation.
Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # Create a variable to store the open position status and execute the open position operation.
if Dict : # Check the dict variable and prepare for the following log output.
opAmount = Dict['amount']
state = PD_LONG if n > 0 else PD_SHORT # Both PD_LONG and PD_SHORT are global constants used to represent long and short positions, respectively.
Log("Details of opening positions",Dict,"Cross-period",n) # Log information
else: # Here begins the logic of closing positions.
n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # The indicator crossover function.
if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # If the market exit observation period has passed and the current account status is in the position status, then you can determine the Golden Cross or Bearish Crossover.
nowAccount = ext.GetAccount() # Refresh and get account information again.
Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # The logic of closing a position is to close the long position if it is a long position and close the short position if it is a short position.
state = STATE_IDLE # Mark the position status after closing positions.
nowAccount = ext.GetAccount() # Refresh and get account information again.
LogProfit(nowAccount.Balance - initAccount.Balance,'money:',nowAccount.Balance,'currency:',nowAccount.Stocks,'The details of closing positions',Dict2,'Cross-over period:',n) # Log information
Sleep(Interval * 1000) # Pause the loop for one second to prevent the account from being restricted due to too fast API access frequency.
Clique no backtest, você pode ver que há muitos parâmetros ajustáveis, que podem ser modificados diretamente. Para o futuro, a estratégia é cada vez mais complexa e os parâmetros são cada vez mais. Este método de modificação pode ajudar os usuários a evitar o problema de modificar o código um por um, o que é conveniente, rápido e claro.
As seguintes opções de otimização podem otimizar os parâmetros definidos automaticamente.
A partir dos exemplos acima, podemos ver que a base da negociação quantitativa é através da análise de dados de séries temporais e da interação de backtesting de dados de tick. Não importa o quão complexa seja a lógica, ela não pode ser separada desses dois elementos básicos. A diferença é apenas a diferença de dimensões. Por exemplo, as transações de alta frequência exigem aspectos de dados mais detalhados e mais dados de séries temporais. Outro exemplo é a negociação de arbitragem, que requer muitos dados da amostra de backtest. Pode exigir dados contínuos em profundidade de dois objetos de negociação por mais de dez anos para descobrir os resultados estatísticos de sua expansão e redução de margem de interesse. Em artigos futuros, introduzirei estratégias de negociação de alta frequência e arbitragem uma após a outra. Por favor, espere ansiosamente.