Analisando sentimento do mercado de cripto através do Twitter.

Como a Heimdall desenvolveu uma inteligência artificial para identificar e classificar sentimento no mercado de cripto.

Anthony Bet
Heimdall Research Brasil

--

Nossos crawlers recebem diariamente mais de setecentos mil tweets relacionados ao mercado de cripto, isso representa uma quantidade imensa de informação, que se bem explorada pode nos mostrar informações valiosas. Hoje o Twitter possui cerca de trezentos milhões de contas ativas, onde usuários compartilham suas expectativas, desejos e frustrações do dia a dia, isso também vale para os usuários que movimentam criptomoedas.

Classificar sentimento a partir de textos é uma situação particular de um problema mais geral do Processamento de Linguagem Natural (NLP). Nosso objetivo consiste em criar um sistema capaz de analisar textos provenientes de tweets escritos em Inglês e classificar tais tweets em três categorias de sentimento, sendo eles: positivo, neutro, negativo.

O uso de tweets torna o projeto mais desafiador, pois o tipo de textos que encontramos no Twitter são repletos de gírias, erros de grafia e emojis, e muitos dos tweets expressam mais de um sentimento. Além disso, há uma grande quantidade de bots muito ativos cujos tweets são extremamente repetitivos, isso pode arruinar os dados de treino.

Para lidar com estes problemas nós tivemos que criar um banco de treino do zero, pois os dados já classificados que encontramos não se adequaram às nossas necessidades. Para criarmos esse banco de tweets nós primeiro definimos o que cada sentimento representa. Sentimento negativo deve representar tweets que expressam oposição (pessimismo, bearish) com relação a algum projeto ou item. Exemplos de tweets que desejamos classificar como negativos.

  • If rumours are true, if you’re in $BAND protocol then get the frig out right now.
  • @JJcycles @LilMoonLambo Another leg down lol $link
  • @udiWertheimer Don’t be jelous because BTC is boring lol
  • This is the one time I want $BTC to actually crap itself downwards about $1,000. So many Short opportunities :x Dare I say it, down we go please.

Já os Tweets Positivos são o oposto, representando expectativa favorável a algum item. Exemplos de tweets que desejamos classificar como Positivos:

  • So I bought a bitcoin yesterday. Almost 1K in 1 day aint bad lol https://t.co/Niv3IVbtEE
  • @benbuiz Got my ticket already and my bag is full of $UTK
  • hehe my bitcoin making me money 🥺✨✨👉🏼👈🏼💰💰💰
  • It’s Friday and I’m very happy and I’m bout to load up on some BTC you know the vibes.
  • @BrukeFasil Yerp $VET, $XLM, $XRP, $XTZ for the long hodl

Sentimento Neutro. Representa simplesmente os tweets que não possuem um sentimento explícito que possa se encaixar nas demais classes. Exemplos de tweets neutros:

  • The latest The Bitcoin Daily! paper.li/f-1508960225?e… #bitcoin #blockchain
  • Bitcoin Block Generation Speed Falls to 2017 Lows whatsgoon.com/tech/technolog…
  • Man, I could literally just retweet every single thing on my bitcoin twitter follow list today.
  • Synapse is 85% complete! Phore synapse update is here. medium.com/@phoreblockcha… $PHR #Phore #BTC
  • $XLM is now worth $0.0581 (-0.09%) and 0.00000664 BTC (-0.30%) #XLM ➡️ coinvalue.xyz/coin/xlm/

Talvez você discorde da neutralidade de alguns destes tweets, como o segundo por exemplo, mas é importante ter em mente que queremos identificar o sentimento genuíno de usuários, e no fim das contas tweets como noticias estarão comunicando fatos que nós já sabemos.

Após decidir o significado de cada classe de sentimento retiramos uma amostra de nosso banco de dados para ser classificada pelo nosso time.

Cada tweet foi classificado por três pessoas para melhorar a consistência dos resultados. No processo de retirar a amostra do banco nós eliminamos tweets dos 500 usuários mais ativos, pois notamos que grande parte dos mesmos eram bots. Além disso nós restringimos os tweets de treino para tweets “pequenos”, aqueles com menos de 150 caracteres, dado que é muito mais difícil identificar um único sentimento em tweets muito grandes, e de acordo com nossos dados estes tweets “pequenos” representam metade dos tweets totais publicados. Aqui estamos assumindo que observar tweets “pequenos” é suficiente para para identificar o sentimento geral do mercado. Ao todo nós conseguimos classificar milhares de tweets, destes: 10% pertencendo à classe de sentimento negativo, 20 % à de sentimento positivo e 70% à de sentimento neutro. Esses números mostram um grande desequilíbrio entre as classes.

Tendo isso em mãos foi possível identificar os principais desafios a serem resolvidos, sendo eles a estrutura de texto, o número de classes e o desequilíbrio nas quantidades de dados entre as classes.

Explorando os Dados

Nosso primeiro passo foi observar quais palavras eram mais frequentes em cada classe, isso nos permite de antemão observar se há uma distinção entre os conjuntos de dados, e nos dá um norte para extração de features do texto. Para isso geramos nuvens de palavras para cada classe a partir dos dados de treino. Um pré-processamento foi feito nos dados para retirar termos de retweet, usuários, corretoras e símbolos de moedas. Este é o resultado final:

Vemos que os termos mais frequentes associados ao sentimento negativo incluem dump, sell, down, short, scam, bearish, crash. Enquanto os termos mais comuns associados ao sentimento positivo são buy, bullish, pump, moon, good, long, buying.

Já esperávamos que estes termos estivesses associados a estes sentimentos, e o que queremos agora é criar relações mais complexas com os dados, usando um sistema que vá além de um contador de palavras.

Limpeza textual

O segundo passo foi realizar a limpeza e regularização do texto. Este passo é essencial para revelar os padrões que queremos encontrar com os modelos de aprendizado.

A primeira parte da limpeza é construida da seguinte forma:

  • Retirada de indicador de retweet: ‘RT @username’;
  • Substituir ‘@username’ por uma tag, que chamamos de ‘usertag’;
  • Minimizar todas as letras;
  • Substituir links pela tag ‘linktag’;

A segunda parte da limpeza consiste em substituir números, indicadores de quantidade monetárias (ex: $500,00), símbolos e nomes de moedas fiduciárias e de cripto, e corretoras por tags:

  • Números e quantidade monetárias →numbertag;
  • Corretoras (ex: Binance, Binfinity, Birake…) →corretag;
  • Símbolos fiduciários (ex: USD, BRL) → fiatag;

A terceira parte da limpeza está relacionada a expansão de contrações da língua inglesa, e.g. ain’t, aren’t e o uso de emojis, stopwords e pontuações. Para lidar com as contrações construímos um dicionário simples mapeando contrações e expansões. Nós escolhemos manter os emojis no texto com base na hipótese de que emojis são formas comuns de expressar sentimentos em redes sociais, isso foi feito através da biblioteca emoji, com ela nós substituímos cada emoji por seu respectivo nome seguido da palavra ‘tag’, por exemplo temos a seguinte transformação:

👍 →(thumbsup + tag) → ‘thumbsuptag’.

Para lidar com stopwords e pontuações nós adotamos uma abordagem diferente. Transformando conjuntos de stopwords e conjuntos de pontuações permitidas em parâmetros do nosso modelo, foi possível testar qual combinação resultaria no melhor desempenho. A combinação escolhida foi tal que não fez uso de stopwords e excluiu todas as pontuações e símbolos, ou seja, nosso modelo de limpeza mantém todas as stopwords mas retira do texto todos os símbolos de pontuação.

Para finalizar a limpeza aplicamos lemmatização nas palavras, utilizando a biblioteca Spacy. Perceba que a lemmatização faz surgir o termo -PRON- que significa pronome.

Vejamos um exemplos utilizando alguns dos tweets apresentados anteriormente:

Extração de Features

Nossos dados são formados por texto, então precisamos de uma ferramenta para transformar o texto em um estrutura numérica, preservando as informações importantes do texto para que possamos aplicar os modelos de machine learning. A técnica que decidimos utilizar é a TF-IDF (Term Frequency-Inverse Document Frequency) que cria um vocabulário a partir dos n-gramas contidos nos dados e calcula a frequência e importância de cada um desses termos. Para implementar este modelo utilizamos o módulo TfidfVectorizer do Scikit-learn.

Os parâmetros do TfidfVectorizer que controlam n-gramas, frequência máxima e frequência mínima de palavras foram otimizados junto com os modelos escolhidos.

Seleção de Modelo

Ao todos nós testamos e comparamos quatro modelos, sendo eles Random Forest, multinomial Naive Bayes, multinomial Logistic Regression, Xgboost. A métrica que utilizamos para otimizar para esses modelos foi o recall, isso significa que queremos maximizar os verdadeiros positivos e minimizar os falsos negativos durante a classificação, com isso queremos maximizar a quantidade de tweets de uma classe classificados corretamente, a penalidade é que vamos acabar aumentando o numero de falsos positivos para esta classe.

Dos modelos treinados os que melhor se adaptaram ao nosso problema foram Logistic Regression e Xgboost, vejamos o desempenho de cada um deles:

Regressão Logística:

  • Accuracy: 0.798
  • Precision: 0.789
  • Recall: 0.798
  • F1: 0.788

Xgboost:

  • Accuracy: 0.818
  • Precision: 0.808
  • Recall: 0.818
  • F1: 0.804

Estas matrizes de confusão estão normalizadas pela predição, i.e, para uma dada predição (coluna) o valor mostrado indicará a proporção de instâncias que foram classificadas como tal, por exemplo, olhando para a primeira coluna da matriz do Xgboost vemos que dos tweets classificados como negativos 8% são na verdade positivos, 1.9% neutros e 75% são de fato negativos.

Ao comprarmos os dois modelos vemos que a regressão logística consegue um resultado um pouco melhor na classe positiva, no entanto o modelo Xgboost apresenta resultados melhores em todas as outras classes, e de forma geral se sai melhor, principalmente se olharmos para as métricas accuracy, precision, recall e F1 score, onde o Xgboost se saiu melhor em todas.

Depois de todas essas considerações decidimos utilizar o Xgboost como modelo final para classificar o sentimento dos tweets.

Produto Final

O sentimento que você pode analisar em nosso dashboard é construido pela agregação do sentimento de cada moeda a cada 30 minutos, i.e. a cada 30 minutos nós calculamos a proporção de tweets positivos e negativos para cada moeda ao longo dos últimos 30 minutos.

Preço do Bitcoin entre julho de 2020 e janeiro de 2021. A linhas verde e vermelha indicam porcentagem de tweets positivos e negativos respectivamente. A agregação de sentimento e preço aqui é por dia.

Você pode conferir evolução temporal do sentimento de seu projeto preferido em nossa plataforma heimadall.land.

--

--