Analyse des données du CAC 40¶
L’objectif de cet exercice est de manipuler des données à l’aide de listes et de dictionnaires (sans utiliser de tableaux numpy).
Télécharger depuis le site https://fr.finance.yahoo.com/quote/%5EFCHI/history/ les données du CAC 40 depuis 3 ans. Le fichier obtenu contient : la date, le cours d’ouverture, le plus haut, le plus bas, le cours de clôture, le cours de clôture ajusté et le volume de titres échangés. Ce contenu est séparé par des ,.
Remarque : la méthode split d’une chaine de caractère permet de la séparer en plusieurs sous chaînes. Par exemple :
s = '12,bonjour,3.14'
print(s.split(','))
On suprimera la première ligne du fichier.
Afficher les 10 premières lignes du fichier
Créer une liste contenant le plus haut de la bourse jour par jour. Qu’elle est la valeur la plus haute du CAC 40 ?
Écrire une fonction qui prend le jour, le mois et l’année et renvoie une chaîne de caractère pour la date sous la forme : aaaa-mm-jj (par exemple 1515-09-13)
Écrire une fonction qui renvoie le plus bas d’une journée à partir du jour, du mois et de l’année. Cette fonction renverra une exception si le jour n’existe pas.
Plutôt qu’une liste, on va utiliser un dictionnaire dont la clé sera la date. Créer un dictionnaire qui contiendra pour chaque jour un dictionnaire avec pour clé : ‘haut’, ‘bas’, ‘ouverture’, ‘fermeture’, ‘volume’. Par exemple on pourra utiliser :
cac_40['2020-10-05']['haut']Enregistrer ce dictionnaire dans un fichier au format json. Vérifier que vous pouvez l’ouvrir !
Regarder la documentation de la fonction
parsedu moduledateutil.parseret trouver le moyen de convertir une date sous la forme2020-10-05en un nombre (nombre de jour ou nombre de seconde depuis une date donnée).Tracer l’évolution au cours du temps de CAC 40.
Solution¶
with open('data/cac40.csv') as f:
toutes_les_lignes = f.readlines()
toutes_les_lignes = toutes_les_lignes[1:]
for elm in toutes_les_lignes[:10]:
print(elm.strip())
2020-07-30,4952.080078,4952.379883,4801.020020,4852.939941,4852.939941,137065700
2020-07-31,4866.240234,4902.899902,4783.689941,4783.689941,4783.689941,129676300
2020-08-03,4797.060059,4899.520020,4763.600098,4875.930176,4875.930176,104619900
2020-08-04,4905.660156,4920.799805,4856.649902,4889.520020,4889.520020,86945300
2020-08-05,4916.959961,4954.600098,4907.410156,4933.339844,4933.339844,74970100
2020-08-06,4919.410156,4951.859863,4860.979980,4885.129883,4885.129883,80015300
2020-08-07,4873.100098,4896.209961,4843.899902,4889.520020,4889.520020,62365400
2020-08-10,4905.270020,4937.629883,4878.580078,4909.509766,4909.509766,62044500
2020-08-11,4952.410156,5052.120117,4949.049805,5027.990234,5027.990234,97809400
2020-08-12,5017.729980,5096.529785,5010.799805,5073.310059,5073.310059,76792800
plus_haut = []
for elm in toutes_les_lignes:
plus_haut.append(float(elm.split(',')[2]))
max(plus_haut) # Remarque : ne pas coder soi même la fonction max!
7581.259766
def format_date(jour, mois, annee):
"""Formate la date sous la forme : jj/mm/aa
"""
return f"{annee:04d}-{mois:02d}-{jour:02d}"
# 02d : écriture decimale, 2 chiffres en tout, mettre des 0 devant
assert format_date(13, 9, 1515)=='1515-09-13'
def plus_bas(jour, mois, annee):
date_demandee = format_date(jour, mois, annee)
for elm in toutes_les_lignes:
date, ouverture, haut, bas, fermeture, fermeture_ajust, volume = elm.split(',')
if date==date_demandee:
return float(bas)
raise Exception(f"La date {date_demandee} n'a pas pu être trouvée")
print(plus_bas(5, 10, 2020))
4842.259766
cac_40 = {}
for elm in toutes_les_lignes:
date, ouverture, haut, bas, fermeture, fermeture_ajust, volume = elm.split(',')
line = {
'ouverture':float(ouverture),
'haut' : float(haut),
'bas' : float(bas),
'fermeture' : float(fermeture),
'volume' : int(volume)
}
cac_40[date] = line
cac_40['2020-10-05']['fermeture']
4871.870117
import json
with open('/tmp/cac_40.json', 'w') as f:
json.dump(cac_40, f, indent=3)
with open('/tmp/cac_40.json') as f:
tmp = json.load(f)
tmp['2020-10-05']['fermeture']
4871.870117
from dateutil.parser import parse
day = parse('2020-10-05')
print(day.toordinal())
737703
list_of_day = []
list_of_ouverture = []
for key, elm in cac_40.items():
list_of_day.append(parse(key).toordinal())
list_of_ouverture.append(elm['ouverture'])
import matplotlib.pyplot as plt
plt.plot(list_of_day, list_of_ouverture)
[<matplotlib.lines.Line2D at 0x7f11fc6d2d30>]