Enoder commited on
Commit
e146993
·
verified ·
1 Parent(s): 98e569e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -106
app.py CHANGED
@@ -5,28 +5,7 @@ import matplotlib.pyplot as plt
5
  import numpy as np
6
  from datetime import datetime, timedelta
7
  from sklearn.metrics import mean_squared_error
8
- import pandas as pd
9
-
10
- # Exemple de fonction pour identifier un pattern
11
- def identify_best_pattern(df, patterns):
12
- # Logique de recherche du meilleur pattern
13
- best_pattern = None # Remplacez cette ligne par la logique réelle
14
- return best_pattern
15
 
16
- # Exemple de dataframe (vous pouvez charger vos données ici)
17
- df = pd.DataFrame({
18
- 'date': ['2024-11-01', '2024-11-02', '2024-11-03'],
19
- 'price': [100, 110, 120]
20
- })
21
-
22
- # Exemple de patterns (vous pouvez ajuster selon vos besoins)
23
- patterns = [1, 2, 3]
24
-
25
- # Appel de la fonction
26
- best_pattern = identify_best_pattern(df, patterns)
27
-
28
- # Affichage du meilleur pattern trouvé
29
- print(best_pattern)
30
  # Fonction pour récupérer les prix historiques
31
  def get_crypto_prices(coins, start_time, end_time, interval='m15'):
32
  prices = {}
@@ -83,106 +62,87 @@ def predict_patterns(data, future_hours=24):
83
  patterns["Recovery"] = [last_price + (mean_price - last_price) * (i / len(future_timestamps)) for i in range(len(future_timestamps))]
84
  patterns["Acceleration"] = [last_price + (trend * 1.5) * i for i in range(len(future_timestamps))]
85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  pattern_dfs = {
87
  pattern_name: pd.DataFrame({"timestamp": future_timestamps, "price": prices})
88
  for pattern_name, prices in patterns.items()
89
  }
90
  return pattern_dfs
91
 
92
- # Fonction pour identifier un pattern similaire dans l'historique
93
- def find_similar_pattern(df, pred_data, window_size=5):
94
  mse_scores = {}
95
- for i in range(len(df) - window_size):
96
- history_segment = df["price"].iloc[i:i + window_size].values
97
- mse = mean_squared_error(history_segment, pred_data[:len(history_segment)])
98
- mse_scores[i] = mse
99
-
100
- # Trouver le segment avec le plus faible MSE
101
- best_start_index = min(mse_scores, key=mse_scores.get)
102
- similar_pattern = df["price"].iloc[best_start_index:best_start_index + window_size].values
103
- return similar_pattern
104
-
105
- # Fonction pour générer une courbe dynamique basée sur les patterns passés
106
- def generate_dynamic_curve(df, initial_prediction, future_hours=24, window_size=5):
107
- dynamic_curve = []
108
- pred_data = initial_prediction[:window_size] # Les premières données de la prédiction
109
-
110
- # Générer une courbe en utilisant les patterns historiques de manière dynamique
111
- for _ in range(future_hours // (window_size)):
112
- similar_pattern = find_similar_pattern(df, pred_data, window_size)
113
- dynamic_curve.extend(similar_pattern) # Ajoute le pattern trouvé à la courbe
114
- pred_data = similar_pattern # Met à jour la prédiction avec le dernier pattern trouvé
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  return dynamic_curve
117
 
118
  # Configuration des dates
119
  end_time = datetime.now()
120
- start_time = end_time - timedelta(hours=48)
121
 
122
- # Liste des cryptos avec leurs IDs corrects sur CoinCap
123
  coins = {
124
- "Bitcoin": "bitcoin",
125
- "Ripple": "xrp",
126
- "Ethereum": "ethereum",
127
- "Tether": "tether",
128
- "Stellar": "stellar"
129
  }
130
 
131
- # Récupération des prix
132
- crypto_prices = get_crypto_prices(coins, start_time, end_time)
133
-
134
- # Affichage des graphiques
135
- st.title("Analyse et Prédictions des Cryptos avec Patterns")
136
- for coin, price_data in crypto_prices.items():
137
- if price_data:
138
- df = pd.DataFrame(price_data, columns=["timestamp", "price"])
139
- df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
140
-
141
- patterns = predict_patterns(price_data, future_hours=24)
142
- best_pattern = identify_best_pattern(df, patterns)
143
-
144
- st.write(f"#### {coin} - Prix et Prédictions")
145
- fig, ax = plt.subplots(figsize=(12, 6))
146
- ax.plot(df["timestamp"], df["price"], label="Prix réel", color="blue")
147
-
148
- # Affiche la prédiction initiale (en jaune)
149
- best_pattern_df = patterns[best_pattern]
150
- ax.plot(
151
- best_pattern_df["timestamp"],
152
- best_pattern_df["price"],
153
- label=f"Prédiction initiale ({best_pattern})",
154
- linestyle="dashed",
155
- color="yellow"
156
- )
157
-
158
- # Génère la courbe dynamique (en vert) basée sur les patterns historiques
159
- dynamic_curve = generate_dynamic_curve(df, best_pattern_df["price"].values)
160
- future_timestamps = pd.date_range(df["timestamp"].iloc[-1], periods=(24 * 60 // 15) + 1, freq="15T")
161
- ax.plot(future_timestamps, dynamic_curve, label="Prédiction dynamique (basée sur historique)", linestyle="dashed", color="green")
162
-
163
- ax.set_title(f"{coin} - Prix (48h réels + 24h prévu avec {best_pattern})")
164
- ax.set_xlabel("Temps")
165
- ax.set_ylabel("Prix (USD)")
166
- ax.legend()
167
- st.pyplot(fig)
168
-
169
- # Texte explicatif du pattern choisi
170
- explanation = {
171
- "Trend": "Ce pattern indique que le prix continue sur la tendance actuelle, il suit la direction des prix précédents.",
172
- "Reversal": "Ce pattern suggère que le prix pourrait inverser la tendance actuelle, en suivant la direction opposée.",
173
- "SMA": "Le prix pourrait se stabiliser autour de la moyenne mobile simple (SMA), une approximation de la tendance générale.",
174
- "EMA": "Ce pattern suit la moyenne mobile exponentielle (EMA), qui réagit plus rapidement aux changements de prix.",
175
- "Cycle": "Le pattern de cycle suppose une oscillation autour d'un point central, représentant des mouvements de prix cycliques.",
176
- "Rebound": "Le prix pourrait rebondir après avoir montré des signes de ralentissement, suivant une courbe d'amortissement.",
177
- "Plateau": "Ce pattern suggère que le prix restera relativement stable et horizontal, sans mouvements majeurs.",
178
- "Breakout": "Le breakout indique une rupture de la tendance actuelle, avec une direction plus forte dans une des deux directions.",
179
- "Recovery": "Le pattern de récupération suggère que le prix pourrait revenir à sa moyenne historique après une variation importante.",
180
- "Acceleration": "L'accélération suggère un mouvement rapide des prix, souvent après une période de stagnation ou de consolidation."
181
- }
182
 
183
- # Afficher l'explication sous le graphique
184
- st.write(f"### Explication du pattern ({best_pattern}):")
185
- st.write(explanation[best_pattern])
 
186
 
187
- else:
188
- st.warning(f"Aucune donnée disponible pour {coin}")
 
 
 
5
  import numpy as np
6
  from datetime import datetime, timedelta
7
  from sklearn.metrics import mean_squared_error
 
 
 
 
 
 
 
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  # Fonction pour récupérer les prix historiques
10
  def get_crypto_prices(coins, start_time, end_time, interval='m15'):
11
  prices = {}
 
62
  patterns["Recovery"] = [last_price + (mean_price - last_price) * (i / len(future_timestamps)) for i in range(len(future_timestamps))]
63
  patterns["Acceleration"] = [last_price + (trend * 1.5) * i for i in range(len(future_timestamps))]
64
 
65
+ # Ajout des 20 autres patterns
66
+ patterns["Overbought"] = [last_price + cycle_amplitude * np.cos(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
67
+ patterns["Oversold"] = [last_price - cycle_amplitude * np.cos(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
68
+ patterns["DoubleTop"] = [last_price + trend * 2 if i < len(future_timestamps) // 2 else last_price - trend * 2 for i in range(len(future_timestamps))]
69
+ patterns["DoubleBottom"] = [last_price - trend * 2 if i < len(future_timestamps) // 2 else last_price + trend * 2 for i in range(len(future_timestamps))]
70
+ patterns["HeadAndShoulders"] = [last_price + (cycle_amplitude * np.sin(2 * np.pi * i / (len(future_timestamps) // 2))) for i in range(len(future_timestamps))]
71
+ patterns["InverseHeadAndShoulders"] = [last_price - (cycle_amplitude * np.sin(2 * np.pi * i / (len(future_timestamps) // 2))) for i in range(len(future_timestamps))]
72
+ patterns["Parabolic"] = [last_price + (cycle_amplitude * i ** 2) for i in range(len(future_timestamps))]
73
+ patterns["ExponentialGrowth"] = [last_price * (1 + 0.05) ** i for i in range(len(future_timestamps))]
74
+ patterns["ExponentialDecay"] = [last_price * (1 - 0.05) ** i for i in range(len(future_timestamps))]
75
+ patterns["Sinusoidal"] = [last_price + cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
76
+ patterns["Flatline"] = [last_price for i in range(len(future_timestamps))]
77
+ patterns["HarmonicOscillator"] = [last_price + cycle_amplitude * np.cos(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
78
+ patterns["Waveform"] = [last_price + cycle_amplitude * np.sin(i) for i in range(len(future_timestamps))]
79
+ patterns["SwingHigh"] = [last_price + cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
80
+ patterns["SwingLow"] = [last_price - cycle_amplitude * np.sin(2 * np.pi * i / len(future_timestamps)) for i in range(len(future_timestamps))]
81
+ patterns["AscendingTriangle"] = [last_price + cycle_amplitude * np.exp(i / len(future_timestamps)) for i in range(len(future_timestamps))]
82
+ patterns["DescendingTriangle"] = [last_price - cycle_amplitude * np.exp(i / len(future_timestamps)) for i in range(len(future_timestamps))]
83
+
84
  pattern_dfs = {
85
  pattern_name: pd.DataFrame({"timestamp": future_timestamps, "price": prices})
86
  for pattern_name, prices in patterns.items()
87
  }
88
  return pattern_dfs
89
 
90
+ # Fonction pour identifier le pattern le plus ressemblant
91
+ def identify_best_pattern(df, patterns):
92
  mse_scores = {}
93
+ actual_values = df["price"].values[-len(df) // 2:] # Dernières heures
94
+
95
+ for pattern_name, pattern_df in patterns.items():
96
+ predicted_values = np.array(pattern_df["price"].values[:len(actual_values)])
97
+ min_length = min(len(actual_values), len(predicted_values))
98
+ mse = mean_squared_error(actual_values[:min_length], predicted_values[:min_length])
99
+ mse_scores[pattern_name] = mse
100
+
101
+ # Sélection du pattern avec la MSE la plus faible
102
+ best_pattern = min(mse_scores, key=mse_scores.get)
103
+ return best_pattern
 
 
 
 
 
 
 
 
 
104
 
105
+ # Fonction pour ajouter la prédiction dynamique basée sur les patterns historiques
106
+ def predict_dynamic_curve(df, patterns, future_hours=24):
107
+ dynamic_predictions = []
108
+ current_values = df["price"].values[-5:] # Les 5 dernières valeurs pour démarrer
109
+
110
+ for i in range(future_hours // 5):
111
+ # Identifier le pattern le plus proche des 5 dernières valeurs
112
+ best_pattern = identify_best_pattern(pd.DataFrame({"timestamp": df.index[-5:], "price": current_values}), patterns)
113
+ best_pattern_values = patterns[best_pattern]["price"].values[:5]
114
+ dynamic_predictions.extend(best_pattern_values)
115
+ current_values = dynamic_predictions[-5:] # Mise à jour avec les 5 dernières valeurs
116
+
117
+ future_timestamps = [df.index[-1] + timedelta(minutes=15 * i) for i in range(1, len(dynamic_predictions) + 1)]
118
+ dynamic_curve = pd.DataFrame({"timestamp": future_timestamps, "price": dynamic_predictions})
119
  return dynamic_curve
120
 
121
  # Configuration des dates
122
  end_time = datetime.now()
123
+ start_time = end_time - timedelta(days=30)
124
 
125
+ # Cryptos à suivre
126
  coins = {
127
+ 'bitcoin': 'bitcoin',
128
+ 'ethereum': 'ethereum',
129
+ 'litecoin': 'litecoin'
 
 
130
  }
131
 
132
+ # Récupérer les prix
133
+ prices = get_crypto_prices(coins, start_time, end_time)
134
+
135
+ # Prédiction des tendances avec des patterns
136
+ pattern_dfs = {}
137
+ for coin, data in prices.items():
138
+ pattern_dfs[coin] = predict_patterns(data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
 
140
+ # Calculer les prédictions dynamiques
141
+ dynamic_curves = {}
142
+ for coin, pattern_df in pattern_dfs.items():
143
+ dynamic_curves[coin] = predict_dynamic_curve(prices[coin], pattern_df)
144
 
145
+ # Affichage des courbes dynamiques
146
+ for coin, dynamic_curve in dynamic_curves.items():
147
+ st.write(f"Prédiction dynamique pour {coin.capitalize()}:")
148
+ st.line_chart(dynamic_curve.set_index('timestamp')['price'])