import yfinance as yf from datetime import datetime, timedelta import os def get_closing_price_at_date(stock_symbol, date): # Convertir la date en format Y-m-d formatted_date = datetime.strptime(date, "%d-%m-%Y") start_date = formatted_date end_date = formatted_date + timedelta(days=1) start_date = start_date.strftime("%Y-%m-%d") end_date = end_date.strftime("%Y-%m-%d") # Récupérer les données historiques de l'action stock = yf.Ticker(stock_symbol) historical_data = stock.history(start=start_date, end=end_date) # Vérifier si des données sont disponibles pour la date spécifiée if historical_data.empty: print("Pas de données disponibles pour " + date + " - " + stock_symbol) # Retourner la dernière valeur correcte disponible previous_date = formatted_date - timedelta(days=1) previous_date = previous_date.strftime("%Y-%m-%d") previous_data = stock.history(start=previous_date, end=start_date) if previous_data.empty: print("Aucune valeur précédente disponible pour " + previous_date + " - " + stock_symbol) return None else: closing_price = previous_data['Close'].iloc[-1] return closing_price # Extraire le prix de clôture à la date donnée closing_price = historical_data['Close'].iloc[0] return closing_price """ fonction qui pour chaque date d'un fichier date, et pour chaque couple(nom:indice) d'un fichier valeur ecrire dans un nouveau fichier qui sappel {nom} un couple date:le reurn de la fonction get_closing_price_at_date(indice,date) """ def recupCloture(nom_fichier_dates, nom_fichier_valeurs): with open(nom_fichier_dates, 'r') as fichier_dates: dates = fichier_dates.readlines() # Lire toutes les dates dans une liste with open(nom_fichier_valeurs, 'r') as fichier_valeurs: lignes_valeurs = fichier_valeurs.readlines() # Lire toutes les lignes de valeurs for ligne_valeurs in lignes_valeurs: nom, indice = ligne_valeurs.strip().split(":") for date in dates: date = date.strip() valeur = get_closing_price_at_date(indice, date) nom_fichier_resultats = nom + ".txt" with open("../Donnee/"+ nom_fichier_resultats, 'a') as fichier_resultats: fichier_resultats.write(date + ":" + str(valeur) + "\n") """ fonction python qui utilise la librairie yfinance et qui vient ecrire dans un fichier les dates d'ouverture de la bourse """ def write_market_open_dates(filename): # Obtention de la date d'aujourd'hui today = datetime.now().date() thirty_days_ago = 0 with open(filename, 'r') as fichier: lignes = fichier.readlines() derniere_ligne = lignes[-1].strip() print(derniere_ligne) thirty_days_ago = datetime.strptime(derniere_ligne, '%d-%m-%Y').date() fichier.close() # Récupération des données boursières pour l'indice de référence (par exemple, le CAC40) index_ticker = '^FCHI' # Symbole boursier de l'indice CAC40 index_data = yf.download(index_ticker, start=thirty_days_ago, end=today) # Filtrage des jours de bourse ouverts market_open_dates = index_data.index.date # Ecriture des dates dans le fichier with open(filename, 'a') as file: for dates in market_open_dates: formatted_date = dates.strftime("%#d-%#m-%Y") file.write(formatted_date + '\n') with open("datetmp.txt", 'w') as file: for dates in market_open_dates: formatted_date = dates.strftime("%#d-%#m-%Y") file.write(formatted_date + '\n') """ fonction python qui utilise la librairie yfinance, qui s'appelle recup, prend en parametre un fichier valeur. Qui pour chaque valeurs (nom:symbole) recupere la valeurs de cloture des 1000 dernier jour et l'ecrit dans un fichier qui s'appelle nom.txt, dans le dossier Donnee, sous la formme date d-m-yyy:valeurscloture """ def recup(fichier_valeur): # Vérification de l'existence du dossier "Donnee" if not os.path.exists('../Donnee'): os.makedirs('../Donnee') with open(fichier_valeur, 'r') as fichier: for ligne in fichier: nom, symbole = ligne.strip().split(':') # Récupération des données avec yfinance data = yf.download(symbole, period='5000d')['Close'] # Création du chemin et nom du fichier de sortie fichier_sortie = os.path.join('../Donnee', f'{nom}.txt') # Écriture des données dans le fichier de sortie with open(fichier_sortie, 'w') as sortie: for index, value in data.items(): date = index.strftime('%-d-%-m-%Y') ligne_sortie = f"{date}: {value}\n" sortie.write(ligne_sortie) def lire_dates(fichier_dates): with open(fichier_dates, 'r') as file: dates = [line.strip() for line in file] return dates """ fonction qui vient verifiier que toute les dates sont presentes """ def verifier_dates(dates, repertoire): fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f))] for fichier in fichiers: if fichier != 'date.txt' and fichier != 'test.py': # Ignorer le fichier de dates lui-même with open(os.path.join(repertoire, fichier), 'r') as file: donnees = [line.split(':')[0].strip() for line in file] for date in dates: if date not in donnees: print(f"La date {date} n'est pas présente dans le fichier {fichier}.") """ fonction qui vient rajouter dans les fichiers les dates qui ne sont pas presente dans le fichier """ def ajouter_dates_manquantes(dates, repertoire): fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f)) and f != 'test.py'] for fichier in fichiers: chemin_fichier = os.path.join(repertoire, fichier) with open(chemin_fichier, 'r') as file: lignes = file.readlines() donnees = [line.split(':')[0].strip() for line in lignes] dernier_index = -1 for i, date in enumerate(dates): if date not in donnees: if dernier_index != -1 and dernier_index < len(donnees): # Vérification supplémentaire avant d'accéder à l'indice if dernier_index < len(lignes) and lignes[dernier_index].count(':') > 0: valeur = lignes[dernier_index].split(':')[1].strip() else: valeur = 'valeur_par_defaut' nouvelle_ligne = f"{date}:{valeur}\n" else: nouvelle_ligne = f"{date}:valeur_par_defaut\n" lignes.append(nouvelle_ligne) # Mettez à jour dernier_index uniquement si la date est trouvée dans donnees dernier_index = donnees.index(date) if date in donnees else dernier_index with open(chemin_fichier, 'w') as file: file.writelines(lignes) reponse = input("Voulez-vous ajouter les donnees jusqu'a aujourd'hui ? (Oui/Non) ").lower() if reponse == 'oui': write_market_open_dates("date.txt") recupCloture("datetmp.txt","valeur.txt") dates = lire_dates("date.txt") verifier_dates(dates,"../Donnee") reponse = input("Voulez-vous corriger le problème des dates ? (Oui/Non) ").lower() if reponse == 'oui': ajouter_dates_manquantes(dates,"../Donnee") else : print("Le problème des dates ne sera pas corrigé.") """ TODO : verifier ue les données sont non nul (None quand on les rentres dans les valeurs """