PagesBacktests · 16 / 29
Backtests
Utilisez le bouton Test (Exécution du code) de l'IDE QuantCraft pour ouvrir Run backtest. Vous y définissez les symboles, les données de prix, les données fondamentales facultatives, la fenêtre de simulation, le solde de départ et les coûts d'exécution, et (si votre script en utilise) les paramètres d'entrée pour une exécution unique. Le moteur appelle les rappels du cycle de vie de votre stratégie. Les résultats apparaissent dans les Résultats des tests ; la page OHLCV explique la forme des barres.
En haut du corps de la fenêtre, vous pouvez utiliser Load ou Save pour réutiliser un préréglage d'exécution (.qcs). Tout le reste est regroupé en jusqu'à trois onglets, afin de parcourir le formulaire avant de lancer le backtest.
Onglets de la fenêtre Run backtest
| Onglet | Ce que vous définissez |
|---|---|
| Script | Affiché uniquement lorsque le script déclare des entrées params.NAME. Valeurs des paramètres, plus Optimize (grille de force brute ou recherche génétique). Voir Paramètres d'entrée et Optimisation. |
| Symbol & data | Price feed (flux du courtier connecté ou QuantCraft B2), Symbol source, Asset class, Bar timeframe (flux du courtier) / Timeframe (B2), Additional timeframes (optional) pour rt.get_bar, Min bars (optional) (flux du courtier), Uses fundamentals (select if your strategy requires fundamental data), Include Fama-French factors (global) et Include calendar data (dividends, splits, earnings dates) (Premium / dérogation données gratuites ; activé par défaut). |
| Simulation | Date de début / de fin (par défaut : le dernier mois), warmup bars (par défaut 45), starting balance (par défaut 100 000), modèles de commission et de glissement. Voir Modèle de compte. |
Horloge / symbole principal : il n'y a pas de contrôle de symbole principal dans la fenêtre. Avec Selected symbols, l'horloge des barres utilise une constante SYMBOL de votre script (si ce symbole figure dans la liste chargée), sinon le premier symbole chargé. Avec Screener, il n'y a aucun symbole d'horloge — l'ensemble des symboles change au fil de l'exécution ; lisez donc l'historique de chaque symbole via ses propres décalages bar.close[i]. Voir Cycle de vie d'une stratégie.
Minuterie / on_timer : la fenêtre Run backtest ne définit pas d'intervalle de minuterie. on_timer concerne les exécutions forward / bulk / chart-forward qui exposent un contrôle de minuterie — pas les backtests de l'IDE.
Source des prix (flux du courtier ou B2)
Dans l'onglet Symbol & data, choisissez le flux de prix :
- Flux du courtier connecté — les unités de temps intrajournalières et quotidiennes sont disponibles (nécessite un compte de courtier connecté dont les identifiants sont configurés dans l'application).
- QuantCraft B2 — avec un forfait gratuit, seules les unités de temps OHLCV quotidienne (
d), hebdomadaire (w) et mensuelle (m) sont disponibles ; Premium débloque l'intrajournalier et des unités de temps B2 étendues. Vous devez être connecté à QuantCraft pour qu'un jeton de session puisse être envoyé pour les données OHLCV B2 (et pour les données fondamentales lorsqu'elles sont activées).
Ce choix est enregistré dans les préréglages d'exécution (.qcs) sous ohlcvSource ("alpaca" ou "b2").
Unité de temps des barres et classe d'actifs (flux du courtier uniquement)
Lorsque la source des prix est le flux du courtier connecté, vous pouvez définir :
| Champ | Rôle |
|---|---|
| Bar timeframe | Résolution des bougies pour l'exécution — par ex. 1 jour, 1 heure, 4 heures, 1 semaine et plusieurs barres en minutes (1 / 5 / 15 / 30 min). |
| Asset class | US equity ou Crypto — détermine la liste de symboles dans laquelle vous cherchez et la manière dont le courtier récupère les données. |
| Min bars (optional) | Si défini, une fois la plage de dates appliquée, le moteur ne conserve que les N barres les plus récentes. Laissez vide pour utiliser toute la plage impliquée par vos dates de début et de fin. |
Lorsque la source des prix est B2, vous ne choisissez que Timeframe : Daily, Weekly ou Monthly avec un forfait gratuit ; Premium ajoute l'intrajournalier et des unités de temps B2 étendues (voir les codes B2 dans Données OHLCV et de barres).
Unités de temps supplémentaires (facultatif)
Utilisez Additional timeframes dans Symbol & data pour charger des tailles de barre supplémentaires en plus de votre unité de temps principale. Dans le code de stratégie, lisez-les avec rt.get_bar(Timeframe.X, shift) — voir Données OHLCV et de barres et Cycle de vie d'une stratégie.
- Sélectionnez à volonté toute unité de temps supplémentaire dont votre stratégie a besoin (par ex. quotidienne lorsque votre barre principale est de 5 minutes).
- L'unité de temps principale est aussi disponible via
rt.get_barsans avoir à la lister sous Additional timeframes. - Renvoie
Nonesi cette unité de temps n'a pas de tampon pour l'exécution, avec une source Screener, ou lorsque les données sont indisponibles. - Dans un backtest,
get_barne voit jamais que les barres jusqu'à l'étape courante et lit toujours les barres du symbole d'horloge — pour l'historique d'un autre symbole, utilisez les décalagesbar.close[i]de ce symbole. - Les réglages peuvent être enregistrés dans les préréglages d'exécution (.qcs) sous
secondaryTimeframes.
Symboles
Source des symboles
Symbol source dans l'onglet Symbol & data détermine les symboles négociés par le backtest :
| Source | Ce qu'elle fait |
|---|---|
| Selected symbols | Négocie la liste fixe que vous choisissez, plus tout ce que vous ajoutez avec Paste tickers. |
| Screener | Réexécute un filtre au fil du backtest et négocie ce qui correspondait à ce moment de la simulation. |
Avec Screener sélectionné, vous configurez le filtre lui-même :
| Réglage | Ce qu'il fait |
|---|---|
| Screener source | Screener preset ou Python script. |
| Sort column / Direction | Comment les résultats du préréglage sont classés avant l'application de la limite. |
| Rank direction | Pour les scripts — quelle extrémité de votre score rank() prendre en premier. |
| Limit | Combien de symboles négocier à chaque rééquilibrage. 0 prend tous les résultats. |
| Refresh interval (days) | Fréquence de réexécution du filtre, en jours calendaires simulés. Les scripts exigent 7 jours ou plus. |
| Keep tickers with an open position | Garde un symbole négociable après qu'il ne correspond plus, afin qu'une position ouverte puisse encore être gérée. |
Limites d'un backtest piloté par screener : il nécessite des dates de début et de fin explicites ; les unités de temps supplémentaires ne sont pas prises en charge ; un filtre par script Python nécessite un Refresh interval d'au moins 7 jours ; et Debug Test ne prend pas en charge une source Screener (il s'arrête avec un message vous demandant de passer à Selected symbols). Avec les données fondamentales activées, chaque symbole filtré reçoit automatiquement les siennes. Les résultats incluent un onglet Screener Output à côté de Logs, montrant chaque rééquilibrage sous forme de date réductible avec les symboles négociés pour cette fenêtre. Voir Screener pour construire les filtres et pour les détails sur l'horodatage point-in-time et le biais de survie.
Selected symbols
Dans Symbol & data, choisissez un ou plusieurs symboles pour l'exécution :
- Avec le flux du courtier connecté, la liste provient de l'univers d'actifs de votre courtier (actions ou crypto selon Asset class). Vous pouvez rechercher et faire une sélection multiple.
- Avec B2, la liste provient du même catalogue que les chemins de données fondamentales sur le serveur.
Règles :
- Au moins un symbole est requis.
- Les symboles sont normalisés en majuscules pour l'exécution.
- Caractères valides : lettres, chiffres,
.et-(typiques des suffixes de places boursières commeBRK.BouRHM.XETRA).
Le premier symbole dans l'ordre de votre sélection est le symbole d'horloge par défaut, sauf si votre stratégie définit un SYMBOL = "..." de niveau supérieur correspondant à un symbole chargé. La fenêtre n'a pas de contrôle séparé de symbole principal.
Données fondamentales (facultatif)
Dans Symbol & data, cochez Uses fundamentals (select if your strategy requires fundamental data) lorsque votre stratégie lit l'argument fundamentals dans on_bar / on_tick (backtest), ou dans on_timer lors d'une exécution forward, ou utilise une logique tenant compte des données fondamentales.
La case est affichée lorsque les fonctions de données fondamentales sont activées pour votre version, mais elle est désactivée (avec une indication Premium) sauf si vous avez Premium ou si l'accès aux données gratuites est activé. Lorsque les données fondamentales sont activées :
- Vous devez être connecté (le jeton QuantCraft est envoyé pour charger les fichiers de données fondamentales B2).
- Choisissez un ou plusieurs lots de données fondamentales dans la liste à sélection multiple (chemins comme
fundamentals/AAPL.json.gz). La boîte de dialogue affiche le chemin normalisé sous chaque sélection.
Important : les symboles OHLCV et les symboles de données fondamentales sont indépendants. Vous pouvez backtester RNMBY via le flux du courtier tout en chargeant les données fondamentales de RHM.XETRA — l'interface vous rappelle que, dans ce cas, vous devez passer le bon symbole à fundamentals.current(..., symbol="RHM.XETRA") (ou équivalent) dans le code.
Lorsque plusieurs lots de données fondamentales sont sélectionnés, le moteur construit une table par chemin. Le lot de données fondamentales principal utilisé pour les instantanés alignés sur les barres correspond par défaut au symbole négocié (ou au premier lot par ordre alphabétique) ; dans les exécutions multi-symboles et Screener, passez toujours symbol= à fundamentals.current / get_data_with_offset, car le lot principal peut ne pas être le symbole sur lequel vous vous trouvez.
Facteurs de Fama-French (facultatif)
Dans Symbol & data, cochez Include Fama-French factors (global) lorsque votre stratégie lit des rendements de facteurs mensuels mondiaux via fama_french.qc. Voir Facteurs de Fama-French pour l'API complète.
Lorsque les facteurs sont activés :
- Vous avez besoin de Premium (ou de l'accès aux données gratuites lorsqu'il est activé) et devez être connecté.
- La case est cochée par défaut lorsque la restriction d'accès aux données le permet. Décochez pour ignorer les données de facteurs pour cette exécution.
- Les symboles OHLCV, les lots de données fondamentales et les facteurs de Fama-French sont indépendants — activez la combinaison dont vous avez besoin.
- Il n'y a pas d'argument de rappel
factors=— importezquantcraft.fama_frenchet lisezfama_french.qcdans les rappels (on_init,on_bar,on_tick, …).
Données de calendrier et opérations sur titres (facultatif)
Dans Symbol & data, Include calendar data ajoute à votre backtest l'historique des dividendes, l'historique des fractionnements, les dates de résultats et les dépôts SEC. Il est activé par défaut, et votre choix est mémorisé pour l'exécution suivante.
Pourquoi c'est important
Les barres de prix d'un backtest sont non ajustées. Sans données de calendrier, un fractionnement 4 pour 1 apparaît comme un effondrement de 75 % du prix en une nuit, et votre position simulée s'effondre avec lui. Les dividendes n'arrivent pas non plus, ce qui sous-estime discrètement le rendement total de toute position détenue longtemps.
Sous-options
Deux sous-options contrôlent la manière dont les opérations sont appliquées aux positions ouvertes pendant la simulation :
| Sous-option | Ce qu'elle fait |
|---|---|
| Adjust positions for stock splits | À la date d'effet du fractionnement, le nombre d'actions est multiplié par le ratio et le prix de revient divisé par celui-ci. Les prix de stop et d'objectif sont également remis à l'échelle. Comme qty × entry_price est inchangé, votre courbe de capital reste continue à travers le fractionnement. |
| Credit dividends to cash | À la date ex-dividende, qty × amount est ajouté aux espèces pour les positions longues et retranché pour les positions courtes (les vendeurs à découvert doivent le dividende au prêteur). Cela alimente le capital et toutes les métriques de rendement, mais pas realized_pnl. |
Les deux sous-options sont activées par défaut lorsque les données de calendrier le sont.
Remarque sur l'estimation de la date ex-dividende : EDGAR ne publie pas les dates ex-dividende. Sauf si des données de la bourse étaient disponibles, la date ex-dividende est estimée à partir de la date de déclaration (précise à environ ±7 jours) et est marquée
est.dans les Résultats des tests. Les dividendes estimés sont crédités par défaut ; pour les ignorer, définissezdividendDatePolicysurexact_only(ouoff) dans un préréglage .qcs — la fenêtre n'a pas de contrôle pour cela. Filtrez surd.estimateddans le code si votre stratégie est sensible à la date exacte.
Univers de screener
Les données de calendrier fonctionnent avec une source de symboles Screener. Les calendriers se chargent une fois que le filtre a résolu la liste complète des symboles ; les symboles retenus mais sans barres de prix ne génèrent aucune requête de calendrier. Un filtre large peut inclure des symboles sans calendrier sur le serveur — le journal d'exécution indique leur nombre au lieu d'échouer.
Où le voir
- Panneau de sortie — une ligne
[calendar]par opération sur titres appliquée pendant l'exécution, plus une ligne de synthèse à la fin. - Test Results — des lignes Split et Dividend apparaissent dans le tableau des trades clôturés (qui s'intitule alors Closed trades & events), avec le ratio ou le montant par action et l'impact en espèces.
Voir Données de calendrier pour l'API complète BacktestCalendar et l'argument de rappel calendar.
Simulation — dates, solde et coûts d'exécution
Tout ce qui suit se trouve dans l'onglet Simulation :
| Champ | Rôle |
|---|---|
| Start date | Obligatoire (par défaut il y a environ un mois). Premier jour calendaire UTC inclus dans la fenêtre d'exécution (YYYY-MM-DD). |
| End date | Obligatoire. Dernier jour calendaire UTC inclus. Doit être égal ou postérieur à la date de début. |
| Warmup bars (indicators) | Barres supplémentaires chargées avant la date de début (même unité de temps que vos barres) afin que les moyennes mobiles et indicateurs similaires disposent d'un historique. Les rappels ne s'exécutent toujours qu'entre les dates de début et de fin. La valeur par défaut est 45 ; saisissez 0 pour désactiver le préchauffage supplémentaire. |
| Starting balance | Obligatoire. Espèces initiales du PaperAccount simulé (par défaut 100 000). |
| Commission / slippage | Comment les exécutions sont ajustées pour les coûts de trading — voir ci-dessous et Modèle de compte. |
La fenêtre Run backtest ne configure pas d'intervalle de minuterie.
on_timern'est disponible que pour les exécutions forward (chart forward test, bulk forward / QuantCloud) lorsquetimerIntervalMsest défini. Voir Cycle de vie d'une stratégie.
Un stop-loss / take-profit / dimensionnement du risque par défaut facultatifs peuvent encore apparaître dans les préréglages .qcs lorsqu'ils sont présents, mais la fenêtre Run backtest n'expose actuellement pas d'entrées SL/TP / risque. Configurez-les dans le code ou via des préréglages si vos utilitaires les prennent en charge — voir Modèle de compte et Préréglages d'exécution (.qcs).
Commission et glissement
| Réglage | Rôle |
|---|---|
| Commission model | Par action (par défaut), par trade, ou nul |
| Commission cost | Coût par action ou frais fixes par ordre ($) — par défaut 0,001 $ par action |
| Minimum trade cost | Plancher par ordre avec une commission par action ($) — par défaut 0 $ |
| Slippage model | Part du volume (par défaut), écart fixe, ou nul |
| Volume limit / Price impact | Paramètres du glissement par part du volume (volume_limit réduit aussi la quantité à l'ouverture) |
| Spread | Écart total par action pour le glissement à écart fixe ($) |
Les réglages de simulation peuvent être enregistrés dans les préréglages d'exécution (.qcs).
Paramètres de script (exécution unique)
Si votre stratégie importe from quantcraft.inputs import params (les anciens chemins quantcraft.inputs_module / ide.inputs_module sont toujours reconnus pour les scripts existants) et référence params.NAME, la boîte de dialogue affiche un onglet Script avec une ligne par nom découvert : Parameter, Type (int / float / str / bool) et Value.
Remplissez chaque ligne avant de démarrer — une valeur est requise pour chaque paramètre déclaré. Elles sont envoyées sous forme de chaînes et converties par le moteur avant le chargement de votre fichier ; params.PERIOD (par exemple) a donc déjà le bon type Python lorsque votre module s'exécute.
Dans le même onglet, vous pouvez activer Optimize pour une recherche en grille ou génétique — voir Optimisation. Laissez Optimize décoché pour un backtest unique normal.
Ce qui se passe au démarrage de l'exécution
L'application valide le formulaire (dates, symboles, solde, données fondamentales si activées, et types des paramètres de script). En cas de succès, elle démarre un backtest avec la configuration assemblée ; la progression et les journaux apparaissent dans le panneau Output, et les résultats structurés s'ouvrent dans Test Results.
Aide-mémoire
| Sujet | Où c'est défini |
|---|---|
| Flux du courtier ou prix B2 | Symbol & data → flux de prix (ohlcvSource dans .qcs). |
| Unité de temps | Bar timeframe (flux du courtier) ou Timeframe (B2 : d / w / m avec un forfait gratuit ; plus avec Premium). |
| Unités de temps supplémentaires | Sélection multiple Additional timeframes — pour rt.get_bar(Timeframe.X, shift). |
| Classe d'actifs | US equity / Crypto (flux du courtier uniquement). |
| Tronquer aux N dernières barres | Min bars (flux du courtier uniquement, facultatif). |
| Quoi négocier | Symbol source : Selected symbols (sélection multiple) ou Screener (filtre piloté par les données fondamentales — voir Screener). |
| Symbole d'horloge | SYMBOL du script s'il est chargé ; sinon le premier symbole (pas de contrôle dans la fenêtre) ; aucun avec une source Screener. |
| États financiers | Uses fundamentals + sélection multiple des données fondamentales (automatique avec une source Screener) ; nécessite une connexion. |
| Rendements de facteurs mondiaux | Include Fama-French factors (global) — voir Facteurs de Fama-French. |
| Dividendes, fractionnements, dates de résultats | Include calendar data — activé par défaut ; voir Données de calendrier. |
| Fenêtre calendaire | Start date / End date dans Simulation (obligatoires). |
| Historique des indicateurs avant le début | Warmup bars dans Simulation. |
| Espèces de départ | Starting balance dans Simulation. |
| Commission / glissement | Onglet Simulation — voir Modèle de compte. |
on_timer | Absent de Run backtest — exécutions forward avec timerIntervalMs (Cycle de vie d'une stratégie). |
on_tick | Backtest : quatre ticks OHLC synthétiques par barre (pas d'historique de ticks réel). Exécutions forward : chaque mise à jour de prix du courtier — voir Cycle de vie d'une stratégie. |
| Paramètres ajustables dans le code | Onglet Script (params.*), valeurs uniques par exécution (ou Optimize). |
Conseils
- Si les symboles du flux du courtier ne se chargent jamais, ouvrez Trade une fois ou vérifiez la connexion à votre courtier ; pour B2, vérifiez que vous êtes connecté et que le catalogue de symboles est chargé.
- Le préchauffage n'étend que l'historique chargé — il n'ajoute pas de jours de trading en dehors de votre plage de dates.
- N'attendez pas
on_timerdans le backtest de l'IDE — il n'y a pas de contrôle de minuterie dans cette fenêtre. Utilisez plutôton_bar/on_tick. Les minuteries s'appliquent aux exécutions forward lorsquetimerIntervalMsest configuré. on_ticken backtest utilise des OHLC synthétiques issus de chaque barre (quatre appels par barre) — pas de vraies données de ticks. Testez la logique de ticks en direct dans des exécutions forward (Cycle de vie d'une stratégie).- Faites correspondre les lots de données fondamentales aux symboles que vous lisez réellement dans le code lorsque les symboles OHLCV et fondamentaux diffèrent.
- Utilisez Min bars avec parcimonie — il est facile de raccourcir une exécution plus que prévu sans le vouloir.

