| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- from Config.paths import Path_FichierAction, SysExploite
- from Model.profil import profile
- import redis
- from datetime import datetime, timedelta, date
- import yfinance as yf
- from ta import add_all_ta_features
- import json
- import warnings
- warnings.simplefilter("ignore", FutureWarning)
- # Initialisation de Redis
- redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
- Gl_DebutEnresitrement = "2016-01-01"
- @profile
- def BaseOK():
- nombre_cles = redis_client.dbsize()
- # Vérifier si inférieur à 90 000
- if nombre_cles < 90000:
- EnregistreTout()
- @profile
- def EnregistreTout():
- date_aujourdhui = datetime.now().strftime("%Y-%m-%d")
- try:
- # Lecture du fichier contenant les noms des actions
- with open(Path_FichierAction, 'r') as file:
- actions = [line.strip() for line in file.readlines()]
- # Vérification que le fichier contient des actions
- if not actions:
- print("Le fichier ne contient aucune action à traiter.")
- return
- # Boucle sur toutes les actions pour appeler Enregistre
- for action in actions:
- Enregistre(action, Gl_DebutEnresitrement, date_aujourdhui)
- print("Enregistrement terminé pour toutes les actions.")
- except FileNotFoundError:
- print(f"Erreur : Le fichier {Path_FichierAction} est introuvable.")
- except Exception as e:
- print(f"Erreur lors de l'exécution de EnregistreTout : {e}")
- @profile
- def Enregistre(Action, DateDebut, DateFin):
- """
- Télécharge les données d'une action sur une période donnée,
- calcule les indicateurs techniques et les enregistre dans Redis.
- """
- try:
- data = yf.download(Action, start=DateDebut, end=DateFin,auto_adjust=False)
- if data.empty:
- print("Aucune donnée récupérée pour cette période.")
- return
- data.columns = data.columns.droplevel(1)
- # Ajout des colonnes avec des indicateurs techniques
- data = add_all_ta_features(
- data, open="Open", high="High", low="Low", close="Close", volume="Volume", fillna=True
- )
- # Convertir les données en dictionnaire
- data_dict = data.to_dict(orient='index')
- # Enregistrement dans Redis
- for date, valeurs in data_dict.items():
- key = f"{Action}:{date.strftime('%Y-%m-%d')}"
- redis_client.set(key, json.dumps(valeurs)) # Sérialise les données en JSON pour les stocker
- except Exception as e:
- print(f"Erreur lors de l'enregistrement des données de {Action}: {e}")
- @profile
- def LireRedis(Action, Date):
- cle = Action + ":" + str(Date)
- return redis_client.get(cle)
- """"
- Fonction qui renvoie la liste des jours pour la preparation des donnéee
- """
- @profile
- def ListeJour(Date, NbJour):
- liste = [Date]
- if isinstance(Date, date):
- date_obj = Date
- else:
- date_obj = datetime.strptime(Date, "%Y-%m-%d").date()
- i = 1
- while (i < NbJour):
- date_obj = date_obj + timedelta(days=+1)
- cle = "MT.AS" + ":" + date_obj.strftime("%Y-%m-%d")
- valeur1 = redis_client.get(cle)
- cle = "AC.PA" + ":" + date_obj.strftime("%Y-%m-%d")
- valeur2 = redis_client.get(cle)
- if valeur1 is not None and valeur2 is not None:
- liste.append(date_obj.strftime("%Y-%m-%d"))
- i = i + 1
- else :
- #print(f"erreur Liste jour : {date_obj}")
- today = datetime.now().date()
- if date_obj > today:
- raise ValueError("La date est dans le futur")
- return liste
- @profile
- def DernierJour(Date,Nbjour):
- return ListeJour(Date,Nbjour)[-1]
-
- """
- La fonction BaseOk est executer a chaque fois que l'on appel le fichier donnée
- """
- if SysExploite == "linux" :
- BaseOK()
|