# Análisis Estadístico 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 realizado por Mario Llesta Muñoz y Javier Muro Simón. **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, comprobar 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, Shiba 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 personal de Twitter y solicitar después 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 mismos. 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. Repetiremos esta operación 3 veces en tres días distintos para reunir una cantidad de unos 1500 tweets aproximadamente. 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 Una vez analizados 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 fungible que se refiere a un activo digital, es decir, 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. Para este análisis tendremos en cuenta la media del valor de compound de todos los tweets de cada fichero. Esto lo implementamos con las siguientes lineas de código: contador = 0 counter = 0 for tweet in tweets_Procesados: counter = counter + 1 print(tweet) scores = analizador.polarity_scores(tweet) for key in scores: print(key, ': ', scores[key]) print() contador = contador + scores[key] print('Suma total (compound): ', contador) print('Número de tweets analizados: ', counter) print('La ponderación final es: ', (contador/counter)) De este modo vemos que puntuación se obtiene con cada moneda y con los NFTs: BTC: Suma total (compound): 222.10950000000017 Número de tweets analizados: 1464 La ponderación final es: 0.15171413934426242 ETH: Suma total (compound): 462.38009999999974 Número de tweets analizados: 1442 La ponderación final es: 0.3206519417475726 SHIBA: Suma total (compound): 347.77909999999923 Número de tweets analizados: 1475 La ponderación final es: 0.23578244067796558 NFT: Suma total (compound): 427.33700000000033 Número de tweets analizados: 1479 La ponderación final es: 0.28893644354293463 Una vez realizado el análisis de sentimientos, vemos que de las monedas estudiadas, Ethereum es la moneda con mayor adopción en el mercado por lo inversores ya que se puede ver que es la que obtiene una puntuación más positiva. Esto se puede deber a lo explicado anteriormente, su alta rentabilidad y crecimiento de proyecto hace que sea una moneda con mucho futuro. Por otro lado se encuentra Shiba, una moneda que ha dado mucha rentabilidad a mucha gente pero ha hecho perder mucho dinero a otra. Por lo que si hiciéramos el análisis de sentimientos en un par de meses, el análisis resultaría totalmente diferente ya que al ser una moneda muy volátil su precio cambia muy rápido. En cambio, Bitcoin, nos ha sorprendido ya que en el análisis de sentimientos es la moneda con menor positivismo. Esto tiene una razón y es que en los días en los que se han extraído los tweets, Bitcoin ha sufrido una gran bajada de su valor. Entonces, el mercado se encuentra en una temporada de miedo e incertidumbre. En la siguiente imagen mostramos un indicador de miedo y codicia que hay actualmente en Bitcoin: > ![Image text](indicador.png) Como se puede ver, nos encontramos en una situación de miedo en el mercado y pude ser una de las razones más importantes de los resultados obtenidos en el análisis. Por último y como era de esperar podemos ver el positivismo que se ha adoptado en el mercado con los NFTs ya que este año se han dado a conocer de una forma masiva y se preveé que siga haciendolo en el futuro. Como resumen , hemos recogido y procesado los datos de los tres días estudiados en Excel tres gráficas. En la primera se recoge la popularidad (número de apariciones) en relación a los 1500 tweets: > ![Image text](analisisPopularidad.png) En la segunda, el sentimiento producido: > ![Image text](analisisSentimiento.png) Por último, se recoge en una última gráfica el producto entre popularidad y sentimiento: > ![Image text](popularidadxsentimiento.png) **CONCLUSION** Teniendo en cuenta que Twitter no es una fuente fiable, aun así podemos concluir que puede ser útil para conocer la opinión de la gente en el mundo Crypto. Esto es muy importante ya que al fin y al cabo las gráficas y la capitalización de mercado de mercado aumentan cuanto mayor positivismo haya en el mercado ya que generará más confianza en los inversores y hará que estos inviertan de forma más continua. Nosotros hemos utilizado Twitter para ver esas opiniones y sentimientos en el mercado y hemos llegado a una conclusión, como era de esperar de que existe una correlación entre la situación anímica de una cryptomoneda por los inversores y la situación real en la que se encuentra. Esto se puede ver en Ethereum ya que ha hecho una buena hoja de ruta en 2021 y seguramente lo siga haciendo en 2022 y por el contrario, Bitcoin, que aunque nuestra opinión personal es que va a llegar a un nuevo máximo histórico no dentro de mucho, actualmente se encuentra en un periodo de duda e incertidumbre. **BIBLIOGRAFIA** Se adjunta la bibliografía que se ha utilizado principalmente para el desarrollo del proyecto. - [Análisis de sentimientos](https://www.arsys.es/blog/analisis-sentimientos-python-jupyter-notebooks) (Para el código en Python) - Prácticas de REST APIs de la asignatura (Para el código en Java)