σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
σμimplied vol · KKmax(S−K,0)udβρᵢⱼfat tailsPnL · drawdownyield · TdSₜ = μSₜ dt + σSₜ dWₜC = S·N(d₁) − K·e⁻ʳᵀ·N(d₂)σₚ² = wᵀΣwd₁ = [ln(S/K) + (r + σ²⁄2)T] ⁄ σ√T∂V/∂t + ½σ²S²·∂²V/∂S² + rS·∂V/∂S − rV = 0Sharpe = (Rₚ − R_f) ⁄ σₚVaR₉₉ = μ − 2.33σρ = Cov(X,Y) ⁄ σₓσᵧE[Rₚ] = Σ wᵢ·E[Rᵢ]φ(x) = e^(−x²/2) ⁄ √2πE[Rᵢ] = R_f + βᵢ(E[Rₘ] − R_f)dXₜ = θ(μ − Xₜ)dt + σ dWₜσ²ₜ = ω + α·ε²ₜ₋₁ + β·σ²ₜ₋₁C − P = S − K·e⁻ʳᵀΔ = ∂V/∂S Γ = ∂²V/∂S²p = (e^(rΔt) − d) ⁄ (u − d)rₜ = ln(Pₜ ⁄ Pₜ₋₁)E[Xₜ₊₁ | ℱₜ] = Xₜf* = (bp − q) ⁄ bz = (x − μ) ⁄ σP(N=k) = λᵏe^(−λ) ⁄ k!Θ = −∂V/∂Tν = S·φ(d₁)·√Tmin wᵀΣw s.t. wᵀμ = μ*∫Σ∂∞λ
uantCraft AcademyParcours
Ctrl K
AO
+1,2 k apprenants
ConnexionRejoindre ↗
Parcours
AO
+1,2 k apprenants
Connexion
  • English
  • Français
  • Español
  • العربية
  • Português
  • Deutsch
  • 日本語
  • 中文
Parcours Python›Module 1 · Les bases de Python pour les quants›Sujet 1.17·~35 minDébutant

Fichiers CSV

Position dans le parcoursModule 1 sur 11 · Sujet 17 sur 33
1.17 Fichiers CSV
—Score du lab— / 100XP total—Série—

Des tableaux en texte

Un fichier CSV (valeurs séparées par des virgules) stocke un tableau en texte : une ligne par rangée, des cellules séparées par des virgules, souvent avec une ligne d'en-tête nommant les colonnes. Historiques de prix, carnets de transactions et exports de presque tous les outils prennent cette forme. On croit pouvoir l'analyser avec line.split(","), mais une cellule peut elle-même contenir une virgule ; elle est alors entourée de guillemets : AAPL,"Q3, adjusted". Découper à la main échoue dans ce cas : utilisez le module standard csv et ouvrez le fichier avec newline="" pour que les sauts de ligne dans les cellules soient bien gérés.

import csv

# Write a small table with csv.writer
with open("prices.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["date", "symbol", "close", "note"])
    writer.writerow(["2025-01-02", "AAPL", 184.25, "Q3, adjusted"])
    writer.writerow(["2025-01-03", "AAPL", 185.5, ""])

# The comma inside the note is quoted for us
with open("prices.csv", encoding="utf-8") as file:
    print(file.read().splitlines()[1])  # 2025-01-02,AAPL,184.25,"Q3, adjusted"

Lire les lignes

csv.reader(file) produit chaque ligne comme une liste de chaînes. csv.DictReader(file) lit d'abord l'en-tête puis produit chaque ligne comme un dictionnaire indexé par nom de colonne, plus lisible et insensible à un changement d'ordre des colonnes. Dans les deux cas chaque cellule est du texte : convertissez avec float(...) ou int(...) avant de calculer. Passez delimiter=";" (ou "\t") pour les fichiers qui utilisent un autre séparateur.

import csv

# DictReader gives each row as a dict; cells are strings
closes = []
with open("prices.csv", newline="", encoding="utf-8") as file:
    for row in csv.DictReader(file):
        closes.append(float(row["close"]))
print(closes)  # [184.25, 185.5]

# csv.reader gives plain lists, header included
with open("prices.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.reader(file))
print(rows[0])  # ['date', 'symbol', 'close', 'note']
print(rows[1])  # ['2025-01-02', 'AAPL', '184.25', 'Q3, adjusted']

Écrire des lignes

csv.writer(file).writerow(values) écrit une ligne et met des guillemets quand c'est nécessaire ; les nombres sont convertis en texte pour vous. csv.DictWriter(file, fieldnames=[...]) écrit des dictionnaires, et writeheader() écrit d'abord les noms de colonnes. Ouvrez le fichier avec "w" et newline="" ; sans newline="", Windows peut produire des lignes vides entre les rangées.

import csv

# DictWriter: header first, then one dict per row
trades = [{"symbol": "AAPL", "quantity": 200}, {"symbol": "MSFT", "quantity": 50}]
with open("trades.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["symbol", "quantity"])
    writer.writeheader()
    writer.writerows(trades)

with open("trades.csv", encoding="utf-8") as file:
    print(file.read().splitlines())  # ['symbol,quantity', 'AAPL,200', 'MSFT,50']
import csv

# Cells are text until you convert them
with open("prices.csv", newline="", encoding="utf-8") as file:
    row = next(csv.DictReader(file))
print(repr(row["close"]), row["close"] * 2)   # '184.25' 184.25184.25
print(float(row["close"]) * 2)                # 368.5

# Another separator: semicolons
with open("euro.csv", "w", newline="", encoding="utf-8") as file:
    csv.writer(file, delimiter=";").writerow(["AAPL", "184,25"])
with open("euro.csv", newline="", encoding="utf-8") as file:
    print(next(csv.reader(file, delimiter=";")))  # ['AAPL', '184,25']
Tout revient sous forme de texteUn fichier CSV n'a pas de types : 184.25, 200 et AAPL ne sont que des caractères tant qu'on ne les convertit pas. L'oublier donne "184.25" * 200 (le texte répété 200 fois) plutôt qu'une erreur. Convertissez chaque colonne une fois, là où vous la lisez, et vérifiez les noms de l'en-tête plutôt que de supposer des positions.
  • Ouvrez avec newline="" ; ne découpez ni n'assemblez les lignes CSV à la main.
  • csv.DictReader lit les lignes comme des dictionnaires ; chaque cellule est une chaîne.
  • csv.writer / csv.DictWriter écrivent des lignes et mettent les guillemets pour vous.

À suivre : les données JSON, pour les enregistrements imbriqués qui ne tiennent pas dans un tableau plat.

Lab : ce qui est noté

  • Regrouper les cours de clôture par symbole avec read_closes25 pts
  • Enregistrer des transactions en CSV avec write_trades25 pts
  • Totaliser la valeur échangée par symbole avec total_by_symbol25 pts
  • Copier les lignes d'un symbole dans un nouveau fichier avec filter_rows25 pts
Explorateur · lab-17-1
▾ lab-17-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-17-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-17-1 revient aux fichiers de départ et le terminal est vidé. Votre solution actuelle sera perdue : cette action est irréversible.

Sera réinitialisé
  • main.py → code de départ
  • Historique du terminal et sortie des tests
  • Modifications non soumises
Sera conservé
  • Meilleur score du lab
  • Votre XP et votre série
  • Progression du cours et notes

Connectez-vous pour exécuter votre code.

Tous les cours sont gratuits à lire. Créez un compte ou connectez-vous pour exécuter du code, lancer les tests et soumettre ce lab.

  • IDE dans le navigateur avec terminal bash — rien à installer
  • Correction instantanée, XP et votre place dans le parcours
Créer un compteSe connecter
OU
Continuer avec GitHub