Como analisar séries temporais financeiras usando o BigQuery

Os analistas quantitativos usam várias ferramentas e técnicas de extração de Big Data, como o histórico de transações financeiras, para conseguir informações sobre as tendências do mercado. Como as cotações, a negociação e outros eventos ocorrem em intervalos previsíveis, esses dados representam uma série temporal financeira que pode ser analisada com o uso de técnicas estabelecidas, incluindo análise de frequência e médias móveis.

No entanto, lidar com conjuntos de dados maciços pode ser um desafio. As ferramentas tradicionais podem não ser escalonadas enquanto o conjunto de dados cresce continuamente. Os requisitos de armazenamento podem crescer tão rápido quanto o conjunto de dados. Por isso, fazer o download de dados para o disco rígido do seu computador não é mais uma abordagem viável. A recuperação dos subconjuntos certos de dados de uma consulta de banco de dados tradicional pode levar muito tempo.

O Google BigQuery resolve esses e outros problemas, permitindo consultas semelhantes a SQL em tabelas apenas por anexação e, em seguida, retornando resultados muito rapidamente por meio do processamento de infraestrutura do Google. Você pode usar o BigQuery na Web, na linha de comando e por meio de APIs, incluindo as APIs REST. Quando combinado com outros componentes do Google Cloud Platform e até mesmo com ferramentas de terceiros, o BigQuery permite que você crie as soluções de análise de dados que precisa agora, ao mesmo tempo que confia em poder escalar suas soluções no futuro.

A segurança é sempre importante quando lidamos com dados financeiros. Com o Google Cloud Platform, seus dados permanecem seguros, protegidos e particulares de diversas maneiras. Por exemplo, todos os dados são criptografados durante a transmissão e em repouso, e o Cloud Platform está em conformidade com ISO 27001, SOC3, FINRA e PCI.

Objetivos

  • Carregar um conjunto de dados no BigQuery.
  • Usar a IU da Web do BigQuery para executar várias consultas de séries temporais financeiras.
  • Visualizar os resultados das consultas.

Pré-requisitos

  • Ative a API BigQuery para um projeto do console do Google Cloud Platform.
  • Ative o faturamento.
  • Instale o Google Cloud SDK no sistema operacional cliente.

Carregar os dados da amostra

Este tutorial usa dados de mercado de câmbio (FX, na sigla em inglês), que representam cotações das taxas de câmbio internacionais ao longo do tempo. Esses valores registram os preços oferecidos pelos corretores para os tipos de negócios em moeda que ocorrem como quando as pessoas viajam, quando as grandes instituições financeiras movem fundos entre países ou regiões ou quando os especuladores procuram lucro ao negociar moedas. Os dados usam o seguinte formato:

<venue>,
<from-currency>/<to-currency>,
<timestamp>,
<bid-price>,
<ask-price>

Todas as cotações no conjunto de dados de exemplo são para trocas entre a libra esterlina britânica (GBP) e o dólar norte-americano (USD). Os carimbos de data/hora são sempre expressos no Horário de Greenwich (GMT) e os últimos três dígitos são sempre zero, o que torna a resolução da série temporal um milissegundo. O preço do lance representa o que os compradores ofereceram pagar pela moeda, enquanto o preço de venda representa o preço que os vendedores ofereceram por unidade.

Para carregar os dados da amostra, siga estas etapas.

  1. Defina o projeto atual. Em uma janela de terminal, digite o seguinte comando:

    gcloud config set project <your_project_id>
    
  2. Crie um novo conjunto de dados no BigQuery.

    bq mk timeseries
    
  3. Carregue os dados de dois arquivos CSV. O primeiro arquivo contém os dados de janeiro de 2014 e o segundo arquivo contém os dados de fevereiro. Pode levar algum tempo para carregar estes conjuntos de dados.

    bq load timeseries.gbpusd_0114 gs://solutions-public-assets/time-series-master/GBPUSD_2014_01.csv venue:STRING,currencies:STRING,time:TIMESTAMP,bid:FLOAT,ask:FLOAT
    
    bq load timeseries.gbpusd_0214 gs://solutions-public-assets/time-series-master/GBPUSD_2014_02.csv venue:STRING,currencies:STRING,time:TIMESTAMP,bid:FLOAT,ask:FLOAT
    
  4. Abra a IU da Web do BigQuery.

  5. Veja o esquema da tabela. No nome do seu projeto, expanda o conjunto de dados timeseries e clique em gbpusd_0114.

A figura a seguir mostra o esquema da tabela gbpusd_0114. O esquema da tabela gbpusd_0214 é idêntico.

Detalhes da tabela

Consulta das cotações de janeiro

Comece com algumas consultas simples que você pode usar para ver como são os dados do FX.

  1. Na IU da Web do BigQuery, clique em Escrever consulta.

  2. Na caixa de texto Nova consulta, insira a seguinte consulta.

    SELECT
     venue,
     currencies,
     time,
     bid,
     ask
    FROM
     timeseries.gbpusd_0114
    ORDER BY
     time ASC
    LIMIT   1000;
    
  3. Clique em Executar consulta.

    Procure os dados usando os controles que a ferramenta fornece, como os links Próximo e Anterior. Observe que o formato dos dados na coluna de tempo não mostra a resolução completa dos dados subjacentes, até milissegundos:

    2014-01-01 00:10:10 UTC
    
  4. Modifique a consulta para usar uma função interna para reformatar as informações de tempo. Na caixa de texto Nova consulta, altere a primeira parte da instrução SELECT da seguinte maneira.

    SELECT FORMAT_UTC_USEC(time) AS time,
    

    FORMAT_UTC_USEC é uma função interna que reformata os dados de tempo como Tempo Universal Coordenado (UTC, na sigla em inglês). O BigQuery oferece muitas funções internas para facilitar a consulta de grandes conjuntos de dados.

  5. Clique em Executar consulta para ver os resultados. O formato de dados agora está em UTC mostrando a resolução total do carimbo de data/hora.

    2014-01-01 00:00:05.763000
    

Ver os lances dentro de um período de tempo

Em seguida, modifique a consulta para restringir os resultados a um determinado período de tempo. Isso produzirá um conjunto mais gerenciável de resultados que podem ser baixados rapidamente como um arquivo CSV.

Na caixa de texto Nova consulta, digite e execute a seguinte consulta. Ela restringe os resultados a um período de 30 minutos em 1º de janeiro.

SELECT
  TIME(time) AS time,
  bid
FROM
  timeseries.gbpusd_0114
WHERE
  time BETWEEN TIMESTAMP("2014-01-01 00:00:00.000")
  AND TIMESTAMP("2014-01-01 00:29:59.999")
ORDER BY
  time ASC;

Observe que essa consulta usa a função TIME para mostrar um formato de tempo abreviado. Como você sabe que os resultados são de um determinado dia, não precisa ver o carimbo de data/hora completo. Esse formato ficará melhor no gráfico a ser criado na próxima etapa.

Visualize esses dados baixando os resultados como um arquivo CSV e exibindo um gráfico no Planilhas Google. Siga estas etapas:

  1. Clique em Fazer o download como CSV.
  2. Abra o Planilhas Google e crie uma nova planilha.
  3. Clique em Arquivo > Importar. Importe o arquivo de resultados fazendo upload do arquivo do seu computador.
  4. Na caixa de diálogo Importar arquivo, selecione Substituir planilha atual e clique em Importar.
  5. Pressione CTRL + A para selecionar todos os dados na planilha.
  6. Clique em Inserir > Gráfico para criar um novo gráfico dos dados.
  7. Na guia Gráficos, selecione um gráfico de linhas e clique em Inserir.

A figura a seguir mostra os dados como um gráfico de linhas.

Gráfico de linha mostrando lances

Agora, você pode ver facilmente que o dólar apresentou uma tendência menor em relação à libra na maioria dos primeiros 20 minutos do dia. Depois, ele se recuperou um pouco nos próximos cinco minutos.

Combinar tabelas

Os dados carregados no BigQuery foram divididos entre dois arquivos CSV e agora estão em duas tabelas. Combine os dados com facilidade incorporando uma consulta de tabela, como mostra o exemplo a seguir. Nesse caso, a instrução SQL combina todas as tabelas com IDs contendo "gbpusd", ou seja, as duas tabelas que você criou. A consulta simplesmente retorna o primeiro e o último carimbos de data/hora no conjunto de dados.

SELECT
  MIN(time) AS time1,
  MAX(time) AS time2
FROM
  (TABLE_QUERY(timeseries,
      'table_id CONTAINS "gbpusd"'));

Tabelas específicas também podem ser combinadas por nome. Por exemplo, a seguinte consulta recupera os preços de venda em torno da meia-noite GMT entre 31 de janeiro e 1 de fevereiro. Quando você lista as colunas separadamente por vírgulas em uma cláusula SELECT, o BigQuery SQL executa uma UNION e não uma operação JOIN tradicional, esperada se você já usou o SQL antes.

SELECT
  STRFTIME_UTC_USEC(time,"%m-%d-%Y %r") AS time,
  ask
FROM
  timeseries.gbpusd_0114,
  timeseries.gbpusd_0214
WHERE
  time BETWEEN TIMESTAMP("2014-01-31 23:30:00.000")
  AND TIMESTAMP("2014-02-01 00:29:59.999")
ORDER BY
  time ASC;

Essa consulta usa a função STRFTIME_UTC_USEC para formatar o carimbo de data/hora por dois motivos. Primeiro, o carimbo de data/hora precisa estar em um formato que possa ser classificado durante os dois dias. Um formato como HOUR não funcionaria porque o resultado classificado não levaria em consideração a mudança no dia. Em segundo lugar, o rótulo do gráfico deve estar no formato apropriado. Apesar de ser possível, por exemplo, rotular o gráfico com a hora UTC total, incluindo microssegundos, a informação de temporização de adição não é particularmente útil como um rótulo do gráfico.

O gráfico a seguir mostra os resultados.

Gráfico de linha em arquivos

Agora você pode ver exatamente o que aconteceu com o preço de venda no limite entre as duas tabelas.

Analisar a frequência dos dados

Nos mercados financeiros, às vezes a taxa de mudança nas cotações pode produzir informações interessantes. Você pode executar consultas para conseguir informações sobre o número de cotações de FX, chamadas de ticks, em um determinado período de tempo. É importante observar que um tick não é uma unidade de tempo consistente, como o toque de um relógio. Um tick é uma cotação única que muitas vezes representa uma mudança no preço.

A consulta a seguir retorna o número de ticks por hora em 16 de janeiro de 2014.

SELECT
  HOUR(time) AS hour,
  COUNT(time) AS num_ticks
FROM
  timeseries.gbpusd_0114
WHERE
  time BETWEEN TIMESTAMP("2014-01-16 00:00:00.000")
  AND TIMESTAMP("2014-01-16 23:59:59.999")
GROUP BY
  hour
ORDER BY
  hour ASC;

O gráfico de barras a seguir mostra os resultados.

Gráfico de barras com frequência

Você pode ver no gráfico que a maior quantidade de atividade aconteceu entre o meio-dia e as 16h GMT nesse dia.

Depois, execute a seguinte consulta para ver o número médio de ticks para cada hora do dia em todo o mês de janeiro de 2014. A consulta calcula a média dividindo o número total de ticks pelo número de dias de negociação no mês e depois agrupando por hora.

SELECT
  HOUR(time) AS hour,
  COUNT(time)/COUNT(DISTINCT DAY(time)) AS avg_ticks
FROM
  timeseries.gbpusd_0114
GROUP BY
  hour
ORDER BY
  hour ASC;

O gráfico a seguir mostra a distribuição das médias. Você pode ver que a distribuição é semelhante ao resultado obtido para 16 de janeiro, de modo que esse dia foi razoavelmente médio para esse mês quando se trata da atividade de cotação.

Gráfico de barras com frequência média

Calcular uma média móvel

Uma técnica fundamental para análise de séries temporais financeiras é a média móvel simples (SMA, na sigla em inglês). Use o BigQuery para calcular uma SMA dos dados FX. A consulta a seguir recupera uma série temporal da SMA de 60 segundos para preços de lances em um período de três horas durante a manhã de 16 de janeiro.

SELECT
  TIME(S1.time) AS bid_time,
  AVG(S2.bid) AS avg_bid
FROM
  timeseries.gbpusd_0114 AS S1
JOIN EACH
  timeseries.gbpusd_0114 AS S2
ON
  S1.time = S2.time
WHERE
  TIMESTAMP_TO_SEC(S2.time)
  BETWEEN (TIMESTAMP_TO_SEC(S1.time) - 60)
  AND TIMESTAMP_TO_SEC(S1.time)
  AND
  S1.time
  BETWEEN TIMESTAMP("2014-01-16 09:00:00.000")
  AND TIMESTAMP("2014-01-16 11:59:59.999")
GROUP BY
  bid_time
ORDER BY
  bid_time ASC;

Essa consulta usa a função AVG interna para calcular as médias. Ela cria a janela da média móvel, primeiro executando uma autojunção nos carimbos de data/hora da tabela e depois usando a cláusula WHERE para limitar o resultado da junção a um intervalo de tempo de 60 segundos. Na cláusula JOIN, a consulta usa o modificador EACH, o que dá ao BigQuery uma dica de que a junção faz referência a duas tabelas grandes. O mecanismo de execução da consulta usa essa dica para executar otimizações. Por fim, a cláusula GROUP BY agrega as médias móveis e ORDER BY classifica os resultados.

Veja o gráfico de linha dos dados a seguir.

Gráfico de linhas mostrando média móvel

Excluir os dados do teste

Quando terminar de trabalhar com os dados do teste, exclua o conjunto de dados. Siga estas etapas:

  1. Na IU da Web do BigQuery, à direita do nome do conjunto de dados timeseries, clique no botão de seta para baixo.
  2. Clique em Excluir conjunto de dados.
  3. Na tela de confirmação de exclusão da operação, clique em OK.

Para saber mais sobre o BigQuery, leia a documentação do BigQuery.

Próximas etapas

Conheça outros recursos do Google Cloud Platform. Veja nossos tutoriais.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…