README.md 17.2 KB
Newer Older
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
1
# Análisis Estadístico De Cryptomonedas
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
2

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
3
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
4
5
6
7
8

**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. 

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
9
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
10
11
12
13
14
15
16


**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]
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
17
2. Conteo del número de veces que aparecen las monedas Bitcoin, Ethereum, Shiba y los NFT (que no son monedas)       [Java]
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
18
19
20
21
22
23
24
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**

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
25
26
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
27
28
29
30
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.

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
31
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242


    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


MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
243
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. 
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
265

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
266
**neu** (neutral): este segundo valor nos indica la neutralidad de una frase, también en una puntuación entre cero y uno.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
267

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
268
**pos** (positiva): igualmente que los anteriores, pero indicando lo positiva que encuentra una frase.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
269

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
270
271
**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.

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
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.

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
317
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: 
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
318

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
319
> ![Image text](indicador.png)
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
320
321


MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
322
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
323

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
324
325
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.

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
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)

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
342
343
344
345


**CONCLUSION**

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
346
347
348
349
350
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. 
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
351

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
352
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.
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
353

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
354
355
356



MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
357
358
359
360
**BIBLIOGRAFIA**

Se adjunta la bibliografía que se ha utilizado principalmente para el desarrollo del proyecto.

MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
361
362
- [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)
MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
363
364
365



MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385




















MARIO LLESTA MUÑOZ's avatar
MARIO LLESTA MUÑOZ committed
386