σμ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 10 · Ingénierie Python haute performance›Sujet 10.2·~45 minAvancé

Annotations de type et vérification statique

Position dans le parcoursModule 10 sur 11 · Sujet 2 sur 13
10.2 Annotations de type et vérification statique
—Score du lab— / 100XP total—Série—

Les annotations sont une documentation qu'un outil peut vérifier

Python est typé dynamiquement : une variable peut contenir n'importe quoi, et un mauvais type n'apparaît qu'à l'exécution de la ligne, peut-être en pleine séance. Les annotations de type permettent d'écrire ce qu'une fonction attend et retourne : def mid_price(bid: float, ask: float) -> float. Python les ignore à l'exécution. Leur intérêt est qu'un éditeur et un vérificateur statique comme mypy ou pyright les lisent et vous avertissent d'un mauvais appel avant même l'exécution, et qu'elles documentent la fonction mieux qu'un commentaire qui vieillit.

# Hints describe the function; Python does not enforce them when it runs
def mid_price(bid: float, ask: float) -> float:
    return (bid + ask) / 2

print(mid_price(100.0, 100.5))                      # 100.25
print(mid_price.__annotations__)                    # {'bid': <class 'float'>, 'ask': <class 'float'>, 'return': <class 'float'>}
print(mid_price(10, 12))                            # 11.0   an int is accepted where float is hinted
try:
    mid_price("a", "b")                             # a checker flags this line before the code runs
except TypeError as error:
    print("only fails when it runs:", error)       # only fails when it runs: unsupported operand type(s) for /

Conteneurs, None et unions

Les conteneurs natifs prennent le type de leurs éléments entre crochets : list[float], dict[str, float], tuple[str, float] (un type par position). Une valeur qui peut manquer s'écrit float | None, ce qui oblige l'appelant à gérer None ; le vérificateur se plaint s'il emploie le résultat comme un nombre sans l'avoir testé. Dans la fonction, un if x is None: return restreint le type, et la suite sait que c'est un float. Pour les arguments simplement lus, préférez un type général comme Sequence[float] (listes, tuples) à list[float], pour que plus d'appelants conviennent ; retournez un type concret, comme list[float].

# Containers, an optional result, and narrowing with an is None check
def best_quote(quotes: list[tuple[str, float]]) -> tuple[str, float] | None:
    if not quotes:
        return None
    return min(quotes, key=lambda quote: quote[1])

def describe(quotes: list[tuple[str, float]]) -> str:
    best = best_quote(quotes)
    if best is None:                                 # after this check the checker knows best is a tuple
        return "no quotes"
    venue, price = best
    return f"{venue} at {price:.2f}"

print(describe([("XNAS", 100.02), ("ARCX", 100.01)]))     # ARCX at 100.01
print(describe([]))                                       # no quotes

Formes de données, et le vérificateur au travail

Un dictionnaire à clés fixes, comme un ordre, vaut mieux décrit que laissé en dict. Un TypedDict ou une dataclass nomme chaque champ et son type : une faute comme order["quantiy"] devient une erreur dans l'éditeur au lieu d'une KeyError à 15 h 59. On lance le vérificateur en ligne de commande (mypy main.py) ; il affiche chaque endroit où le code contredit ses annotations et sort avec un code non nul, ce qui s'insère dans les contrôles automatisés que vous verrez plus tard. On peut ajouter les annotations progressivement : Any désactive la vérification d'une valeur, et le code non typé est simplement ignoré. Les annotations sont aussi des données, que des outils lisent à l'exécution avec typing.get_type_hints, exactement comme ce labo les vérifie.

# A TypedDict names the fields of an order; the checker would flag order["quantiy"]
from typing import TypedDict

class Order(TypedDict):
    symbol: str
    quantity: int
    price: float

def notional(order: Order) -> float:
    return order["quantity"] * order["price"]

order: Order = {"symbol": "AAPL", "quantity": 100, "price": 184.5}
print(notional(order))                              # 18450.0
print(Order.__annotations__)                        # {'symbol': <class 'str'>, 'quantity': <class 'int'>, 'price': <class 'float'>}
# The hints can be read at run time, which is how tools (and this lab) inspect a function
import typing

def apply_fee(prices: typing.Sequence[float], fee_rate: float = 0.001) -> list[float]:
    return [price * (1 + fee_rate) for price in prices]

hints = typing.get_type_hints(apply_fee)
print(hints["fee_rate"], hints["return"])           # <class 'float'> list[float]
print(typing.get_origin(hints["prices"]).__name__)  # Sequence
print(apply_fee((100.0, 200.0)))                    # a tuple is accepted: [100.1, 200.2]
Les annotations ne sont pas une validationUne annotation n'arrête pas une mauvaise valeur à l'exécution : les données qui arrivent d'un fichier, d'une API ou d'un websocket restent ce qu'elles sont. Vérifiez explicitement les données externes (ou avec une bibliothèque qui construit des objets à partir des annotations), et utilisez les annotations pour attraper les erreurs dans vos propres appels entre fonctions. Un vérificateur au vert veut dire que les annotations s'accordent entre elles, pas que les nombres sont justes ; les tests font toujours ce travail.
  • Les annotations (bid: float, -> float) documentent une fonction et sont ignorées à l'exécution ; un vérificateur comme mypy les lit.
  • Les conteneurs prennent des types d'éléments (list[tuple[str, float]]) ; une valeur absente est float | None ; les arguments en lecture seule peuvent être un Sequence[float] général.
  • Utilisez TypedDict ou dataclass pour les enregistrements, lancez le vérificateur dans vos contrôles automatisés, et validez toujours les données externes et testez les nombres.

À suivre : les tests avec pytest, fixtures, cas paramétrés et les contrôles qui gardent une stratégie honnête.

Lab : ce qui est noté

  • Annoter des nombres avec mid_price25 pts
  • Typer un conteneur avec best_quote25 pts
  • Admettre une valeur absente dans safe_ratio25 pts
  • Accepter n'importe quelle séquence dans apply_fee25 pts
Explorateur · lab-118-1
▾ lab-118-1
…
bash · dans le navigateur
learner@quantcraft:~/lab-118-1$
Python pas encore chargéPythonLn 1, Col 1Spaces: 4UTF-8

Réinitialiser ce sujet ?

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