Commit 89af3e63 authored by MARIO LLESTA MUÑOZ's avatar MARIO LLESTA MUÑOZ
Browse files

Update README.md

parent 56cc5d4d
# AnalisisEstadisticoDeCryptomonedas
# Analisis Estadistico De Cryptomonedas
Aplicación de análisis de valor e importancia de Cryptomonedas en base al estudio de un análisis de sentimientos de Tweets relacionados con las mismas.
**OBJETIVO DEL TRABAJO**
La finalidad del trabajo es buscar una cantidad grande de tweets (1500 aproximadamente) con la palabra clave "crypto" y ver cuántas veces se nombran ciertas monedas en dichos tweets, para a continuación extraer tweets de cada cryptomoneda y hacer un análisis de sentimientos.
De este modo, viendo el estado actual de mercado de cada moneda y los resultados obtenidos del análisis de sentimientos, comprobarr si realmente se corresponde con su valor actual los sentimientos que produce cada moneda y además, ver la correlación que existe con las veces que se nombran en los tweets (marketing) y su capitalización de mercado.
**ESQUEMA DEL TRABAJO**
El proyecto ha sido desarrollado utilizando Java y Python.
1. Obtención de los Tweets con la palabra clave "crypto" y almacenamiento en un fichero .txt [Java]
2. Conteo del número de veces que aparecen las monedas Bitcoin, Ethereum, Shib y los NFT (que no son monedas) [Java]
3. Obtención de Tweets relacionados con cada moneda y almacenamiento en un fichero .txt [Java]
4. Análisis de sentimientos de cada fichero. [Python]
5. Estudio estadístico de resultados.
**DESCRIPCIÓN DEL TRABAJO**
Lo primero de todo es pedir los tweets a la API de Twitter. Para ello, hay que tener una cuenta de Twitter y solicitar una cuenta de desarrollador (Twitter Developers).
Una vez tenemos la cuenta de desarrollador hay que generar los tokens. Para ello, se crea un proyecto y de una manera sencilla se obtienen los tokens.
Para acceder a la información necesaria sobre la API de Twitter, se puede consultar el siguiente enlace [link](https://developer.twitter.com/en/docs/twitter-api).
NOTA: Dado que se adjunta en el proyecto todos los ficheros necesarios para su ejecución, no se va a mostrar aquí todo el código utilizado. Simplemente se hará referencia a aquellos aspectos importantes que merezca la pena destacar acerca del código.
Una vez tenemos los tokens y siguiendo las prácticas de Twitter de la asignatura, diseñamos el código necesario para poder pedir unos 450 tweets aproximadamente en relación a una palabra clave y almacernarlos en un fichero .txt.
public static void main(String args[]) throws IOException, InterruptedException {
try {
Search search = null;
TwitterCrawler tc = new TwitterCrawler(450, "shib");
tc.requestTweets();
System.out.println("llamada terminada");
synchronized (tc.wait_inner) {
tc.tweet_list_total.forEach(t -> System.out.println(t.text));
System.out.println("Guardando Tweets");
File f1 = new File("CryptoTweets_procesados_con_emojis_procesados.txt");
File f2 = new File("SHIBDia02.txt");
PrintWriter pr1 = new PrintWriter(f1);
PrintWriter pr2 = new PrintWriter(f2);
tc.tweet_list_total.forEach(t ->
{
String noBreaksTweet = t.text.replace("\n", "").replace("\r", "");
String noBreaksParsedEmojis = EmojiParser.parseToAliases(noBreaksTweet);
String noBreaksNoEmojisTweet = EmojiParser.removeAllEmojis(noBreaksTweet);
pr1.println(t.created_at + " ||| " + t.user.screen_name + " ||| " + noBreaksParsedEmojis);
pr2.println(t.created_at + " ||| " + t.user.screen_name + " ||| " + noBreaksNoEmojisTweet);
});
System.out.println("Tweets procesados con emojis guardados en " + f1.getAbsolutePath());
System.out.println("Tweets procesados sin emojis guardados en " + f2.getAbsolutePath());
pr1.flush();
pr2.flush();
pr1.close();
pr2.close();
}
//Unirest.shutDown();
} catch (UnirestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // Main end
NOTA: se adjunta el main donde se puede ver el proceso final de obtención de tweets y almacenamiento en dos ficheros .txt (uno donde los tweets son procesados con emojis y otro donde no).
A continuación hicimos el diseño de una función que contase las palabras en relación a las cryptomonedas que queríamos analizar. Notar que analizar tweets no es lo mismo que analizar frases bien hechas y por tanto encontrar determinadas palabras resulta más complicado ya que se combinan con ciertos caracteres o incluso se escriben mal. A pesar de ello, la función diseñada permite encontrar de una manera bastante aceptable las palabras que se persiguen encontrar.
Además, hay que destacar que el trabajo se realiza mediante tweets posteados por persona, lo cual supone que la fuente utilizada no sea objetiva. Simplemente se busca la relación entre las opiniones de la gente y los datos reales.
El código es el siguiente:
import java.io.*;
public class WordCounter {
public static void main(String[] args) throws IOException {
File fichero = new File ("C:/Users/mlles/eclipse-workspace/cryptanalysis/dia02Crypto.txt");
String[] words=null;
String[] words2=null;
FileReader fr = new FileReader(fichero); //Creation of File Reader object
BufferedReader br = new BufferedReader(fr); //Creation of BufferedReader object
String s;
String inputBTC="btc";
String inputBTC2="BTC";
String inputBTC3="#btc";
String inputBTC4="#BTC";
String inputBTC5="Bitcoin";
String inputBTC6="#Bitcoin";
String inputBTC7="$btc";
String inputETH="eth";
String inputETH2="ETH";
String inputETH3="#eth";
String inputETH4="#ETH";
String inputETH5="Ethereum";
String inputETH6="#Ethereum";
String inputETH7="$ETH";
String inputSHIB="shib";
String inputSHIB2="shiba";
String inputSHIB3="#shib";
String inputSHIB4="#SHIB";
String inputSHIB5="#shiba";
String inputSHIB6="#Shibainu";
String inputSHIB7="Shiba";
String inputNFT = "nft";
String inputNFT2 = "#nft";
String inputNFT3 = "NFT";
String inputNFT4 = "#NFT";
String inputNFT5 = "NFTs";
String inputNFT6 = "#NFTs";
// Input word to be searched
int count = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
while((s=br.readLine())!=null){
words=s.split(" "); //Split the word using space
// ||word.equals(input2)|| word.equals(input3)
for (String word : words) {
if ((word.equals(inputBTC)) || (word.equals(inputBTC2)) || (word.equals(inputBTC3))
|| (word.equals(inputBTC4)) || (word.equals(inputBTC5)) || (word.equals(inputBTC6))
|| (word.equals(inputBTC7)))
{
count++; //If Present increase the count by one
}
}
for (String word : words) {
if ((word.equals(inputETH)) || (word.equals(inputETH2)) || (word.equals(inputETH3))
|| (word.equals(inputETH4)) || (word.equals(inputETH5)) || (word.equals(inputETH6))
|| (word.equals(inputETH7)))
{
count2++; //If Present increase the count by one
}
}
for (String word : words) {
if ((word.equals(inputNFT)) || (word.equals(inputNFT2))
|| (word.equals(inputNFT3)) || (word.equals(inputNFT4))
|| (word.equals(inputNFT5)) || (word.equals(inputNFT6))){
count3++; //If Present increase the count by one
}
}
for (String word : words) {
if ((word.equals(inputSHIB)) || (word.equals(inputSHIB2)) || (word.equals(inputSHIB3))
|| (word.equals(inputSHIB4)) || (word.equals(inputSHIB5)) || (word.equals(inputSHIB6))
|| (word.equals(inputSHIB7)))
{
count4++; //If Present increase the count by one
}
}
}
if(count!=0) //Check for count not equal to zero
{
System.out.println(inputBTC + " is present for "+count+ " Times in the file");
}
else
{
System.out.println("The given word is not present in the file");
}
fr.close();
if(count2!=0) //Check for count not equal to zero
{
System.out.println(inputETH + " is present for "+count2+ " Times in the file");
}
else
{
System.out.println("The given word is not present in the file");
}
fr.close();
if(count3!=0) //Check for count not equal to zero
{
System.out.println(inputNFT + " is present for "+count3+ " Times in the file");
}
else
{
System.out.println("The given word is not present in the file");
}
if(count4!=0) //Check for count not equal to zero
{
System.out.println(inputSHIB + " is present for "+count4+ " Times in the file");
}
else
{
System.out.println("The given word is not present in the file");
}
fr.close();
}
}
Notar que si se quisiese probar este código con otro fichero simplemente habría que cambiar el PATH de la variable "fichero" y después indicar qué palabras se desean buscar.
Tras analizar el fichero se obtiene el siguiente conteo:
btc is present for 38 Times in the file
eth is present for 68 Times in the file
nft is present for 144 Times in the file
shib is present for 19 Times in the file
Tras analizar los resultados, vemos que la moneda más nombrada es Ethereum, seguida de Bitcoin y de Shiba. Resulta sorprendente que a pesar de que Bitcoin es la moneda más conocida y fiable del mercado no se nombre demasiado en comparación con Ethereum que casi duplica su presencia en los tweets.
Esto se puede deber a dos razones. En primer lugar, Ethereum es la segunda mejor moneda del mercado y actualmente tiene muchísima proyección de crecimiento con un valor actual de mercado de 3750 dólares, empezando el año con un valor aproximado de 800 dólares, lo cual supone un crecimiento de casi 5 veces su valor. En segundo lugar, en el momento en el que se han obtenido los tweets (30 de diciembre de 2021, 1 de enero de 2022 y 2 de enero de 2022) Bitcoin ha sufrido una gran bajada y se enconcuentra en un mercado con "miedo" mientras que Ethereum a pesar de haber tenido una bajada también, esta no ha sido tan grande como la de Bitcoin.
Por otro lado tenemos la moneda Shiba, realmente es una moneda sin fundamentales, con poca utilidad a día de hoy (conocida como una memecoin) pero que se mantiene con una capitalización muy alta gracias a su comunidad y a la gran cantidad de marketing que tiene. Es una moneda de la que se habla poco en determinadas temporadas, pero al ser tan volátil tiene periodos en los que sube su valor de golpe y por lo tanto se genera mucho FOMO. En este caso lleva lateralizando sobre el precio 0.000033 dólares y por lo tanto no se habla demasiado sobre ella.
Por último nos ha parecido interesante cuantas veces se repite la palabra NFT. NFT es un token no fingible que se refiere a un activo digital, que no puede consumirse ni sustituirse. Estos NFTs han incrementado su popularidad en este año de una forma considerable ya sea por su popularidad en diversos videojuegos o por coleccionistas que los ven con un gran potencial de crecimiento. Como tal no es una moneda pero nos ha parecido de interés analizar su auge y podemos observar en el análisis, es la palabra más repetida en relación a cryptomonedas y por tanto es lo que más atención genera en este mercado actualmente.
El siguiente paso es obtener un fichero para cada una de las monedas y para las NFTs con unos 1500 tweets (obtenidos en los mismos días mencionados anteriormente) y realizar un análisis de sentimientos de los mismos.
Para realizar el análisis de sentimientos se ha utilizado el fichero .ipynb adjuntado. Notar que en caso de querer analizar un fichero de texto distintinto, simplemente se tendría que modificar la línea de código donde se especifica el PATH del fichero a analizar con el PATH donde se encuentre el fichero que se desea analizar.
La funcionalidad básica del código es la siguiente:
1. Se carga el fichero .txt (en codificación UTF-8)
2. Se le realiza un procesado para eliminar los máximos caracteres extraños posibles como "@", "#", etc que puedan influir en el análisis del texto
3. Se realiza el análisis de sentimiento del texto procesado linea a linea (cada linea corresponde a un tweet).
Se obtendrán los siguientes 4 resultados de cada tweet:
**neg** (negativa): es un valor entre cero y uno, para decirnos lo negativa que sería esta frase.
**neu** (neutral): este segundo valor nos indica la neutralidad de una frase, también en una puntuación entre cero y uno.
**pos** (positiva): igualmente que los anteriores, pero indicando lo positiva que encuentra una frase.
**compound**: este es un valor entre -1 y 1 que viene a indicar de una única vez si la frase es positiva o negativa. Valores próximos a -1 indican que es muy negativa, próximos a cero indicarían que es neutra y próximos a 1 sería muy positiva. La salida para nuestro programa nos ofrecerá estas puntuaciones.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment