σμ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.18·~35 minDébutant

Données JSON

Position dans le parcoursModule 1 sur 11 · Sujet 18 sur 33
1.18 Données JSON
—Score du lab— / 100XP total—Série—

Des données imbriquées en texte

Le JSON est le format courant des fichiers de configuration et des données échangées entre programmes et API web. Il est fait d'objets {"clé": valeur}, de tableaux [1, 2], de chaînes, de nombres, de true/false et de null. Cela correspond directement à Python : les objets deviennent des dictionnaires, les tableaux des listes, true/false deviennent True/False et null devient None. Contrairement à un tableau CSV, le JSON peut s'imbriquer : un ordre peut contenir une liste d'exécutions, chacune avec ses propres champs.

import json

# Text to Python: loads() ("load string")
text = '{"symbol": "AAPL", "fills": [{"price": 184.25, "qty": 100}], "open": true, "note": null}'
order = json.loads(text)
print(order["fills"][0]["price"])   # 184.25
print(order["open"], order["note"]) # True None

# Python to text: dumps() ("dump string")
print(json.dumps({"symbol": "AAPL", "qty": 200}))  # {"symbol": "AAPL", "qty": 200}

Fichiers : load et dump

Les versions sans s travaillent sur des fichiers : json.load(file) lit et analyse un fichier ouvert, et json.dump(data, file) l'écrit. Passez indent=2 pour rendre le fichier lisible par des humains et sort_keys=True pour un ordre de clés stable, ce qui garde les différences petites dans le contrôle de version. Ouvrez toujours avec with et encoding="utf-8".

import json

# Save a config, then load it back
config = {"fee": 0.001, "symbols": ["MSFT", "AAPL"], "limits": {"max_qty": 500}}
with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2, sort_keys=True)

with open("config.json", encoding="utf-8") as file:
    print(file.read())
    # {
    #   "fee": 0.001,
    #   "limits": {
    #     "max_qty": 500
    #   },
    #   "symbols": [
    #     "MSFT",
    #     "AAPL"
    #   ]
    # }

with open("config.json", encoding="utf-8") as file:
    print(json.load(file) == config)  # True

Ce qui ne survit pas au voyage

Le JSON n'a que peu de types, donc certaines valeurs Python changent en route. Les tuples reviennent en listes, les clés de dictionnaire reviennent toujours en chaînes ({1: "a"} revient en {"1": "a"}), et les ensembles, dates et objets personnalisés ne peuvent pas du tout être sérialisés (TypeError) tant qu'on ne les convertit pas, par exemple une date avec .isoformat() ou un ensemble avec sorted(...). Rappelez-vous aussi que NaN et l'infini ne sont pas du JSON valide.

import json
from datetime import date

# Tuples become lists, int keys become strings
data = {"pair": (1, 2), 7: "seven"}
print(json.loads(json.dumps(data)))  # {'pair': [1, 2], '7': 'seven'}

# A date has to be converted by hand
today = date(2025, 1, 2)
print(json.dumps({"day": today.isoformat()}))  # {"day": "2025-01-02"}

Entrée invalide

Un texte venu de l'extérieur, comme un message d'une bourse, peut ne pas être du JSON valide. json.loads lève alors json.JSONDecodeError, une sorte de ValueError, et un JSON valide peut quand même manquer de la clé voulue (KeyError) ou avoir une autre forme (TypeError). Entourez l'analyse d'un try/except et décidez ce qu'un message invalide signifie pour votre programme. Le prochain sujet traite des exceptions en détail.

import json

# Bad input raises, so catch it where you parse
def get_price(text):
    try:
        return json.loads(text)["price"]
    except (ValueError, KeyError, TypeError):
        return None

print(get_price('{"price": 184.25}'))  # 184.25
print(get_price("not json"))           # None
print(get_price('{"symbol": "AAPL"}')) # None
Ne fabriquez jamais du JSON en collant des chaînesUn guillemet, une barre oblique inverse ou une lettre non ASCII dans une valeur casse un JSON fabriqué à la main. Construisez un dictionnaire Python et laissez json.dumps ou json.dump produire le texte, et json.loads ou json.load le lire. Même principe pour fusionner des réglages : copiez avant de modifier, afin qu'une configuration ne déborde pas sur une autre.
  • json.loads(text) / json.dumps(data) travaillent sur des chaînes ; json.load(file) / json.dump(data, file) sur des fichiers.
  • indent=2 et sort_keys=True rendent les fichiers lisibles et stables.
  • Une entrée invalide lève ValueError, KeyError ou TypeError : interceptez ce que vous attendez.

À suivre : les exceptions et la gestion des erreurs, pour que vos programmes échouent clairement et se rétablissent quand il le faut.

Lab : ce qui est noté

  • Totaliser les ordres d'un fichier JSON avec order_total25 pts
  • Enregistrer des réglages en JSON lisible avec save_config25 pts
  • Lire un message de cotation en toute sécurité avec parse_quote25 pts
  • Superposer des réglages aux valeurs par défaut avec merge_configs25 pts
Explorateur · lab-18-1
▾ lab-18-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-18-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

Tout le contenu de lab-18-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