0
focar em
78
Seguidores

Análise de dados de séries temporais e backtesting de dados de ticks

Criado em: 2019-08-08 10:05:45, atualizado em: 2024-12-19 00:24:00
comments   0
hits   5472

Análise de dados de séries temporais e backtesting de dados de ticks

Dados de séries temporais

Uma série temporal é uma sequência de dados obtidos em períodos de tempo consecutivos igualmente espaçados. No investimento quantitativo, esses dados se manifestam principalmente como o movimento de preços e pontos de dados das metas de investimento que estão sendo monitoradas. Por exemplo, preços de ações e dados de séries temporais registrados regularmente durante um período de tempo especificado podem ser visualizados na figura a seguir, o que dará aos leitores uma compreensão mais clara:

Análise de dados de séries temporais e backtesting de dados de ticks

Como você pode ver, a data está no eixo x e o preço está no eixo y. Neste caso, “intervalos consecutivos” significa que os dias no eixo x têm 14 dias de diferença: observe a diferença entre 7 de março de 2005 e o próximo ponto, 31 de março de 2005 e abril de 2005. 5 e 19 de abril de 2005.

No entanto, ao trabalhar com dados de séries temporais, você geralmente verá mais do que apenas colunas de data e preço. Na maioria das vezes, você trabalhará com dados que contêm cinco colunas: Período de dados, Aberto, Alto, Baixo e Fechamento. Isso significa que se o seu período de dados for definido como diário, as mudanças de preço máximas, de abertura, mínimas e de fechamento do dia serão refletidas nos dados dessa série temporal.

O que são dados de ticks?

Os dados de tick são a estrutura de dados de transação mais detalhada na bolsa. É também uma forma estendida dos dados de séries temporais mencionados acima, incluindo: preço de abertura, preço mais alto, preço mais baixo, preço mais recente, volume de negociação e valor da transação. Se os dados de negociação forem comparados a um rio, os dados de tick são os dados do rio em uma determinada seção transversal.

Análise de dados de séries temporais e backtesting de dados de ticks

Conforme mostrado na figura acima, cada ação de câmbio estrangeiro será enviada ao mercado em tempo real. As exchanges domésticas verificam duas vezes por segundo. Se houver alguma ação durante esse período, um snapshot é gerado e enviado. Em comparação, o envio de dados só pode ser considerado OnTime, na melhor das hipóteses, e não pode ser chamado de OnTick.

Todos os códigos e dados de séries temporais para este tutorial são obtidos na Plataforma Quantitativa do Inventor.

Dados de tiques quantificados pelo inventor

Embora os dados domésticos de tiques não sejam um tique verdadeiro, usar esses dados para testes retrospectivos pode pelo menos chegar infinitamente perto da realidade e restaurá-la. Cada tick exibe os principais parâmetros do produto no mercado naquele momento e, no mercado real, nosso código é calculado de acordo com a taxa teórica de ticks de 2 vezes por segundo.

Análise de dados de séries temporais e backtesting de dados de ticks

Além disso, no Inventor Quantification, mesmo se você carregar dados para um período de 1 hora, ainda poderá ajustar a granularidade dos dados, como ajustá-la para 1 minuto. Neste momento, a linha K de 1 hora é composta por dados de 1 minuto. É claro que quanto menor o tamanho da partícula, maior a precisão. O que é ainda mais poderoso é que se você alternar os dados para ticks em tempo real, você pode restaurar perfeitamente o ambiente em tempo real. Ou seja, os dados reais da troca são marcados duas vezes por segundo.

Análise de dados de séries temporais e backtesting de dados de ticks

Agora você entende os conceitos básicos necessários para concluir este tutorial. Retornaremos a esses conceitos em breve, e você aprenderá mais sobre eles mais adiante neste tutorial.

Para mais informações sobre esta parte, visite: https://www.fmz.com/bbs-topic/1651

Configurando seu ambiente de trabalho

Para fazer bem o seu trabalho, é preciso primeiro afiar suas ferramentas. Precisamos implantar um custodiante na Inventor Quantitative Platform. Em relação ao conceito de custodiante, leitores com experiência em programação podem pensar nele como um sistema Docker oficialmente empacotado. O sistema tem encapsulou as interfaces de API públicas de várias bolsas tradicionais e os detalhes técnicos detalhados para escrita de estratégias e backtesting. A intenção original de estabelecer este sistema é aliviar os traders quantitativos da necessidade de se concentrar na escrita e no design de estratégias ao usar a Plataforma Quantitativa Inventor. Esses detalhes técnicos são apresentados aos autores de estratégias em um formato empacotado para poupá-los do trabalho de Muito tempo e energia.

  • Implantação do sistema de custódia da Plataforma Quantitativa Inventor

Há duas maneiras de implantar o host:

Método A: Os usuários alugam ou compram servidores e os implantam nas principais 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 Inventor Quantitative Platform, os usuários são encorajados a usar esse método. Essa implantação distribuída elimina o risco de ataques ao servidor (seja para clientes ou para a própria plataforma).

Para esta parte, os leitores podem consultar: https://www.fmz.com/bbs-topic/2848

Método B: Use a implantação do servidor público da Inventor Quantitative Platform. A plataforma fornece implantação em Hong Kong, Londres e Hangzhou. Os usuários podem implantar de acordo com o princípio de proximidade com base na localização da bolsa que desejam negociar. A vantagem desse aspecto é que ele é simples e fácil, e pode ser concluído com um clique. É especialmente adequado para usuários iniciantes. Eles não precisam entender muitos problemas ao comprar um servidor Linux, e também economizam tempo e energia no aprendizado de comandos Linux. O preço também é relativamente barato, o que é adequado para usuários com fundos pequenos. Usuários, a plataforma recomenda usar este método de implantação.

Análise de dados de séries temporais e backtesting de dados de ticks

Para cuidar do entendimento dos iniciantes, este artigo adotará o método B.

As operações específicas são: efetuar login no FMZ.COM, clicar no centro de controle, hospedar e clicar em aluguel de host com um clique na página do host.

Insira a senha. Após a implantação bem-sucedida, a figura a seguir é mostrada:

Análise de dados de séries temporais e backtesting de dados de ticks

  • O conceito de um sistema robótico e sua relação com o hospedeiro

Conforme mencionado acima, o host é como um sistema docker, e um sistema docker é como um conjunto de padrões. Depois de implantarmos esse conjunto de padrões, precisamos gerar uma “instância” para esse padrão, e essa “instância” é um robô.

É muito simples criar um robô. Após implantar o host, clique na coluna do robô à esquerda, clique em Create Robot, preencha um nome no nome do rótulo e selecione o host que você acabou de implantar entre os hosts de hospedagem. A seleção de parâmetros e o período da linha K na caixa de diálogo abaixo podem ser selecionados de acordo com a situação específica, principalmente para cooperar com a seleção da estratégia de negociação.

Análise de dados de séries temporais e backtesting de dados de ticks

Neste ponto, nosso ambiente de trabalho foi configurado. Como você pode ver, ele é muito simples e eficaz, e cada função desempenha sua própria função. Em seguida, começaremos a escrever estratégias quantitativas.

Implementando uma estratégia simples de média móvel com Python

Acima mencionamos os conceitos de dados de séries temporais e dados de tick. Em seguida, usaremos uma estratégia de média móvel simples para vincular esses dois conceitos.

  • O princípio básico da estratégia de média móvel

Por meio de uma média móvel de período lento, como a média móvel de 7 dias, e uma média móvel de período rápido, como a média móvel de 3 dias. Aplicando-os ao mesmo gráfico K-line, quando a média móvel rápida cruza a média móvel lenta, chamamos isso de cruz de ouro; quando a média móvel lenta cruza a média móvel rápida, chamamos isso de cruz da morte.

A base para abrir uma posição é abrir uma ordem longa quando a cruz dourada aparece e abrir uma ordem curta quando a cruz dourada aparece. O mesmo princípio se aplica ao fechamento de uma posição.

Vamos abrir o FMZ.COM, fazer login na conta, no centro de controle, na biblioteca de estratégias, criar uma nova estratégia e selecionar Python na linguagem de escrita de estratégias no canto superior esquerdo. O seguinte é o código para esta estratégia. Cada linha tem comentários muito detalhados. Por favor, reserve um tempo para apreciá-lo. Esta estratégia não é uma estratégia ao vivo, então, por favor, não experimente com dinheiro real. É principalmente para dar a todos uma ideia geral de escrita de estratégia e um modelo de aprendizado.

import types # 导入Types模块库,这是为了应对代码中将要用到的各种数据类型

def main(): # 主函数,策略逻辑从这里开始
    STATE_IDLE = -1 # 标记持仓状态变量
    state = STATE_IDLE # 标记当前持仓状态
    initAccount = ext.GetAccount() #这里用到了现货数字货币交易类库(python版),编写策略时记得勾选上,作用是获得账户初始信息
    while True: # 进入循环
        if state == STATE_IDLE : # 这里开始开仓逻辑
            n = ext.Cross(FastPeriod,SlowPeriod) # 这里用到了指标交叉函数,详情请查看https://www.fmz.com/strategy/21104
            if abs(n) >= EnterPeriod : # 如果n大于等于入市观察期,这里的入市观察期是为了防止一开盘就胡乱开仓。
                opAmount = _N(initAccount.Stocks * PositionRatio,3) # 开仓量,关于_N的用法,请查看官方API文档
                Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # 建立一个变量,用于存储开仓状态,并执行开仓操作
                if Dict :  # 查看dict变量的情况,为下面的日志输出做准备
                    opAmount = Dict['amount']
                    state = PD_LONG if n > 0 else PD_SHORT # PD_LONG和PD_SHORT均为全局常量,分别用来表示多头和空头仓位。
                    Log("开仓详情",Dict,"交叉周期",n) # 日志信息
        else: # 这里开始平仓逻辑
            n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # 指标交叉函数,
            if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # 如果经过了离市观察期且当前账户状态为持仓状态,进而判断金叉或者死叉
                nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
                Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # 平仓逻辑,是多头就平多头,是空头就平空头。
                state = STATE_IDLE # 标记平仓后持仓状态。
                nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
                LogProfit(nowAccount.Balance - initAccount.Balance,'钱:',nowAccount.Balance,'币:',nowAccount.Stocks,'平仓详情:',Dict2,'交叉周期:',n) # 日志信息
        Sleep(Interval * 1000) # 循环暂停一秒,防止API访问频率过快导致账户被限制。

  • Backtesting da estratégia de média móvel

Na página de edição de estratégia, concluímos a escrita da estratégia. Em seguida, precisamos fazer um backtest dessa estratégia para ver como ela se sai em condições históricas de mercado. O backtest desempenha um papel importante no desenvolvimento de qualquer estratégia quantitativa, mas também é apenas isso pode servir como uma referência importante. Backtesting não significa garantia de lucro, porque o mercado está em constante mudança. Backtesting é apenas um ato de retrospectiva e ainda pertence à categoria de indução. O mercado é dedutivo.

Clique no backtest simulado e você verá que há muitos parâmetros ajustáveis, que podem ser modificados diretamente nele. À medida que a estratégia se torna mais e mais complexa e o número de parâmetros aumenta, esse método de modificação pode ajudar os usuários a evitar ter que modifique-os um por um no código. O processo de modificação é descomplicado, rápido e fácil, e claramente organizado.

Análise de dados de séries temporais e backtesting de dados de ticks

As opções de ajuste subsequentes podem otimizar automaticamente os parâmetros definidos. O sistema tentará vários parâmetros ótimos para ajudar os desenvolvedores de estratégia a encontrar a melhor escolha.

Dos exemplos acima, podemos ver que a base do trading quantitativo é a interação entre a análise de dados de séries temporais e o backtesting de dados de tick. Não importa quão complexa seja a lógica, ela é inseparável desses dois elementos básicos. A diferença é apenas a dimensão. Por exemplo, a negociação de alta frequência requer seções de dados mais detalhadas e dados de séries temporais mais ricos. Por exemplo, a negociação de arbitragem requer dados relativamente altos para amostras de backtest. Pode exigir mais de dez anos de dados contínuos e aprofundados sobre dois alvos de negociação para encontrar os resultados estatísticos da expansão e contração de seus spreads de taxa de juros. Em artigos futuros, apresentarei estratégias de negociação de alta frequência e arbitragem, então fique ligado.