Análise de moeda com coleções de séries temporais #1 – Gerando dados de gráficos de velas
Avalie esse Tutorial
A análise técnica é uma metodologia usada em verbas para fornecer projeções de preços para ativos financeiros com base em dados históricos do mercado.
Quando se trata de analisar dados de mercado, você precisa de um conjunto de ferramentas melhor. Você terá uma boa quantidade de dados, portanto, o armazenamento, o acesso e o processamento rápido desses dados se tornam mais difíceis.
Os dados de preços de ativos financeiros são um exemplo de dados de série temporal. MongoDB 5. O 0 vem com alguns recursos importantes para facilitar o processamento de dados de séries temporais:
- Coleções de séries temporais: essa collection especializada do MongoDB torna incrivelmente simples armazenar e processar dados de séries temporais com recursos automáticos de bucketing.
- Funções de janela: Executa operações em um intervalo especificado de documentos em uma coleção, conhecido como janela, e retorna os resultados com base no operador de janela.
Esta série de três partes explicará como você pode construir uma plataforma de análise de moeda onde você pode aplicar técnicas de análise financeira bem conhecidas, como SMA, EMA, MACDe RSI. Embora você possa ler esta série de artigos e entender os principais conceitos, você também pode sujar as mãos e executar todo o kit de ferramentas de demonstração sozinho. Todo o código está disponível no repositório do Github.
Queremos salvar o último preço de cada moeda no MongoDB, quase em tempo real. Dependendo do provedor de dados da moeda, pode ser de milissegundos a minutos. Nós inserimos os dados à medida que os obtemos do provedor com o seguinte modelo de dados simples:
1 { 2 "time": ISODate("20210701T13:00:01.343"), 3 "symbol": "BTC-USD", 4 "price": 33451.33 5 }
Temos apenas três campos no MongoDB:
time
são as informações de tempo quando as informações do símbolo são recebidas.symbol
é o símbolo da moeda, como "BTC-USD". Pode haver centenas de símbolos diferentes.price
campo é o valor numérico que indica o valor da moeda no momento.
A Coinbase, uma das maiores plataformas de troca de criptomoedas, fornece uma API WebSocket para consumir atualizações de preços de criptomoedas em tempo real. Vamos nos conectar à Coinbase por meio de um WebSocket, recuperar os dados em tempo real e inseri-los no MongoDB. Para aumentar a eficiência das operações de inserção, podemos aplicar inserção em massa.
Embora nossa fonte de dados nesta publicação seja uma troca de criptomoedas, este artigo e o conjunto de ferramentas de demonstração são aplicáveis a qualquer plataforma de troca que tenha informações de tempo, símbolo e preço.
O MongoDB document model oferece muita flexibilidade na forma como você modela dados. Essa flexibilidade é incrivelmente poderosa, mas esse poder precisa ser aproveitado em termos dos padrões de acesso a dados do seu aplicativo; O projeto de esquema no MongoDB tem um impacto significativo no desempenho do seu aplicativo.
O padrão de design de bucketing é um padrão de design do MongoDB que agrupa dados brutos de vários documentos em um documento, em vez de manter documentos separados para cada dado bruto. Portanto, vemos benefícios de desempenho em termos de economia de tamanho de índice e velocidade de leitura/gravação. Além disso, ao agrupar os dados com o agrupamento, facilitamos a organização de grupos específicos de dados, aumentando assim a capacidade de descobrir tendências históricas ou fornecer projeções futuras.
No entanto, antes do MongoDB 5.0, para aproveitar as vantagens do agrupamento, era necessário que o código do aplicativo estivesse ciente do agrupamento e que os engenheiros tomassem decisões de esquema antecipadas conscientes, o que aumentava a sobrecarga no desenvolvimento de soluções eficientes de séries temporais no MongoDB.
As coleções Time Series são um novo tipo de coleção introduzido no MongoDB 5.0. Ele otimiza automaticamente o armazenamento de dados de séries temporais e torna mais fácil, rápido e econômico trabalhar com dados de séries temporais no MongoDB. Há uma excelente postagem no blog que aborda as recém-introduzidas coleções de séries temporais do MongoDB em mais detalhes, que você pode querer ler primeiro ou para obter informações adicionais.
Para nosso caso de uso, criaremos uma coleção de séries temporais da seguinte forma:
1 db.createCollection("ticker", { 2 timeseries: { 3 timeField: "time", 4 metaField: "symbol", 5 }, 6 });
Ao definir a coleção de séries temporais, definimos o
timeField
da coleção de séries temporais como time
e o metaField
da coleção de séries temporais como symbol
. Portanto, os dados de um símbolo específico para um período serão armazenados juntos na coleção de séries temporais.O código do aplicativo fará uma operação de inserção simples, como faz em uma coleção regular:
1 db.ticker.insertOne({ 2 time: ISODate("20210101T01:00:00"), 3 symbol: "BTC-USD", 4 price: 34114.1145, 5 });
Lemos os dados da mesma forma que faria em qualquer outra coleção MongoDB:
1 db.ticker.findOne({"symbol" : "BTC-USD"}) 2 3 { 4 "time": ISODate("20210101T01:00:00"), 5 "symbol": "BTC-USD", 6 "price": 34114.1145, 7 "_id": ObjectId("611ea97417712c55f8d31651") 8 }
No entanto, a otimização de armazenamento subjacente específica para dados de série temporal será feita pelo MongoDB. Por exemplo, "BTC-USD" é uma moeda digital e a cada segundo que você faz uma operação de inserção, parece que está armazenado como um documento separado quando você a consulta. No entanto, o mecanismo de otimização subjacente mantém os dados dos mesmos símbolos juntos para um processamento mais rápido e eficiente. Isso nos permite fornecer automaticamente as vantagens do padrão bucket em termos de economia de tamanho de índice e desempenho de leitura/gravação sem sacrificar a maneira como você trabalha com seus dados.
Já inserimos horas de dados para diferentes moedas. Os dados de uma determinada moeda são armazenados juntos, graças à coleção de séries temporais. Agora é hora de começar a analisar os dados monetários.
Agora, em vez de analisar individualmente os dados de segundo nível, agruparemos os dados em intervalos de cinco minutos e, em seguida, exibiremos os dados em gráficos de velas. Gráficos de velas em análise técnica representam a movimentação de preços durante um período de tempo.
Como exemplo, considere a seguinte velas. Ele representa um intervalo de tempo, por exemplo, cinco minutos entre
20210101-17:30:00
e 20210101-17:35:00
, e é rotulado com a data de início, 20210101-17:30:00.
Ele tem quatro métricas: alta, baixa, abertura e fechamento. Alta é o preço mais alto, baixa é o preço mais baixo, abertura é o primeiro preço e fechamento é o último preço da moeda nessa duração.Em nosso conjunto de dados de moeda, temos que chegar a um estágio em que precisamos agrupar os dados por intervalos de cinco minutos, como:
2021-01-01T01:00:00
, 2021-01-01T01:05:00
, etc. E cada grupo de intervalo precisa ter quatro métricas: preço alto, baixo, aberto e fechado. Exemplos de dados de intervalo são os seguintes:1 [{ 2 "time": ISODate("20210101T01:00:00"), 3 "symbol": "BTC-USD", 4 "open": 34111.12, 5 "close": 34192.23, 6 "high": 34513.28, 7 "low": 33981.17 8 }, 9 { 10 "time": ISODate("20210101T01:05:00"), 11 "symbol": "BTC-USD", 12 "open": 34192.23, 13 "close": 34244.16, 14 "high": 34717.90, 15 "low": 34001.13 16 }]
No entanto, atualmente só temos dados de segundo nível para cada ticker armazenado em nossa coleção Time Series, pois enviamos os dados a cada segundo. Precisamos agrupar os dados, mas como podemos fazer isso?
Além das coleções de séries temporais, o MongoDB 5.0 introduziu um novo operador de agregação,
$dateTrunc
. Esse novo operador de agregação eficiente pode fazer muitas coisas, mas, essencialmente, sua funcionalidade principal é truncar as informações de data para a hora mais próxima ou para uma data específica, considerando os parâmetros fornecidos. Em nosso cenário, queremos agrupar dados de moeda para intervalos de cinco minutos. Portanto, podemos definir os parâmetros do operador$dateTrunc
adequadamente:1 { 2 $dateTrunc: { 3 date: "$time", 4 unit: "minute", 5 binSize: 5 6 } 7 }
Para definir os preços máximos, mínimos, de abertura e fechamento para cada grupo (cada velas), podemos usar outros operadores do MongoDB, que já estavam disponíveis antes do MongoDB 5.0:
Depois de agrupar os dados, precisamos classificá-los por tempo para analisá-los adequadamente. Portanto, os dados recentes (representados por um candlestick) estarão na parte mais à direita do gráfico.
Juntando isso, toda a nossa query de agregação ficará assim:
1 db.ticker.aggregate([ 2 { 3 $match: { 4 symbol: "BTC-USD", 5 }, 6 }, 7 { 8 $group: { 9 _id: { 10 symbol: "$symbol", 11 time: { 12 $dateTrunc: { 13 date: "$time", 14 unit: "minute", 15 binSize: 5 16 }, 17 }, 18 }, 19 high: { $max: "$price" }, 20 low: { $min: "$price" }, 21 open: { $first: "$price" }, 22 close: { $last: "$price" }, 23 }, 24 }, 25 { 26 $sort: { 27 "_id.time": 1, 28 }, 29 }, 30 ]);
Depois de agruparmos os dados com base em intervalos de cinco minutos, podemos visualizá-los em um gráfico de velas da seguinte forma:
Atualmente, estamos usando uma ferramenta de visualização open source para exibir dados agrupados de cinco minutos da moeda BTC-USD. Cada barra no gráfico representa um intervalo de cinco minutos e tem quatro métricas: alta, baixa, abertura e preço de fechamento.
Com a introdução de coleções de séries temporais e operadores avançados de agregação para cálculos de datas, MongoDB 5. O 0 torna a análise de moedas muito mais fácil.
Depois de agrupar os dados para os intervalos selecionados, você pode permitir que o MongoDB remova os dados antigos definindo o parâmetro
expireAfterSeconds
nas opções de collection. Ele removerá automaticamente os dados mais antigos do que o tempo especificado em segundos.Outra opção é arquivar dados brutos em armazenamento frio para análise posterior. Felizmente, oMongoDB Atlas tem capacidade de arquivamento automático para descarregar os dados antigos em um cluster do MongoDB Atlas para o armazenamento de objetos frios, como o armazenamento de objetos na nuvem - Amazon S3 ou Microsoft Azure Blob Storage. Para fazer isso, você pode definir suas regras de arquivamento na coleção de séries temporais e ela descarregará automaticamente os dados antigos para o armazenamento a frio. O Atlas Online Archive estará disponível para coleções de séries temporais muito em breve.
Os dados da moeda já foram colocados nos tópicos do Kafka? Tudo bem. Você pode transferir facilmente os dados nos tópicos do Kafka para o MongoDB por meio do MongoDB Sink Connector for Kafka. Confira este artigo para obter mais detalhes sobre a integração dos tópicos do Kafka e a coleção de séries temporais do MongoDB.
Nas postagens a seguir, discutiremos como indicadores técnicos financeiros conhecidos podem ser calculados por meio de funções de janela em coleções de séries temporais.