EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Currency Analysis With Time Series Collections #3 — MACD and RSI Calculation

Fuat Sungur8 min read • Published Aug 27, 2021 • Updated Sep 11, 2024
MongoDBTime SeriesJavaScript
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
In the first post of this series, we learned how to group currency data based on given time intervals to generate candlestick charts. In the second article, we learned how to calculate simple moving average and exponential moving average on the currencies based on a given time window. Now, in this post, we’ll learn how to calculate more complex technical indicators.

Indicador MacD

O MACD (Moving Average Convergence Divergence) é outro indicador de negociação e fornece visibilidade da tendência e do momentum da moeda/ação. O cálculo do MACD utiliza fundamentalmente vários cálculos deEMA com parâmetros diferentes.
Conforme mostrado no diagrama abaixo, o indicador MACD tem três componentes principais: Linha MACD, Sinal MACD e Histograma. (A linha azul representa a linha MACD, a linha vermelha representa o sinal MACD e as barras verde e vermelha representam o histograma):
Macd histograma
  • A linha MACD é calculada subtraindo a média móvel exponencial do período de 26(principalmente, os dias são usados para o período) da média móvel exponencial do período de 12.
  • Depois de obter a Linha MacD, podemos calcular o Sinal macd. O sinal MACD é calculado obtendo a média móvel exponencial de nove períodos da Linha MACD.
  • O histograma MACD é calculado subtraindo-se o sinal MACD da linha MACD.
Podemos usar o MongoDB Aggregation Framework para calcular esse indicador complexo.
Nas postagens anteriores do blog, vimos como podemos agrupar os dados brutos de segundo nível em intervalos de cinco minutos por meio do estágio$group e do operador$dateTrunc :
Depois disso, precisamos calcular duas médias móveis exponenciais com parâmetros diferentes:
Depois de calcularmos as duas médias móveis exponenciais separadas, precisamos aplicar a operação$subtract na próxima etapa da aggregation pipeline:
Depois de obter o campomacdLine, podemos aplicar outra média móvel exponencial a esse campo recém-gerado (macdLine) para obter o valor do sinal MacD:
Portanto, teremos mais dois campos: macdLine e macdSignal. Podemos gerar outro campo como macdHistogram que é calculado subtraindo macdSignal do valormacdLine:
Agora temos três campos derivados: macdLine, macdSignale macdHistogram. Abaixo, você pode ver como o MacD é visualizado junto com as velas:
Gráficos de velas
Este é o pipeline de agregação completo:

Indicador RSI

O RSI (Relativity Strength Index) é outro indicador técnico financeiro que revela se o ativo foi sobrecomprado ou sobrevendido. Geralmente, ele usa uma janela de período 14, e o valor do RSI é medido em uma escala de 0 a 100. Se o valor estiver mais próximo de 100, isso indica que o ativo foi sobrecomprado nesse período. E se o valor estiver mais próximo de 0, isso indica que o ativo foi sobrevendido nesse período. Principalmente, 70 e 30 são usados para limites superiores e inferiores.
O cálculo do RSI é um pouco mais complicado do que o MacD:
  • Para cada ponto de dados, os valores de ganho e perda são definidos comparando um ponto de dados anterior.
  • Depois de definirmos os valores de ganho e perda para cada ponto de dados, podemos obter uma média móvel de ganho e perda para um período 14. (Você não precisa aplicar um período 14 . O que quer que funcione para você, você pode definir de acordo.)
  • Depois de obtermos o ganho médio e o valor médio da perda, podemos dividir o ganho médio pela perda média.
  • Depois disso, podemos suavizar o valor para normalizá-lo entre 0 e 100.

Calculando ganhos e perdas

Em primeiro lugar, precisamos definir o valor de ganho e de perda para cada intervalo.
O valor de ganho e perda é calculado subtraindo uma informação de preço anterior das informações de preço atual:
  • Se a diferença for positiva, significa que há um aumento de preço e o valor do ganho será a diferença entre o preço atual e o preço anterior. O valor da perda será 0.
  • Se a diferença for negativa, significa que há uma queda no preço e o valor da perda será a diferença entre o preço anterior e o preço atual. O valor do ganho será 0.
Considere o seguinte conjunto de dados de entrada:
Depois de calcular o ganho e a perda, teremos os seguintes dados:
Mas no MongoDB Aggregation Pipeline, como podemos nos referir ao documento anterior a partir do documento atual? Como podemos derivar o novo campo ($previousPrice) do documento anterior na janela classificada?
MongoDB 5.0 introduziu o operador$shift que inclui dados de outro documento na mesma partição no local fornecido, por exemplo, você pode se referir ao documento que é três documentos antes do documento atual ou dois documentos após o documento atual na classificação janela.
Definimos nossa janela com particionamento e introduzimos um novo campo como previousPrice:
$shift usa dois parâmetros:
  • by especifica o local do documento que incluiremos. Como queremos incluir o documento anterior, o configuramos como -1. Se quisermos incluir um próximo documento, o definiremos como 1.
  • output Especifica o campo do documento que queremos incluir no documento atual.
Depois de definir as informações$previousPrice para o documento atual, precisamos subtrair o valor anterior do valor atual. Vamos ter outro campo derivado "diff " que representa o valor de diferença entre o valor atual e o valor anterior:
Definimos o valordiff e agora definiremos mais dois campos, gain e loss, para usar nos estágios seguintes. Apenas aplicamos a lógica de ganho/perda aqui:
Depois de enriquecermos os dados do símbolo com informações de ganho e perda para cada documento, podemos aplicar mais partições para obter a média móvel dos campos de ganho e perda considerando os pontos de dados 14 anteriores:
Aqui também usamos outro operador recém-introduzido, $documentNumber. Enquanto faço cálculos na janela, fornecemos um número sequencial para cada documento, porque filtraremos os documentos que têm o número do documento menor ou igual a 14. (O RSI é calculado após a chegada de pelo menos 14 pontos de dados.) Faremos a filtragem nos estágios posteriores. Aqui, definimos apenas o número do documento.
Depois de calcularmos o ganho médio e a perda média para cada símbolo, encontraremos o valor da força relativa. Isso é calculado dividindo-se o valor médio de ganho pelo valor médio de perda. Uma vez que aplicamos a operação de divisão, precisamos antecipar o problema da "divide by 0" também:
O valor da força relativa foi calculado e agora é hora de suavizar o valor da Força relativa para normalizar os dados entre 0 e 100:
Basicamente, definimos null para os primeiros 14 documentos. E para os outros, o valor RSI foi definido.
Abaixo, você pode ver um gráfico de velas de intervalo de um minuto e um gráfico RSI. Após 14 pontos de dados, o RSI começa a ser calculado. Para cada intervalo, calculamos o RSI por meio de queries de agregação processando os dados anteriores desse símbolo:
Gráficos de velas
Este é o pipeline de agregação completo:

Conclusão

O MongoDB Aggregation Framework fornece um ótimo conjunto de ferramentas para transformar qualquer formato de dados no formato desejado. Como você pode ver nos exemplos, usamos uma grande variedade de estágios e operadores de pipeline de agregação. Conforme discutimos nas postagens anteriores do blog, coleções de séries temporais e funções de janela são ótimas ferramentas para processar dados baseados em tempo em uma janela.
Nesta postagem, examinamos os operadores $shift e $documentNumber que foram introduzidos com o MongoDB 5.0. O operador$shift inclui outro documento na mesma janela do documento atual para processar dados posicionais junto com dados atuais. Em um cálculo de indicador técnico RSI, ele é comumente usado para comparar o ponto de dados atual com os pontos de dados anteriores, e $shift facilita a referência a documentos posicionais em uma janela. Por exemplo, diferença de preço entre o ponto de dados atual e o ponto de dados anterior.
Outro operador recém-introduzido é $documentNumber. $documentNumber fornece um número sequencial para que os documentos classificados sejam processados posteriormente nos estágios subsequentes de agregação. Em um cálculo de RSI, precisamos pular o cálculo do valor de RSI para os primeiros períodos de dados 14 e $documentNumber nos ajuda a identificar e filtrar esses documentos em estágios posterioresdo pipeline de agregação.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Artigo
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Modernizando esquemas RDBMS com um document model do MongoDB


Mar 06, 2024 | 6 min read
Início rápido

Uma introdução aos dados GDELT


May 24, 2022 | 5 min read
Artigo

7 coisas que aprendi ao modelar dados para as estatísticas do YouTube


Sep 11, 2024 | 13 min read
Artigo

Atlas Query Federation SQL para formar poderosas interações de dados


Aug 13, 2024 | 3 min read
Sumário
  • Indicador MacD