Faut- il construire son propre backtester?

Auteur:La bonté, Créé: 2019-03-19 14:03:46, mis à jour: 2019-03-19 14:08:48

À propos de cet article

L'article est adapté à ceux qui commencent le trading quantitatif ainsi qu'à ceux qui ont une certaine expérience dans ce domaine.

Il examine également les différents types de mécanismes de backtesting ainsi que le paysage logiciel qui implémente ces approches.

Enfin, nous discutons des tenants et aboutissants d'un système de backtesting basé sur des événements, un sujet que j'ai souvent abordé sur QuantStart dans des articles précédents.

Qu'est- ce qu'une vérification par rétroaction?

Un backtest est l'application de règles de stratégie de négociation à un ensemble de données historiques sur les prix. Autrement dit, si nous définissons un ensemble de mécanismes d'entrée et de sortie d'un portefeuille d'actifs, et appliquons ces règles aux données historiques de prix de ces actifs, nous pouvons tenter de comprendre le rendement de cette "stratégie de négociation" qui aurait pu être atteinte dans le passé.

Il a été dit une fois que Tous les modèles sont erronés, mais certains sont utiles.

Les backtests nous aident finalement à décider s'il vaut la peine de négocier en direct un ensemble de règles de stratégie. Il nous donne une idée de la façon dont une stratégie aurait pu fonctionner dans le passé.

Il est facile de générer des backtests. Malheureusement, les résultats des backtests ne sont pas des résultats de trading en direct. Ils sont plutôt un modèle de la réalité. Un modèle qui contient généralement de nombreuses hypothèses.

Il existe deux principaux types de backtest de logiciels: les systèmes for-loop et les systèmes driven-event.

Lors de la conception de logiciels de backtesting, il existe toujours un compromis entre la précision et la complexité de la mise en œuvre.

Des pièges à revoir

Il existe de nombreux pièges associés au backtesting. Ils concernent tous le fait qu'un backtest est juste un modèle de la réalité.

  • Test d'échantillonnage - Cela se produit lorsque vous utilisez les mêmes données pour entraîner vos modèles de trading ainsi que pour les tester. Cela gonfle presque toujours la performance d'une stratégie au-delà de ce qui serait observé dans le trading en direct.
  • Bias de survie - Pour les indices boursiers comme le S&P500, un processus périodique de cotation et de retrait se produit, changeant la composition au fil du temps. En ne tenant pas compte de cette composition changeante par rapport à un backtest, les stratégies de trading sont automatiquement choisir les gagnants en raison de l'ignorance de toutes les entreprises qui sont tombées de l'indice en raison de la faible capitalisation boursière. Il est donc toujours nécessaire d'utiliser des données libres de biais de survie lors de l'exécution de backtests à plus long terme.
  • Les données futures peuvent s'infiltrer dans les backtests de manière très subtile. Considérez le calcul d'un ratio de régression linéaire sur une période donnée. Si ce ratio est ensuite utilisé dans le même échantillon, nous avons implicitement apporté des données futures et aurons donc probablement des performances gonflées. Les backtests basés sur des événements résolvent largement ce problème, comme nous le verrons ci-dessous.
  • Changement de régime du marché - Cela concerne le fait que les paramètres du marché boursier ne sont pas statiques. C'est-à-dire que le processus sous-jacent générant les mouvements des actions n'a pas besoin d'avoir des paramètres qui restent constants dans le temps. Cela rend difficile la généralisation des modèles paramétrés (dont de nombreuses stratégies de trading en sont des exemples) et donc les performances sont susceptibles d'être plus élevées dans les backtests que dans le trading en direct.
  • Coûts de transaction - De nombreux backtests For-Loop ne prennent pas en compte même les coûts de transaction de base, tels que les frais ou les commissions. Cela est particulièrement vrai dans les articles universitaires où les backtests sont largement effectués sans coûts de transaction. Malheureusement, il est trop facile de trouver des stratégies très rentables sans coûts de transaction, mais qui font des pertes substantielles lorsqu'elles sont soumises à un marché réel. Les coûts typiques incluent le spread, l'impact sur le marché et le glissement.

Il y a des problèmes plus subtils avec le backtesting qui ne sont pas discutés aussi souvent, mais qui sont encore extrêmement importants à considérer.

  • Les données OHLC, c'est-à-dire le type de données quotidiennes prélevées sur des sites gratuits tels que Yahoo Finance, sont souvent une fusion de plusieurs flux d'échange. Il est donc peu probable que certaines des valeurs les plus extrêmes observées (y compris le prix élevé et le prix bas du jour) soient probablement obtenues par un système de négociation en direct.
  • Les restrictions de capacité - Lors du backtesting, il est facile d'utiliser un pot d'argent infinie. Cependant, en réalité, le capital, ainsi que la marge, est fortement limité. Il est également nécessaire de penser aux limites de volume quotidien moyen (ADV), en particulier pour les actions à petite capitalisation où il est possible que nos transactions puissent effectivement déplacer le marché.
  • Choix de référence - Le choix de référence contre lequel la stratégie backtestée est mesurée est-il bon? Par exemple, si vous négociez des contrats à terme sur matières premières et que vous êtes neutre par rapport à l'indice des actions S&P500 US, est-il vraiment logique d'utiliser le S&P500 comme référence? Un panier d'autres fonds de négociation de matières premières aurait-il plus de sens?
  • Robustesse - En modifiant l'heure de début de votre stratégie dans votre backtest, les résultats changent-ils de façon spectaculaire?
  • Sur-ajustement / compromis de biais-variance - Nous avons discuté de cela un peu plus haut dans le point d'essai dans l'échantillon. Cependant, le surajustement est un problème plus large pour toutes les méthodes d'apprentissage automatique (supervisées). La seule façon réelle de "résoudre" ce problème est par l'utilisation prudente de techniques de validation croisée.
  • Tolérance psychologique - La psychologie est souvent ignorée dans la finance quantitative parce qu'elle est (supposément) supprimée en créant un système algorithmique. Cependant, elle s'introduit toujours parce que les quants ont tendance à tinker ou override le système une fois déployé en direct. De plus, ce qui peut sembler tolérable dans un backtest, pourrait être un tourbillon d'estomac dans le trading en direct. Si votre courbe d'équité backtestée montre un retrait de 50% à un moment donné de son histoire de trading, pourriez-vous également le traverser dans un scénario de trading en direct?

Tucker Balch et Ernie Chan ont tous deux examiné les problèmes en détail.

Systèmes de contre-test en boucle

Un For-Loop Backtester est le type le plus simple de système de backtesting et la variante la plus souvent vue dans les articles de blog quant, purement pour sa simplicité et sa transparence.

Essentiellement, le système For-Loop itère sur chaque jour de négociation (ou barre OHLC), effectue un calcul lié au prix des actifs, comme une moyenne mobile de la clôture, puis va long ou court sur un actif particulier (souvent au même prix de clôture, mais parfois le lendemain).

Voici le pseudo-code d'un tel algorithme:

for each trading bar:
    do_something_with_prices();
    buy_sell_or_hold_something();
    next_bar();PythonCopy

Comme vous pouvez le voir, la conception d'un tel système est incroyablement simple.

Les avantages

Les backtesters For-Loop sont faciles à mettre en œuvre dans presque tous les langages de programmation et sont très rapides à exécuter.

Les défauts

Le principal inconvénient des backtests For-Loop est qu'ils sont assez irréalistes. Ils n'ont souvent aucune capacité de coût de transaction à moins d'être spécifiquement ajoutés. Les ordres sont généralement remplis immédiatement au marché avec le prix du point médian.

Il y a une réutilisation minimale du code entre le système de backtesting et le système de trading en direct.

Les backtesters For-Loop sont sujets aux biais Look-Ahead, en raison de bugs avec l'indexation. Par exemple, auriez-vous dû utiliser i, i+1 ou i-1 dans votre indexation de panneau?

Les backtesters For-Loop devraient vraiment être utilisés uniquement comme un mécanisme de filtration. Vous pouvez les utiliser pour éliminer les stratégies évidemment mauvaises, mais vous devriez rester sceptique sur les performances fortes. Des recherches supplémentaires sont souvent nécessaires. Les stratégies fonctionnent rarement mieux dans le trading en direct que dans les backtests!

Systèmes de contre-test axés sur les événements

Les backtesters basés sur les événements se situent à l'autre extrémité du spectre. Ils sont beaucoup plus proches des implémentations d'infrastructures de trading en direct.

Ces systèmes sont exécutés dans une grande boucle qui recherche continuellement des événements de différents types dans la file d'attente.

  • Tick Evénements - Signifier l'arrivée de nouvelles données de marché
  • Événements de signaux - Génération de nouveaux signaux de négociation
  • Événements d'ordre - ordres prêts à être envoyés au courtier de marché
  • Remplissez les événements - Remplissez les informations du courtier de marché

Lorsqu'un événement particulier est identifié, il est acheminé vers les modules appropriés de l'infrastructure, qui gèrent l'événement et génèrent ensuite potentiellement de nouveaux événements qui retournent à la file d'attente.

Le pseudo-code pour un système de backtesting basé sur des événements est le suivant:

while event_queue_isnt_empty():
    event = get_latest_event_from_queue();
    if event.type == "tick":
        strategy.calculate_trading_signals(event);
    else if event.type == "signal":
        portfolio.handle_signal(event);
    else if event.type == "order":
        portfolio.handle_order(event);
    else if event.type == "fill":
        portfolio.handle_fill(event)
    sleep(600);  # Sleep for, say, 10 minsPythonCopy

Comme vous pouvez le voir, il y a une forte dépendance au module gestionnaire de portefeuille.

Les avantages

Il y a de nombreux avantages à utiliser un backtester Event-Driven:

  • Élimination du biais de prospection - En raison de sa conception de transmission de messages, les systèmes axés sur les événements sont généralement exempts de biais de prospection, du moins au niveau du trading.
  • Pour le trading en direct, il suffit de remplacer les modules de traitement des données et de traitement de l'exécution.
  • Le niveau de portefeuille - Avec un système basé sur les événements, il est beaucoup plus simple de penser au niveau du portefeuille.
  • Gestion correcte du risque/de la position - peut facilement moduler la gestion du risque et de la position. peut facilement introduire des méthodes et des méthodes d'effet de levier telles que le critère de Kelly. peut également facilement inclure des avertissements d'exposition sectorielle, des limites de valeur ajoutée, des limites de volatilité et des avertissements d'illiquidité.
  • Déploiement/surveillance à distance - La nature modulaire du code facilite le déploiement dans le cloud ou la localisation du logiciel près d'un échange sur un système virtualisé.

Les défauts

Bien que les avantages soient évidents, l'utilisation d'un système aussi complexe présente également de sérieux inconvénients:

  • Difficile à coder - Construire un système entièrement testé basé sur des événements prendra probablement des semaines ou des mois de travail à temps plein.
  • Une conception modulaire nécessite l'utilisation de principes de programmation orientée objet (OOP), et donc un langage qui peut facilement prendre en charge OOP.
  • Ingénierie logicielle - Il est plus probable qu'elle nécessite une bonne expertise et des capacités en ingénierie logicielle telles que l'enregistrement, les tests unitaires, le contrôle des versions et l'intégration continue.
  • Lente exécution - La nature du code de transmission de messages le rend beaucoup plus lent à exécuter par rapport à une approche For-Loop vectorialisée.

Le paysage du logiciel

Dans cette section, nous examinerons les logiciels (à la fois open source et commerciaux) qui existent pour les systèmes For-Loop et Event-Driven.

Pour les backtesters For-Loop, les principaux langages de programmation/logiciels utilisés sont Python (avec la bibliothèque Pandas), R (et la bibliothèque quantmod) et MatLab.

Le marché des systèmes basés sur les événements est beaucoup plus vaste, car les clients/utilisateurs souhaitent souvent que le logiciel soit capable à la fois de backtesting et de trading en direct dans un seul package.

Les offres commerciales coûteuses incluent Deltix et QuantHouse.

Quantpian est un exemple d'une configuration Web mature pour le backtesting et le trading en direct.

Les quants institutionnels construisent souvent leur propre logiciel en interne, ce qui est dû à une combinaison de contraintes réglementaires, de relations avec les investisseurs/d'établissement de rapports et d'audit.

Les détaillants ont le choix entre l'utilisation de l'approche cloud+data de Quantopian ou rolling their own en utilisant un fournisseur de cloud comme Amazon Web Services, Rackspace Cloud ou Microsoft Azure, ainsi qu'un fournisseur de données approprié tel que DTN IQFeed ou QuantQuote.

En termes de logiciels open source, il existe de nombreuses bibliothèques disponibles. Elles sont principalement écrites en Python (pour des raisons que je détaillerai ci-dessous) et comprennent Zipline (Quantopian), PyAlgoTrade, PySystemTrade (Rob Carver / Investment Idiocy) et QSTrader (le propre backtester de QuantStart).

L'un des aspects les plus importants, cependant, est que peu importe le logiciel que vous utilisez en fin de compte, il doit être associé à une source de données financières tout aussi solide.

Langages de programmation

Bien que le logiciel s'occupe des détails pour nous, il nous cache de nombreux détails d'implémentation qui sont souvent cruciaux lorsque nous souhaitons étendre la complexité de notre stratégie de trading.

Malgré mes antécédents de développeur de logiciels quantitatifs, je ne suis pas personnellement intéressé par les "guerres linguistiques".

Nous ne devrions nous intéresser qu'à ce qui fonctionne.

Python

Python est un langage de programmation extrêmement facile à apprendre et est souvent le premier langage auquel les individus entrent en contact lorsqu'ils décident d'apprendre à programmer.

Il possède des bibliothèques d'apprentissage automatique (ML) exceptionnelles dans NumPy, SciPy, Pandas, Scikit-Learn, Matplotlib, PyMC3 et Statsmodels.

Il est idéal pour la construction de systèmes de backtesting à la fois For-Loop et Event-Driven. En fait, c'est peut-être l'un des seuls langages qui permet directement la recherche de bout en bout, le backtesting, le déploiement, le trading en direct, les rapports et la surveillance.

Peut-être son plus grand inconvénient est-il qu'il est assez lent à exécuter par rapport à d'autres langages tels que C ++. Cependant, des travaux sont en cours pour améliorer ce problème et au fil du temps Python devient plus rapide.

R

R est un environnement de programmation statistique, plutôt qu'un "langage de programmation de première classe" à part entière (bien que certains puissent argumenter le contraire!).

Il est largement utilisé pour le backtesting For-Loop, souvent via la bibliothèque quantmod, mais n'est pas particulièrement bien adapté aux systèmes Event-Driven ou au trading en direct.

C++

C++ a la réputation d'être extrêmement rapide. Presque tous les calculs scientifiques à haute performance sont effectués en Fortran ou en C++. C'est son principal avantage. Par conséquent, si vous envisagez de négocier à haute fréquence ou de travailler sur des systèmes hérités dans de grandes organisations, alors C++ est probablement une nécessité.

Malheureusement, il est douloureux pour mener des recherches stratégiques.

Malgré son âge relatif, il a récemment été considérablement modernisé avec l'introduction de C++11/C++14 et d'autres améliorations des normes.

D'autres?

Vous voudrez peut-être également jeter un coup d'œil à Java, Scala, C #, Julia et à de nombreux langages fonctionnels.

Devriez-vous écrire votre propre backtest (basé sur des événements)?

Réponse: Oui!

C'est une grande expérience d'apprentissage d'écrire votre propre système de backtesting Event-Driven. Premièrement, il vous oblige à considérer tous les aspects de votre infrastructure de trading, pas seulement passer des heures à bricoler sur une stratégie particulière.

Même si vous ne finissez pas par utiliser le système pour le trading en direct, il vous fournira un grand nombre de questions que vous devriez poser à vos fournisseurs de backtesting commerciaux ou FOSS.

Par exemple: en quoi votre système en direct actuel diffère de votre simulation de backtest en termes de:

  • Exécution algorithmique et routage des ordres?
  • Différence, frais, dérapage et impact sur le marché?
  • Gestion des risques et dimensionnement des positions?

Bien que les systèmes basés sur des événements ne soient ni rapides ni faciles à écrire, l'expérience vous rapportera des dividendes éducatifs énormes plus tard dans votre carrière de trader quantique.

Conception des tests de retour basés sur des événements 101

Comment écrire un tel système?

La meilleure façon de commencer est de télécharger simplement Zipline, QSTrader, PyAlgoTrade, PySystemTrade, etc. et d'essayer de lire la documentation et le code. Ils sont tous écrits en Python (en raison des raisons que j'ai décrites ci-dessus) et heureusement Python est très similaire à la lecture de pseudo-code. C'est-à-dire qu'il est très facile à suivre.

J'ai également écrit de nombreux articles sur la conception de backtests basés sur des événements, que vous pouvez trouver ici, qui vous guident à travers le développement de chaque module du système.

N'oubliez pas que vous n'avez pas besoin d'être un expert le premier jour. Vous pouvez le faire lentement, jour après jour, module par module. Si vous avez besoin d'aide, vous pouvez toujours me contacter ou d'autres blogueurs quant. Voir la fin de l'article pour mon email de contact.

Je vais maintenant discuter des modules que l'on trouve souvent dans de nombreux systèmes de backtesting basés sur des événements.

Base de données principale sur les valeurs mobilières

C'est ici que sont stockées toutes les données de prix historiques, ainsi que votre historique de trading, une fois en ligne.

Au lieu de cela, nous utilisons une base de données ou un système de fichiers de première classe, tels que PostgreSQL, MySQL, SQL Server ou HDF5.

Dans l'idéal, nous voulons obtenir et stocker des données de niveau de tick car cela nous donne une idée des spreads de trading.

Nous devrions toujours être conscients de la gestion des actions d'entreprise (comme les scissions d'actions et les dividendes), le biais de survie (suppression de la cotation des actions) ainsi que le suivi des différences de fuseau horaire entre les différents échanges.

Les entreprises individuelles/de détail peuvent y concurrencer, car de nombreuses technologies de base de données de qualité de production sont matures, gratuites et open source.

Il y a encore beaucoup de marchés et de stratégies qui sont trop petits pour que les grands fonds s'y intéressent.

Stratégies de négociation

Le module de stratégie de négociation dans un système basé sur des événements exécute généralement une sorte de mécanisme de prédiction ou de filtration sur les nouvelles données du marché.

Il reçoit des données bar ou tick, puis utilise ces mécanismes pour produire un signal de trading pour long ou short d'un actif.

95% de la discussion sur le blog quant tourne généralement autour des stratégies de trading. Personnellement, je pense qu'il devrait être plus proche de 20%. C'est parce que je pense qu'il est beaucoup plus facile d'augmenter les rendements attendus en réduisant les coûts grâce à une bonne gestion des risques et à la dimensionnement des positions, plutôt que de poursuivre des stratégies avec plus alpha.

Gestion du portefeuille et des commandes

Le cœur d'un backtester basé sur les événements est le système de gestion de portefeuille et de commandes.

L'objectif de ce système est de passer du portefeuille actuel au portefeuille souhaité, tout en minimisant les risques et en réduisant les coûts de transaction.

Le module relie les capacités de stratégie, de risque, de dimensionnement des positions et d'exécution des ordres du système.

L'avantage principal de l'utilisation d'un système aussi complexe est qu'il permet de gérer une variété d'instruments financiers dans un seul portefeuille.

Gestion des risques et des positions

La séparation de la gestion des risques dans son propre module peut être extrêmement avantageuse. Le module peut modifier, ajouter ou opposer son veto aux ordres envoyés depuis le portefeuille.

En particulier, le module de risque peut ajouter des couvertures pour maintenir la neutralité du marché. Il peut réduire la taille des commandes en raison de l'exposition du secteur ou des limites ADV. Il peut complètement opposer son veto à une transaction si l'écart est trop large ou si les frais sont trop élevés par rapport à la taille de la transaction.

Un module de dimensionnement des positions séparé peut implémenter des règles d'estimation de la volatilité et de dimensionnement des positions telles que le levier Kelly.

Ces sujets ne sont pas bien représentés dans la blogosphère quant. Cependant, c'est probablement la plus grande différence entre la façon dont les institutions et certains traders de détail pensent à leur trading.

Gestion de l'exécution

Dans la vie réelle, on ne peut jamais garantir un marché plein à mi-chemin.

Nous devons prendre en compte les problèmes de transaction tels que la capacité, le spread, les frais, les glissements, l'impact sur le marché et d'autres préoccupations d'exécution algorithmique, sinon nos rendements de backtesting sont susceptibles d'être largement surestimés.

L'approche modulaire d'un système Event-Driven nous permet de remplacer facilement le BacktestExecutionHandler par le LiveExecutionHandler et de le déployer sur le serveur distant.

Nous pouvons également facilement ajouter plusieurs courtiers en utilisant le concept OOP de inheritance. Cela suppose bien sûr que ces courtiers ont une interface de programmation d'application (API) simple et ne nous obligent pas à utiliser une interface utilisateur graphique (GUI) pour interagir avec leur système.

Il existe de nombreux modules qui facilitent la communication avec les courtiers, mais il est nécessaire d'effectuer vos propres tests. Assurez-vous que vous êtes complètement satisfait de ces bibliothèques avant de vous engager sur un capital important, sinon vous pourriez perdre beaucoup d'argent simplement en raison de bugs dans ces modules.

Performance et déclaration

Les clients de détail peuvent et doivent emprunter les techniques de reporting sophistiquées utilisées par les clients institutionnels. Ces outils comprennent des tableaux de bord en direct du portefeuille et des risques correspondants, une différence ou un delta entre les fonds propres en cours de test et les fonds propres en cours de test, ainsi que toutes les mesures habituelles telles que les coûts par transaction, la distribution des rendements, la marge d'eau élevée (HWM), le tirage maximal, la latence moyenne des transactions ainsi que l'alpha/bêta par rapport à un indice de référence.

Il faut améliorer progressivement l'infrastructure. Cela peut vraiment améliorer les rendements à long terme, simplement en éliminant les bugs et en améliorant les problèmes tels que la latence des échanges.

Le WGS finira par s'éroder en raison de la désintégration de l'alpha. D'autres finissent par découvrir l'avantage et vont arbitrager les rendements. Cependant, une infrastructure de trading robuste, un pipeline de recherche stratégique solide et un apprentissage continu sont d'excellents moyens d'éviter ce sort.

L'optimisation de l'infrastructure peut être plus "ennuyeuse" que l'élaboration de stratégies, mais elle devient nettement moins ennuyeuse lorsque vos rendements sont améliorés!

Déploiement et suivi

Le déploiement sur un serveur distant, ainsi qu'une surveillance approfondie de ce système distant, sont absolument cruciaux pour les systèmes institutionnels.

Un système robuste doit être déployé à distance dans le cloud ou co-loqué à proximité d'un échange. Le haut débit à domicile, les alimentations électriques et d'autres facteurs signifient que l'utilisation d'un ordinateur de bureau / ordinateur portable à domicile est trop peu fiable.

Les principaux enjeux lors de l'examen d'un déploiement à distance comprennent: le matériel de surveillance, tel que le processeur, la RAM/swap, les entrées/sorties de disque et de réseau, la haute disponibilité et la redondance des systèmes, un plan de sauvegarde et de restauration bien pensé, une comptabilisation approfondie de tous les aspects du système ainsi que l'intégration continue, les tests unitaires et le contrôle des versions.

Rappelez-vous la loi de Murphy - Si cela peut échouer, cela échouera.

Il existe de nombreux fournisseurs qui offrent des déploiements cloud relativement simples, notamment Amazon Web Services, Microsoft Azure, Google et Rackspace.

Réflexions finales

Malheureusement, il n'y a pas de solution rapide dans le commerce quantitatif.

L'un des principaux obstacles pour les débutants (et certains intermédiaires!) est peut-être qu'ils se concentrent trop sur la meilleure stratégie. Ces stratégies finissent toujours par succomber à la désintégration alpha et deviennent donc non rentables. Il est donc nécessaire de rechercher continuellement de nouvelles stratégies à ajouter à un portefeuille.

Il vaut également la peine d'investir beaucoup de temps dans votre infrastructure commerciale. Passez du temps sur des questions telles que le déploiement et la surveillance. Essayez toujours de réduire les coûts de transaction, car la rentabilité consiste autant à réduire les coûts que de gagner des revenus commerciaux.

Je recommande d'écrire votre propre système de backtesting simplement pour apprendre. Vous pouvez soit l'utiliser et l'améliorer continuellement ou vous pouvez trouver un fournisseur et leur poser toutes les questions que vous avez découvertes lorsque vous avez construit le vôtre. Cela vous rendra certainement conscient des limites des systèmes disponibles dans le commerce.

Il existe une multitude de manuels, de revues professionnelles, de revues académiques, de blogs quantitatifs, de forums et de magazines qui discutent de tous les aspects du trading.


Plus de