LectureDonne.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import yfinance as yf
  2. from datetime import datetime, timedelta
  3. import os
  4. def get_closing_price_at_date(stock_symbol, date):
  5. # Convertir la date en format Y-m-d
  6. formatted_date = datetime.strptime(date, "%d-%m-%Y")
  7. start_date = formatted_date
  8. end_date = formatted_date + timedelta(days=1)
  9. start_date = start_date.strftime("%Y-%m-%d")
  10. end_date = end_date.strftime("%Y-%m-%d")
  11. # Récupérer les données historiques de l'action
  12. stock = yf.Ticker(stock_symbol)
  13. historical_data = stock.history(start=start_date, end=end_date)
  14. # Vérifier si des données sont disponibles pour la date spécifiée
  15. if historical_data.empty:
  16. print("Pas de données disponibles pour " + date + " - " + stock_symbol)
  17. # Retourner la dernière valeur correcte disponible
  18. previous_date = formatted_date - timedelta(days=1)
  19. previous_date = previous_date.strftime("%Y-%m-%d")
  20. previous_data = stock.history(start=previous_date, end=start_date)
  21. if previous_data.empty:
  22. print("Aucune valeur précédente disponible pour " + previous_date + " - " + stock_symbol)
  23. return None
  24. else:
  25. closing_price = previous_data['Close'].iloc[-1]
  26. return closing_price
  27. # Extraire le prix de clôture à la date donnée
  28. closing_price = historical_data['Close'].iloc[0]
  29. return closing_price
  30. """
  31. fonction qui pour chaque date d'un fichier date, et pour chaque couple(nom:indice) d'un fichier valeur
  32. ecrire dans un nouveau fichier qui sappel {nom} un couple date:le reurn de la fonction get_closing_price_at_date(indice,date)
  33. """
  34. def recupCloture(nom_fichier_dates, nom_fichier_valeurs):
  35. with open(nom_fichier_dates, 'r') as fichier_dates:
  36. dates = fichier_dates.readlines() # Lire toutes les dates dans une liste
  37. with open(nom_fichier_valeurs, 'r') as fichier_valeurs:
  38. lignes_valeurs = fichier_valeurs.readlines() # Lire toutes les lignes de valeurs
  39. for ligne_valeurs in lignes_valeurs:
  40. nom, indice = ligne_valeurs.strip().split(":")
  41. for date in dates:
  42. date = date.strip()
  43. valeur = get_closing_price_at_date(indice, date)
  44. nom_fichier_resultats = nom + ".txt"
  45. with open("../Donnee/"+ nom_fichier_resultats, 'a') as fichier_resultats:
  46. fichier_resultats.write(date + ":" + str(valeur) + "\n")
  47. """
  48. fonction python qui utilise la librairie yfinance et qui vient ecrire dans un fichier les dates d'ouverture de la bourse
  49. """
  50. def write_market_open_dates(filename):
  51. # Obtention de la date d'aujourd'hui
  52. today = datetime.now().date()
  53. thirty_days_ago = 0
  54. with open(filename, 'r') as fichier:
  55. lignes = fichier.readlines()
  56. derniere_ligne = lignes[-1].strip()
  57. print(derniere_ligne)
  58. thirty_days_ago = datetime.strptime(derniere_ligne, '%d-%m-%Y').date()
  59. fichier.close()
  60. # Récupération des données boursières pour l'indice de référence (par exemple, le CAC40)
  61. index_ticker = '^FCHI' # Symbole boursier de l'indice CAC40
  62. index_data = yf.download(index_ticker, start=thirty_days_ago, end=today)
  63. # Filtrage des jours de bourse ouverts
  64. market_open_dates = index_data.index.date
  65. # Ecriture des dates dans le fichier
  66. with open(filename, 'a') as file:
  67. for dates in market_open_dates:
  68. formatted_date = dates.strftime("%#d-%#m-%Y")
  69. file.write(formatted_date + '\n')
  70. with open("datetmp.txt", 'w') as file:
  71. for dates in market_open_dates:
  72. formatted_date = dates.strftime("%#d-%#m-%Y")
  73. file.write(formatted_date + '\n')
  74. """
  75. fonction python qui utilise la librairie yfinance, qui s'appelle recup, prend en parametre un fichier valeur.
  76. 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
  77. """
  78. def recup(fichier_valeur):
  79. # Vérification de l'existence du dossier "Donnee"
  80. if not os.path.exists('../Donnee'):
  81. os.makedirs('../Donnee')
  82. with open(fichier_valeur, 'r') as fichier:
  83. for ligne in fichier:
  84. nom, symbole = ligne.strip().split(':')
  85. # Récupération des données avec yfinance
  86. data = yf.download(symbole, period='5000d')['Close']
  87. # Création du chemin et nom du fichier de sortie
  88. fichier_sortie = os.path.join('../Donnee', f'{nom}.txt')
  89. # Écriture des données dans le fichier de sortie
  90. with open(fichier_sortie, 'w') as sortie:
  91. for index, value in data.items():
  92. date = index.strftime('%-d-%-m-%Y')
  93. ligne_sortie = f"{date}: {value}\n"
  94. sortie.write(ligne_sortie)
  95. def lire_dates(fichier_dates):
  96. with open(fichier_dates, 'r') as file:
  97. dates = [line.strip() for line in file]
  98. return dates
  99. """
  100. fonction qui vient verifiier que toute les dates sont presentes
  101. """
  102. def verifier_dates(dates, repertoire):
  103. fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f))]
  104. for fichier in fichiers:
  105. if fichier != 'date.txt' and fichier != 'test.py': # Ignorer le fichier de dates lui-même
  106. with open(os.path.join(repertoire, fichier), 'r') as file:
  107. donnees = [line.split(':')[0].strip() for line in file]
  108. for date in dates:
  109. if date not in donnees:
  110. print(f"La date {date} n'est pas présente dans le fichier {fichier}.")
  111. """
  112. fonction qui vient rajouter dans les fichiers les dates qui ne sont pas presente dans le fichier
  113. """
  114. def ajouter_dates_manquantes(dates, repertoire):
  115. fichiers = [f for f in os.listdir(repertoire) if os.path.isfile(os.path.join(repertoire, f)) and f != 'test.py']
  116. for fichier in fichiers:
  117. chemin_fichier = os.path.join(repertoire, fichier)
  118. with open(chemin_fichier, 'r') as file:
  119. lignes = file.readlines()
  120. donnees = [line.split(':')[0].strip() for line in lignes]
  121. dernier_index = -1
  122. for i, date in enumerate(dates):
  123. if date not in donnees:
  124. if dernier_index != -1 and dernier_index < len(donnees):
  125. # Vérification supplémentaire avant d'accéder à l'indice
  126. if dernier_index < len(lignes) and lignes[dernier_index].count(':') > 0:
  127. valeur = lignes[dernier_index].split(':')[1].strip()
  128. else:
  129. valeur = 'valeur_par_defaut'
  130. nouvelle_ligne = f"{date}:{valeur}\n"
  131. else:
  132. nouvelle_ligne = f"{date}:valeur_par_defaut\n"
  133. lignes.append(nouvelle_ligne)
  134. # Mettez à jour dernier_index uniquement si la date est trouvée dans donnees
  135. dernier_index = donnees.index(date) if date in donnees else dernier_index
  136. with open(chemin_fichier, 'w') as file:
  137. file.writelines(lignes)
  138. reponse = input("Voulez-vous ajouter les donnees jusqu'a aujourd'hui ? (Oui/Non) ").lower()
  139. if reponse == 'oui':
  140. write_market_open_dates("date.txt")
  141. recupCloture("datetmp.txt","valeur.txt")
  142. dates = lire_dates("date.txt")
  143. verifier_dates(dates,"../Donnee")
  144. reponse = input("Voulez-vous corriger le problème des dates ? (Oui/Non) ").lower()
  145. if reponse == 'oui':
  146. ajouter_dates_manquantes(dates,"../Donnee")
  147. else :
  148. print("Le problème des dates ne sera pas corrigé.")
  149. """
  150. TODO : verifier ue les données sont non nul (None quand on les rentres dans les valeurs
  151. """