Interpréter les coûts d’un backtest lorsque les paramètres de configuration sont inactifs
Résumé
Cette note de configuration distingue les paramètres qui figurent dans l’identité d’un backtest de ceux qui influent réellement sur les coûts de trading simulés. Dans l’étude de cas décrite, toutes les exécutions enregistrées utilisent un parcours vectorisé fondé sur les rendements jusqu’à l’échéance. Les paramètres configurés pour le prix d’exécution, le taux de commission et le taux de slippage ne sont pas transmis à ce parcours ; les exécutions au cours acheteur ou vendeur relèvent d’un courtier événementiel que les exécutions vectorisées ne construisent pas. Ces paramètres restent dans la configuration, car leur suppression modifierait l’identité hachée des exécutions existantes.
Les coûts simulés sont lus séparément dans un fichier de configuration : écarts acheteur-vendeur à l’entrée et à la sortie des options, écarts estimés sur les couvertures à chaque rééquilibrage et commissions par contrat ou par action. La note indique que le champ enregistré pour le glissement de prix total est nul dans toute la population concernée, malgré l’imputation de coûts dans la simulation, car ce parcours n’enregistre pas les totaux de coûts. Une leçon utile pour l’audit : la valeur d’un paramètre de configuration ou l’absence d’une mesure de coût ne suffit pas, à elle seule, à établir ce qu’un backtest a coûté. Ces constats concernent l’implémentation spécifiée et doivent être revérifiés si son exécuteur ou le traitement des coûts change.
Idées clés
- Les paramètres de configuration peuvent modifier l’identité hachée d’une exécution même si le parcours d’exécution ne les utilise pas.
- Le parcours vectorisé décrit ici, fondé sur les rendements jusqu’à l’échéance, n’utilise pas les champs configurés de commissions et de glissement de prix exprimés en taux.
- Les coûts simulés effectivement appliqués proviennent de composantes distinctes pour les options, les couvertures et la liquidation.
- Un champ agrégé nul pour le glissement de prix ne prouve pas qu’aucun coût n’a été imputé dans la simulation.
- L’interprétation des coûts dépend de l’examen de l’exécuteur concerné et de son flux de données.
Étiquettes
Texte intégral
# base.yaml ```yaml # Three fields below are inert on the path this case study runs: `execution.execution_price`, # `commission.rate` and `slippage.rate`. Every registered backtest here is `ret_to_expiry`, # which `case_studies/utils/backtest_runner.py` routes to `_run_htm_daily_mtm`, and that call # is not passed `cost_spec` - the only thing that carries these rates into a run. The # `quote_side` fill is read by the event-driven broker, which a `rebalance.mode: vectorized` # case study never constructs. They still reach the registered `backtest_config` and so the # hashed identity, which is why they stay: removing them would re-key 879 backtests to delete # values nothing reads. # # The costs this case study actually pays come from `_htm_backtest.py`, which reads # `config/setup.yaml::costs.components` directly - per-leg entry spread from the real option # quotes, `hedge_spread.estimate_bps_of_notional` on every hedge rebalance, # `commission.option_per_contract` and `commission.equity_per_share`, plus an exit spread on # liquidation. Verified 2026-09-12; `total_slippage` is NULL on all 879 rows because the # vectorized path records no cost totals, not because nothing was charged. account: allow_short_selling: true execution: execution_price: quote_side mark_price: price execution_mode: next_bar commission: model: percentage rate: 0.0005 slippage: model: percentage rate: 0.0002 calendar: calendar: NYSE timezone: UTC data_frequency: daily feed: timestamp_col: timestamp entity_col: symbol price_col: instr_mid close_col: close bid_col: instr_bid ask_col: instr_ask mid_col: instr_mid metadata: case_study: sp500_options ```
Reproduit dans son intégralité avec attribution, conformément à la licence de la source. Licence: MIT
Ce résumé a été rédigé par l’agent de recherche de Stratmill à partir de la source originale ; il n’en est pas une copie.