VicGerardoPR commited on
Commit
275417a
·
verified ·
1 Parent(s): 8335add

Upload 4 files

Browse files
Files changed (4) hide show
  1. README.md +37 -13
  2. Spacefile +3 -0
  3. app.py +339 -0
  4. requirements.txt +7 -0
README.md CHANGED
@@ -1,13 +1,37 @@
1
- ---
2
- title: TraderApp
3
- emoji: 📚
4
- colorFrom: red
5
- colorTo: green
6
- sdk: streamlit
7
- sdk_version: 1.44.1
8
- app_file: app.py
9
- pinned: false
10
- short_description: Upload an chart image and receive tech analisis
11
- ---
12
-
13
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Trader Técnico Experto - Aplicación Streamlit
2
+
3
+ Esta aplicación de Streamlit analiza gráficos de activos financieros y proporciona recomendaciones de trading a corto y largo plazo.
4
+
5
+ ## Características
6
+
7
+ - Carga y visualización de imágenes de gráficos
8
+ - Detección de tendencias (alcista, bajista, neutral)
9
+ - Identificación de patrones de velas japonesas
10
+ - Detección de niveles de soporte y resistencia
11
+ - Generación de recomendaciones a corto y largo plazo
12
+ - Visualización del análisis técnico con anotaciones
13
+
14
+ ## Cómo usar
15
+
16
+ 1. Sube una imagen de un gráfico de cualquier activo financiero
17
+ 2. La aplicación analizará automáticamente la tendencia, patrones y niveles clave
18
+ 3. Recibe recomendaciones de trading a corto y largo plazo
19
+
20
+ ## Instalación local
21
+
22
+ ```bash
23
+ pip install -r requirements.txt
24
+ streamlit run app.py
25
+ ```
26
+
27
+ ## Tecnologías utilizadas
28
+
29
+ - Streamlit para la interfaz de usuario
30
+ - OpenCV y Pillow para procesamiento de imágenes
31
+ - Matplotlib para visualización
32
+ - Scikit-learn para análisis de datos
33
+ - Pandas y NumPy para manipulación de datos
34
+
35
+ ## Disclaimer
36
+
37
+ Este análisis es generado automáticamente y tiene fines educativos. No constituye asesoramiento financiero. Realice su propia investigación antes de tomar decisiones de inversión.
Spacefile ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ sdk: streamlit
2
+ sdk_version: 1.44.1
3
+ app_file: app.py
app.py ADDED
@@ -0,0 +1,339 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import cv2
3
+ import numpy as np
4
+ import matplotlib.pyplot as plt
5
+ from PIL import Image
6
+ import io
7
+ import os
8
+ from datetime import datetime
9
+ import pandas as pd
10
+ from sklearn.linear_model import LinearRegression
11
+
12
+ # Configuración de la página
13
+ st.set_page_config(
14
+ page_title="Análisis Técnico de Trading",
15
+ page_icon="📈",
16
+ layout="wide"
17
+ )
18
+
19
+ # Título y descripción
20
+ st.title("Análisis Técnico de Trading")
21
+ st.markdown("""
22
+ Esta aplicación analiza gráficos de activos financieros y proporciona recomendaciones de trading.
23
+ Sube una imagen de un gráfico y obtén un análisis técnico junto con recomendaciones a corto y largo plazo.
24
+ """)
25
+
26
+ # Función para cargar y procesar la imagen
27
+ def load_and_process_image(uploaded_file):
28
+ if uploaded_file is not None:
29
+ # Leer la imagen
30
+ image = Image.open(uploaded_file)
31
+ img_array = np.array(image)
32
+
33
+ # Convertir a escala de grises para procesamiento
34
+ gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) if len(img_array.shape) > 2 else img_array
35
+
36
+ return image, img_array, gray
37
+ return None, None, None
38
+
39
+ # Función para detectar tendencias en el gráfico
40
+ def detect_trend(img_array, gray):
41
+ # Detectar bordes
42
+ edges = cv2.Canny(gray, 50, 150, apertureSize=3)
43
+
44
+ # Detectar líneas usando la transformada de Hough
45
+ lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)
46
+
47
+ # Analizar pendientes de las líneas para determinar tendencia
48
+ slopes = []
49
+ if lines is not None:
50
+ for line in lines:
51
+ x1, y1, x2, y2 = line[0]
52
+ if x2 != x1: # Evitar división por cero
53
+ slope = (y2 - y1) / (x2 - x1)
54
+ slopes.append(slope)
55
+
56
+ # Determinar tendencia basada en pendientes
57
+ if not slopes:
58
+ return "Neutral", 0
59
+
60
+ avg_slope = np.mean(slopes)
61
+
62
+ # En gráficos, y aumenta hacia abajo, por lo que pendiente negativa = tendencia alcista
63
+ if avg_slope < -0.1:
64
+ strength = min(abs(avg_slope) * 10, 10)
65
+ return "Alcista", strength
66
+ elif avg_slope > 0.1:
67
+ strength = min(abs(avg_slope) * 10, 10)
68
+ return "Bajista", strength
69
+ else:
70
+ return "Neutral", min(abs(avg_slope) * 20, 5)
71
+
72
+ # Función para detectar patrones de velas
73
+ def detect_candlestick_patterns(img_array):
74
+ # Simulación de detección de patrones
75
+ # En una implementación real, se utilizaría un modelo entrenado para reconocer patrones
76
+
77
+ # Detectar colores predominantes (verde/rojo)
78
+ hsv = cv2.cvtColor(img_array, cv2.COLOR_RGB2HSV)
79
+
80
+ # Máscara para color verde (velas alcistas)
81
+ lower_green = np.array([40, 40, 40])
82
+ upper_green = np.array([80, 255, 255])
83
+ green_mask = cv2.inRange(hsv, lower_green, upper_green)
84
+ green_count = np.sum(green_mask > 0)
85
+
86
+ # Máscara para color rojo (velas bajistas)
87
+ lower_red1 = np.array([0, 50, 50])
88
+ upper_red1 = np.array([10, 255, 255])
89
+ lower_red2 = np.array([170, 50, 50])
90
+ upper_red2 = np.array([180, 255, 255])
91
+ red_mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
92
+ red_mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
93
+ red_mask = red_mask1 + red_mask2
94
+ red_count = np.sum(red_mask > 0)
95
+
96
+ patterns = []
97
+
98
+ # Determinar patrones basados en colores predominantes
99
+ if green_count > red_count * 1.5:
100
+ patterns.append("Posible patrón de velas alcistas")
101
+ if np.random.random() > 0.5: # Simulación
102
+ patterns.append("Posible Martillo Alcista")
103
+ elif red_count > green_count * 1.5:
104
+ patterns.append("Posible patrón de velas bajistas")
105
+ if np.random.random() > 0.5: # Simulación
106
+ patterns.append("Posible Estrella Fugaz")
107
+ else:
108
+ patterns.append("Patrón de velas mixto o indeciso")
109
+ if np.random.random() > 0.7: # Simulación
110
+ patterns.append("Posible Doji")
111
+
112
+ return patterns
113
+
114
+ # Función para detectar soportes y resistencias
115
+ def detect_support_resistance(gray):
116
+ # Simulación de detección de soportes y resistencias
117
+ # En una implementación real, se utilizaría análisis de histograma o detección de líneas horizontales
118
+
119
+ # Proyección horizontal (suma de píxeles por fila)
120
+ h_projection = np.sum(gray, axis=1)
121
+
122
+ # Normalizar
123
+ h_projection = h_projection / np.max(h_projection)
124
+
125
+ # Encontrar picos (posibles soportes/resistencias)
126
+ peaks = []
127
+ for i in range(1, len(h_projection) - 1):
128
+ if h_projection[i] > h_projection[i-1] and h_projection[i] > h_projection[i+1] and h_projection[i] > 0.7:
129
+ peaks.append((i, h_projection[i]))
130
+
131
+ # Ordenar por intensidad
132
+ peaks.sort(key=lambda x: x[1], reverse=True)
133
+
134
+ # Tomar los 3 picos más fuertes
135
+ top_peaks = peaks[:min(3, len(peaks))]
136
+
137
+ # Convertir a niveles de soporte/resistencia
138
+ levels = []
139
+ height = gray.shape[0]
140
+
141
+ for peak in top_peaks:
142
+ y_pos = peak[0]
143
+ # En gráficos, la parte superior es resistencia, la parte inferior es soporte
144
+ if y_pos < height / 2:
145
+ levels.append(("Resistencia", y_pos / height))
146
+ else:
147
+ levels.append(("Soporte", y_pos / height))
148
+
149
+ return levels
150
+
151
+ # Función para generar recomendaciones
152
+ def generate_recommendations(trend, trend_strength, patterns, support_resistance):
153
+ recommendations = {
154
+ "corto_plazo": "",
155
+ "largo_plazo": "",
156
+ "niveles_clave": [],
157
+ "confianza_corto": 0,
158
+ "confianza_largo": 0
159
+ }
160
+
161
+ # Recomendación a corto plazo basada en tendencia y patrones
162
+ if trend == "Alcista":
163
+ if trend_strength > 7:
164
+ recommendations["corto_plazo"] = "Comprar con stop loss ajustado"
165
+ recommendations["confianza_corto"] = min(trend_strength * 0.9, 9)
166
+ elif trend_strength > 4:
167
+ recommendations["corto_plazo"] = "Comprar en retrocesos"
168
+ recommendations["confianza_corto"] = trend_strength * 0.8
169
+ else:
170
+ recommendations["corto_plazo"] = "Comprar con precaución"
171
+ recommendations["confianza_corto"] = trend_strength * 0.7
172
+
173
+ elif trend == "Bajista":
174
+ if trend_strength > 7:
175
+ recommendations["corto_plazo"] = "Vender o abrir cortos"
176
+ recommendations["confianza_corto"] = min(trend_strength * 0.9, 9)
177
+ elif trend_strength > 4:
178
+ recommendations["corto_plazo"] = "Vender rebotes"
179
+ recommendations["confianza_corto"] = trend_strength * 0.8
180
+ else:
181
+ recommendations["corto_plazo"] = "Mantener posiciones cortas existentes"
182
+ recommendations["confianza_corto"] = trend_strength * 0.7
183
+ else:
184
+ recommendations["corto_plazo"] = "Mantenerse al margen, mercado sin dirección clara"
185
+ recommendations["confianza_corto"] = trend_strength * 0.5
186
+
187
+ # Ajustar recomendación basada en patrones de velas
188
+ for pattern in patterns:
189
+ if "alcista" in pattern.lower() and trend != "Bajista":
190
+ recommendations["corto_plazo"] += ". " + pattern + " refuerza señal de compra"
191
+ recommendations["confianza_corto"] = min(recommendations["confianza_corto"] + 1, 10)
192
+ elif "bajista" in pattern.lower() and trend != "Alcista":
193
+ recommendations["corto_plazo"] += ". " + pattern + " refuerza señal de venta"
194
+ recommendations["confianza_corto"] = min(recommendations["confianza_corto"] + 1, 10)
195
+ elif "doji" in pattern.lower():
196
+ recommendations["corto_plazo"] += ". " + pattern + " indica indecisión, considerar reducir exposición"
197
+ recommendations["confianza_corto"] = max(recommendations["confianza_corto"] - 1, 1)
198
+
199
+ # Recomendación a largo plazo
200
+ if trend == "Alcista":
201
+ recommendations["largo_plazo"] = "Mantener posiciones largas con visión de medio/largo plazo"
202
+ recommendations["confianza_largo"] = min(trend_strength * 0.7, 8)
203
+ elif trend == "Bajista":
204
+ recommendations["largo_plazo"] = "Considerar estrategias de cobertura para el largo plazo"
205
+ recommendations["confianza_largo"] = min(trend_strength * 0.7, 8)
206
+ else:
207
+ recommendations["largo_plazo"] = "Acumular gradualmente en niveles de soporte clave"
208
+ recommendations["confianza_largo"] = 5
209
+
210
+ # Añadir información de soportes y resistencias
211
+ for level_type, level_value in support_resistance:
212
+ if level_type == "Soporte":
213
+ recommendations["niveles_clave"].append(f"Soporte en nivel {level_value:.2f}")
214
+ if trend == "Alcista":
215
+ recommendations["largo_plazo"] += f". Considerar aumentar posición en soporte {level_value:.2f}"
216
+ else: # Resistencia
217
+ recommendations["niveles_clave"].append(f"Resistencia en nivel {level_value:.2f}")
218
+ if trend == "Bajista":
219
+ recommendations["largo_plazo"] += f". Considerar reducir exposición en resistencia {level_value:.2f}"
220
+
221
+ return recommendations
222
+
223
+ # Función para visualizar el análisis
224
+ def visualize_analysis(image, trend, patterns, support_resistance):
225
+ fig, ax = plt.subplots(figsize=(10, 6))
226
+ ax.imshow(image)
227
+
228
+ # Añadir anotaciones
229
+ height, width = image.size[1], image.size[0]
230
+
231
+ # Anotar tendencia
232
+ ax.text(width * 0.05, height * 0.1, f"Tendencia: {trend}",
233
+ color='white', fontsize=12, bbox=dict(facecolor='black', alpha=0.7))
234
+
235
+ # Anotar patrones
236
+ for i, pattern in enumerate(patterns):
237
+ ax.text(width * 0.05, height * (0.2 + i * 0.05), pattern,
238
+ color='white', fontsize=10, bbox=dict(facecolor='blue', alpha=0.7))
239
+
240
+ # Anotar soportes y resistencias
241
+ for level_type, level_value in support_resistance:
242
+ y_pos = int(level_value * height)
243
+ color = 'green' if level_type == "Soporte" else 'red'
244
+ ax.axhline(y=y_pos, color=color, linestyle='--', alpha=0.7)
245
+ ax.text(width * 0.8, y_pos, level_type,
246
+ color='white', fontsize=10, bbox=dict(facecolor=color, alpha=0.7))
247
+
248
+ plt.axis('off')
249
+ return fig
250
+
251
+ # Interfaz principal
252
+ uploaded_file = st.file_uploader("Sube una imagen de un gráfico", type=["jpg", "jpeg", "png"])
253
+
254
+ if uploaded_file is not None:
255
+ # Mostrar imagen original
256
+ image, img_array, gray = load_and_process_image(uploaded_file)
257
+
258
+ if image is not None:
259
+ st.image(image, caption="Gráfico subido", use_column_width=True)
260
+
261
+ with st.spinner('Analizando gráfico...'):
262
+ # Detectar tendencia
263
+ trend, trend_strength = detect_trend(img_array, gray)
264
+
265
+ # Detectar patrones de velas
266
+ patterns = detect_candlestick_patterns(img_array)
267
+
268
+ # Detectar soportes y resistencias
269
+ support_resistance = detect_support_resistance(gray)
270
+
271
+ # Generar recomendaciones
272
+ recommendations = generate_recommendations(trend, trend_strength, patterns, support_resistance)
273
+
274
+ # Mostrar análisis
275
+ st.subheader("Análisis Técnico")
276
+
277
+ col1, col2 = st.columns(2)
278
+
279
+ with col1:
280
+ st.markdown(f"**Tendencia detectada:** {trend}")
281
+ st.markdown(f"**Fuerza de la tendencia:** {trend_strength:.1f}/10")
282
+
283
+ st.markdown("**Patrones identificados:**")
284
+ for pattern in patterns:
285
+ st.markdown(f"- {pattern}")
286
+
287
+ st.markdown("**Niveles clave:**")
288
+ for level in recommendations["niveles_clave"]:
289
+ st.markdown(f"- {level}")
290
+
291
+ with col2:
292
+ # Visualizar análisis
293
+ fig = visualize_analysis(image, trend, patterns, support_resistance)
294
+ st.pyplot(fig)
295
+
296
+ # Mostrar recomendaciones
297
+ st.subheader("Recomendaciones de Trading")
298
+
299
+ rec_col1, rec_col2 = st.columns(2)
300
+
301
+ with rec_col1:
302
+ st.markdown("### Operación a Corto Plazo")
303
+ st.markdown(recommendations["corto_plazo"])
304
+ st.progress(float(recommendations["confianza_corto"]/10))
305
+ st.markdown(f"*Nivel de confianza: {recommendations['confianza_corto']:.1f}/10*")
306
+
307
+ with rec_col2:
308
+ st.markdown("### Estrategia a Largo Plazo")
309
+ st.markdown(recommendations["largo_plazo"])
310
+ st.progress(float(recommendations["confianza_largo"]/10))
311
+ st.markdown(f"*Nivel de confianza: {recommendations['confianza_largo']:.1f}/10*")
312
+
313
+ # Disclaimer
314
+ st.markdown("---")
315
+ st.markdown("""
316
+ **Disclaimer:** Este análisis es generado automáticamente y tiene fines educativos.
317
+ No constituye asesoramiento financiero. Realice su propia investigación antes de tomar decisiones de inversión.
318
+ """)
319
+ else:
320
+ # Mostrar ejemplo cuando no hay archivo subido
321
+ st.info("👆 Sube una imagen de un gráfico para comenzar el análisis")
322
+
323
+ # Mostrar información de ejemplo
324
+ st.subheader("¿Cómo funciona?")
325
+ st.markdown("""
326
+ 1. **Sube una imagen** de un gráfico de cualquier activo financiero
327
+ 2. La aplicación **analiza automáticamente** la tendencia, patrones y niveles clave
328
+ 3. Recibe **recomendaciones de trading** a corto y largo plazo
329
+
330
+ La aplicación utiliza técnicas de procesamiento de imágenes y análisis técnico para identificar:
331
+ - Tendencias alcistas, bajistas o laterales
332
+ - Patrones de velas japonesas
333
+ - Niveles de soporte y resistencia
334
+ - Señales de compra o venta
335
+ """)
336
+
337
+ # Información del pie de página
338
+ st.markdown("---")
339
+ st.markdown("Desarrollado con ❤️ usando Streamlit y técnicas de análisis de imágenes")
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ streamlit
2
+ pillow
3
+ opencv-python-headless
4
+ matplotlib
5
+ pandas
6
+ numpy
7
+ scikit-learn