Strasmore Research
Apprendre Matt ConnorPar Matt Connor

Apprendre le trading quantitatif avec un livre open source

Un livre open source présente le parcours complet du trading quantitatif, les étapes où les débutants s’arrêtent et ce qui s’applique aux actions américaines.

Un livre open source sur le trading quantitatif est un programme pédagogique public et gratuit. Il décrit l’ensemble du parcours, des données brutes à l’ordre exécuté, dans l’ordre où un débutant le découvre. Le manuscrit de XQuant: Everyone Can Be a Quantitative Trader, publié sur GitHub par xingwudao, en est un exemple clair, avec 686 stars en août 2026. Ses neuf chapitres suivent le parcours de presque tous les cursus de trading quantitatif. Cette page reprend ce parcours étape par étape, précise le problème propre à chacune et indique quelles parties restent valables lors du passage des actions A chinoises aux actions américaines.

Que contient un livre open source consacré au trading quantitatif ?

Si l’on retire la marque de tout programme destiné aux débutants, il reste cinq étapes, dans cet ordre : acquérir et nettoyer les données, en tirer un signal, tester ce signal sur l’historique, déterminer la taille de la position, puis envoyer l’ordre et payer les coûts. La table des matières de XQuant, telle qu’elle se présentait au commit 016b66e du 14 juillet 2026, couvre le même périmètre en neuf chapitres.

  • Préparation, puis chapitre un : exécuter une stratégie complète de bout en bout.
  • Chapitre deux, que faut-il acheter : commencer avec trois ETF.
  • Chapitre trois, quelle quantité acheter : trois méthodes d’allocation, comparées entre elles.
  • Chapitre quatre, quand trader : rebalancement, stop loss, take profit.
  • Chapitre cinq, comment déterminer si une stratégie est réellement performante : quatre angles d’analyse.
  • Chapitre six, ne pas se réjouir trop vite : éviter le surajustement.
  • Chapitre sept, de l’idéal au réel : exécuter les trades.
  • Chapitre huit, la vie après le lancement : suivi, diagnostic, itérations.
  • Chapitre neuf, trouver de nouvelles opportunités : introduction à la recherche factorielle.

L’ordre des chapitres mérite attention. Le sizing intervient au chapitre trois, avant les deux chapitres consacrés au backtest, et la recherche factorielle arrive en dernier. Les parcours autodidactes suivent généralement l’ordre inverse : une idée factorielle d’abord, un backtest ensuite, et aucune règle de sizing. Le dépôt d’exercices associé (333 étoiles à la même date) est organisé autour de spécifications écrites plutôt que de code finalisé. Le lecteur demande à un assistant IA de les implémenter. Savoir lire du code que l’on n’a pas écrit reste la compétence qui détermine tout le reste, car chacun des échecs décrits ensuite se dissimule dans un détail d’implémentation.

Première étape : obtenir les données, puis définir l’univers

Le nettoyage est la partie visible du travail sur les données : prints erronés, séances manquantes, ajustements liés aux splits et aux dividendes. Choisir les valeurs à étudier est la partie invisible. C’est à ce stade que le biais de survie intervient, avant même la première ligne de code de la stratégie. Prenez tous les tickers américains ayant enregistré une transaction pendant une semaine de juin, année par année, puis demandez combien étaient encore cotés durant la même semaine de 2026.

RequêteTickers US négociés au cours d’une semaine de juin, et nombre de tickers encore négociés en juin 2026
Le SQL exact derrière chaque chiffre
WITH june_week AS (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
           ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
      AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
      AND volume > 0
    GROUP BY year, ticker
),
survivors AS (
    SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
       uniqExact(ticker) AS tickers_traded,
       uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
       round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
             / uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY year
Run this yourself

Parmi les 8224 tickers ayant été négociés durant cette semaine de 2016, 50% étaient encore cotés durant la même semaine de 2026. Les autres ont été rachetés, ont fusionné, ont changé de nom ou ont été retirés de la cote. Un backtest construit à partir de la composition actuelle n’étudie que les valeurs qui ont survécu. Il attribue ainsi à une stratégie la détention de sociétés sélectionnées a posteriori. Un flux de données destiné aux débutants vous fournira cette liste de survivants sans avertissement : le guide API gratuite de données de marché actions explique ce que ces flux incluent ou n’incluent pas.

Deuxième étape : transformer les données en signal

Un signal est une règle qui attribue une note à une action à un moment donné. Un facteur est un signal dont vous pensez qu’il reste valable pour de nombreuses actions à la fois. Le momentum, la value et la faible volatilité en sont les exemples classiques. À ce stade, l’erreur consiste à tester des règles jusqu’à ce que l’une d’elles fonctionne. Vingt variantes d’un croisement de moyennes mobiles sur une décennie d’un seul indice produiront toujours un gagnant. Ce gagnant sera celui qui se sera le mieux ajusté au bruit. Les protections sont peu séduisantes : définissez la règle avant de la mesurer, mettez de côté une partie de l’historique que vous ne consultez jamais, comptabilisez toutes les variantes testées et privilégiez un nombre réduit de paramètres ajustables. XQuant consacre tout un chapitre à ce sujet avant la recherche de facteurs. C’est le bon ordre.

Étape trois : le backtest, là où la plupart des débutants s’arrêtent

C’est l’étape qui met fin à la plupart des projets autodidactes. Elle y met fin discrètement, avec une courbe de capital très convaincante. Le biais de survie, évoqué plus haut, est la première des deux erreurs. Le biais d’anticipation est la seconde : la stratégie utilise une donnée que le marché n’avait pas encore publiée au moment où l’ordre devait être exécuté. Le cas le plus fréquent est une règle calculée à partir du cours de clôture du jour, puis exécutée à ce même cours de clôture. Mesurez l’écart que cette hypothèse ignore.

RequêteÉcart moyen entre la clôture d’une séance et l’ouverture de la séance suivante, par mois
Le SQL exact derrière chaque chiffre
WITH sessions AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMin(open, window_start) AS session_open,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'NVDA')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
gaps AS (
    SELECT ticker,
           session,
           toFloat64(session_open) AS open_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
       formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY month
Run this yourself

Sur July 2026, l’écart moyen entre une clôture et le prochain cours d’ouverture s’est établi à 40.8 points de base pour SPY et à 107.4 pour NVDA. Un point de base correspond à un centième de point de pourcentage. Les 24 mois du panel, à partir de August 2024, sont tous supérieurs à zéro. Un backtest qui prend une décision à la clôture et exécute l’ordre à cette même clôture empoche gratuitement cet écart sur chaque trade, ce qu’aucun ordre réel ne peut faire. Le biais d’anticipation dans les backtests décompose ce mécanisme, et pourquoi les actions enregistrent des gaps pendant la nuit explique le gap lui-même.

Étape quatre : déterminer le montant à acheter

Le problème est l’absence de règle. La plupart des traders autodidactes n’établissent jamais de règle de dimensionnement. Ils en ont donc une par défaut, généralement le même montant en dollars par valeur, ou le montant de liquidités disponible. Un même montant en dollars ne correspond pas à un même risque.

RequêteDouze mois de variations quotidiennes : volatilité annualisée et pire séance, huit valeurs
Le SQL exact derrière chaque chiffre
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
rets AS (
    SELECT ticker,
           toFloat64(session_close) AS close_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM daily
)
SELECT ticker,
       round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
       round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESC
Run this yourself

Sur les douze mois se terminant le 31 juillet 2026, COIN a affiché une volatilité annualisée de 68%, contre 12.7% pour SPY, à l’extrémité la plus calme de l’échantillon. Sa pire séance s’est achevée 13.34% sous le cours de clôture précédent, tandis que la pire séance de SPY s’est soldée par 2.69%. Investir le même montant en dollars dans chaque valeur expose à des variations quotidiennes très différentes. C’est cette variation, et non le signal, que le débutant subit réellement. dimensionnement de position selon le critère de Kelly présente une réponse formelle, tandis que risque de concentration montre la forme de la réponse empirique.

Cinquième étape : l’exécution et les coûts oubliés par un backtest

Deux coûts, dont un seul est visible. Les commissions et les frais réglementaires apparaissent sur le relevé. Le slippage n’y figure pas : c’est l’écart entre le prix affiché à l’écran et le prix obtenu. Son niveau minimal correspond au bid-ask spread, c’est-à-dire la distance entre la meilleure offre d’achat et la meilleure offre de vente à cet instant. Les acheteurs paient l’ask et les vendeurs frappent le bid : un aller-retour franchit donc le spread deux fois. Le spread n’est pas constant.

RequêteSpread coté moyen par tranche d’une demi-heure en heure de l’Est : AAPL et KO, vendredi 17 juillet 2026
Le SQL exact derrière chaque chiffre
WITH quotes AS (
    SELECT ticker,
           toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
           toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('AAPL', 'KO')
      AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
      AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
      AND bid_price > 0
      AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
       round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
       round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_time
Run this yourself

Le panneau couvre 16 intervalles d’une demi-heure sur un vendredi, du 09:00 intervalle avant la cloche d’ouverture au 16:30 intervalle après la clôture. Le spread coté sur AAPL était de 10.53 points de base dans le premier intervalle et de 3.27 dans le dernier, contre 28.87 et 8.04 pour KO. Les cotations les plus serrées de la séance se situent au milieu du graphique, entre ces deux extrémités. Une stratégie qui intervient à l’ouverture sur deux des valeurs les plus liquides du marché supporte un coût différent de sa version de milieu de séance, et un backtest fondé sur une hypothèse de coûts nuls ne chiffre correctement ni l’une ni l’autre. Le bid-ask spread définit ce nombre, pourquoi les spreads s’élargissent à l’ouverture explique la courbe, et combien coûte le trading d’une action additionne le coût d’un aller-retour complet. Entre un backtest propre et l’argent réel, il reste une étape : le paper trading avant de passer à l’argent réel.

Quelles parties d’un cursus sur les actions A peuvent être transposées aux actions américaines ?

XQuant et ses équivalents sont conçus pour les actions et les ETF de catégorie A chinoises. La méthode reste valable dans son ensemble : ordre des étapes, définitions, discipline contre le surajustement, habitude d’inscrire les coûts comme un poste à part entière plutôt que comme une réflexion secondaire, et chaque élément du calcul de la taille de position. Les barres de prix restent des barres de prix. En revanche, la réglementation qui les encadre ne se transpose pas.

  • Les actions A sont soumises à une véritable restriction T+1 : une action achetée aujourd’hui ne peut être vendue qu’à la séance suivante. Aux États-Unis, le T+1 est une convention de règlement et n’empêche pas les opérations intraday, même si la règle du pattern day trader limite les comptes sur marge de moins de 25 000 dollars à trois day trades sur cinq jours ouvrés.
  • Les actions A des marchés principaux sont limitées à une variation quotidienne de 10 %, contre 20 % sur les marchés de croissance. Les actions américaines ne sont soumises à aucun plafond quotidien ; les interruptions résultent plutôt de bandes de volatilité et de suspensions liées à l’actualité.
  • Les ordres sur actions A se négocient par lots de 100 actions. De nombreux brokers américains exécutent des fractions d’action, ce qui modifie ce qu’une règle de sizing peut réellement exprimer.
  • La Chine applique un droit de timbre à la vente. Aux États-Unis, les vendeurs paient de faibles frais réglementaires, d’une nature et d’un montant différents.
  • La structure des séances diffère également, avec notamment une pause de la mi-journée à Shanghai et à Shenzhen. Les horaires de la Bourse américaine sont continus et se terminent par une enchère de clôture.

Tout coût ou paramètre de calendrier copié d’un cours dans votre propre code est un bug qui attend la première exécution en réel.

Épinglez la référence, pas le README

Le dépôt ne comporte aucune release taguée en août 2026. La citation durable est donc un commit : 016b66e, daté du 14 juillet 2026. C’est important pour un livre encore en cours de rédaction. Les numéros de chapitre changent, les fichiers README sont réécrits et les titres se déplacent. Un lien qui pointait vers le chapitre sept peut ainsi pointer discrètement vers autre chose. Citez le commit et sa date. Notez le titre du chapitre que vous avez lu plutôt que son numéro. Vos notes resteront vérifiables un an plus tard. Le manuscrit est publié sous licence CC BY-NC-SA 4.0, tandis que les scripts de build sont sous licence MIT. Cette même discipline constitue la dernière leçon du programme : une stratégie que vous ne pouvez pas réexécuter à partir d’un instantané de données figé est un récit, pas un résultat.

FAQ

Peut-on apprendre le trading quantitatif avec un ouvrage open source gratuit ?

Pour la vue d’ensemble, oui. Un manuscrit ouvert vous permet de vérifier chaque affirmation à partir de sa source. En revanche, un ouvrage ne peut pas fournir les données, les coûts et les règles de votre propre marché. C’est précisément à ce niveau qu’un programme conçu pour une seule place cesse de correspondre à votre broker.

Quelle étape d’un cursus quantitatif bloque le plus souvent les débutants ?

Le backtest. Deux biais y améliorent artificiellement le résultat : le biais de survivance, lié à un univers constitué a posteriori, et le biais de regard vers l’avenir, lié à l’utilisation d’un prix qui n’avait pas encore été coté. Seuls 50% des tickers négociés pendant cette semaine de juin de 2016 l’étaient encore dix ans plus tard.

Quelle est la différence entre le biais de survivance et le biais de regard vers l’avenir ?

Le biais de survivance concerne l’univers : les valeurs testées ont été sélectionnées parce qu’elles ont survécu. Le biais de regard vers l’avenir concerne le calendrier : la stratégie utilise une donnée qui n’existait pas au moment où l’ordre devait être exécuté. Le premier gonfle la liste des valeurs. Le second améliore artificiellement le prix d’exécution.

Un cours de trading quantitatif consacré aux actions A chinoises fonctionne-t-il pour les actions américaines ?

La méthode fonctionne. Les règles de marché, non. Conservez l’ordre des étapes, la discipline contre le surajustement et la comptabilisation des coûts. Remplacez ensuite les flux de données, la restriction de vente à T+1, les limites de cours quotidiennes et les tailles de lots par leurs équivalents américains avant d’investir.


Chaque panneau ci-dessus correspond à une requête enregistrée, avec son SQL en dessous. Ouvrez-en une, remplacez les tickers ou les dates, puis exécutez-la vous-même sur le terminal Strasmore.

#quant#learning path#backtesting#open source#beginners