Strasmore Research
Apprendre Matt ConnorPar Matt Connor

Workbench quant A-share auto-hébergé : explications

Ce workbench quant A-share filtre, backteste et analyse le marché sur votre machine. Voici ses dépendances et les quatre contrôles à effectuer en premier.

Un quant workbench self-hosted pour les actions A est une page web qui filtre le marché, surveille une liste de valeurs, exécute des backtests et rédige une revue post-marché, sur une machine que vous contrôlez plutôt que sur le terminal d’un broker. Un projet sous licence MIT, tickflow-stock-panel, regroupe toutes ces fonctions derrière un port unique et comptait environ 2 800 étoiles sur GitHub en août 2026. La liste des fonctionnalités est la partie la plus facile à lire. C’est la couche sous-jacente qui détermine si tout cela fonctionnera encore au prochain trimestre.

De quoi se compose un workbench quantitatif A-share auto-hébergé

L’architecture est suffisamment simple pour être mémorisée. D’après le code et la documentation du commit d’août 2026, elle se compose des éléments suivants :

  • Une page web développée en React et TypeScript.
  • Un service Python basé sur FastAPI, avec un scheduler qui actualise les données à intervalles réguliers.
  • Un stockage local : des fichiers Parquet sur disque, interrogés avec DuckDB et traités avec Polars.
  • Un moteur de backtesting, vectorbt, connecté à ces fichiers.
  • Un SDK fournisseur qui récupère chaque cours affiché dans le panneau.

Remarquez ce qui est absent. Aucun élément de cette stack ne se connecte à une place boursière. Le panneau effectue les calculs ; le fournisseur fournit les données. « Auto-hébergé » décrit l’endroit où le code s’exécute et ne dit rien de l’origine des chiffres. La conservation des données brutes relève de la couche inférieure, un data lake local de marché A-share, qui permet de remplacer tous les composants situés au-dessus.

Ce que couvre l’offre gratuite de la source de données

Une variable d’environnement détermine ce que le panneau peut afficher. Si vous laissez la clé du fournisseur vide, le projet s’exécute dans ce que sa documentation appelle le mode None : des barres quotidiennes historiques provenant d’un endpoint gratuit, la séance en cours n’étant disponible qu’une à deux heures après la clôture. Si vous renseignez la clé, l’accès s’ouvre selon le niveau d’abonnement payant. Cette offre gratuite convient au travail en fin de journée, mais elle exclut clairement tout usage intraday, selon des conditions que le fournisseur peut reformuler à chaque renouvellement.

Le mainteneur présente directement le dispositif :

Ce projet est destiné uniquement à l’apprentissage et à la recherche quantitative ; il ne constitue pas un conseil en investissement. Les résultats du backtest ne représentent pas les performances futures.
Ce projet personnel est open source et repose sur la source de données TickFlow. Il ne s’agit pas d’un projet officiel de TickFlow.
README, shy3130/tickflow-stock-panel, consulté le 13 août 2026

En clair, le projet est destiné à l’étude et à la recherche quantitative ; il « ne constitue pas un conseil en investissement » et les résultats du backtest ne représentent pas les performances futures. Il s’agit aussi d’un « projet personnel open source, et non d’un produit officiel de TickFlow ». C’est l’enseignement durable de toute cette catégorie de solutions. Le zero-ops vous décharge des tâches d’exploitation. Mais la dépendance reste la même : vous louez les données à une entreprise qui n’a jamais accepté d’assurer le support de ce panneau. Le README limite également l’utilisation à l’étude et à la recherche, tandis que le fichier de licence est sous licence MIT.

Pourquoi épingler un commit SHA plutôt qu’un numéro de version

Un commit SHA est l’empreinte de 40 caractères que Git attribue à chaque modification enregistrée. Il désigne de manière permanente un état précis du code.

Au 13 août 2026, le dépôt ne comportait rien sur sa page GitHub Releases. Il comptait toutefois 31 tags de version, de v0.1.31 à v0.1.88, avec des numéros manquants et aucune note associée. Le tag le plus récent pointait vers un commit daté du 31 juillet 2026, tandis que la branche par défaut avait avancé sur des travaux datés du 6 août 2026. Un tag en retard sur la branche et dépourvu de notes ne permet pas de savoir ce que vous récupérez.

Notez donc le SHA. Le head de la branche par défaut au 6 août 2026 était ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33. Faites un checkout de ce commit et consignez-le à côté de toute conclusion tirée des backtests. Six semaines plus tard, « j’ai exécuté la dernière version » ne veut rien dire.

Le démarrage documenté tient en deux lignes : copiez le fichier d’environnement d’exemple vers .env, puis exécutez docker compose up --build, qui sert le panneau sur le port 3018. Il s’agit des instructions du mainteneur pour ce commit, et non d’un parcours testé ; le build télécharge des images et nécessite un accès réseau que cette page n’a pas testé. Le parcours de développement (./dev.sh, ou .\dev.ps1 sous Windows) nécessite Python 3.11 ou une version ultérieure, Node 20 ou une version ultérieure, ainsi que les gestionnaires de paquets uv et pnpm.

Ce que la fonctionnalité de stratégie LLM envoie, et où

La génération de stratégies, les commentaires sur une seule action et la rédaction de la revue sont facultatifs. Laissez AI_API_KEY vide et toute l’interface reste inactive. Renseignez-le et vous définissez également AI_PROVIDER (un endpoint compatible avec OpenAI ou Ollama), AI_BASE_URL, AI_MODEL et AI_DAILY_TOKEN_BUDGET. Ce dernier interrompt les appels une fois l’allocation quotidienne de tokens épuisée.

La destination compte. Votre prompt et le contexte que le panneau lui associe quittent votre machine à destination de l’endpoint configuré. Si vous indiquez l’URL de base d’une API hébergée, la requête est envoyée à cette entreprise. Si vous indiquez un runtime sur votre propre réseau, elle reste dans votre environnement. Héberger vous-même le panneau ne signifie pas héberger vous-même le modèle. Les clés sont stockées en clair dans .env, à la racine du projet. Elles peuvent également être modifiées depuis la page des paramètres, protégée par un mot de passe de tableau de bord d’au moins six caractères. Notre note sur les facteurs alpha générés par un LLM explique où les stratégies produites par une machine tendent à échouer.

Le backtester modélise-t-il les coûts de transaction ?

Le backtester annonce la gestion du T+1, les commissions, le slippage et les stop-loss. Le fait que ces options existent ne signifie pas qu’elles sont activées. Un backtest qui exécute les ordres au cours de clôture affiché, avec des coûts fixés à zéro, revient à supposer que le trading est gratuit. Ce n’est pas le cas. Un point de base correspond à un centième de pour cent. Le panneau ci-dessous mesure l’écart moyen entre le meilleur bid et la meilleure offre, en points de base, sur six valeurs cotées aux États-Unis, pendant une heure en milieu de séance le 17 juin 2026.

RequêteCoût du franchissement du spread : spread coté moyen, six cotations américaines, mi-journée du 17 juin 2026
Le SQL exact derrière chaque chiffre
SELECT
    ticker                                                                       AS symbol,
    round(avg(toFloat64(ask_price) - toFloat64(bid_price))
          / avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2)   AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
  AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-17 16:00:00', 'UTC')
  AND bid_price > 0
  AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bps
Run this yourself

La valeur la plus liquide du panneau, SPY, affichait un spread moyen de 0.29 points de base sur cette heure. La moins liquide, F, affichait 6.98 points de base. Franchir cet écart deux fois, une fois à l’achat et une fois à la vente, coûte environ deux fois le chiffre indiqué, avant les commissions.

Le timing coûte autant que le choix du titre. Le panneau suivant prend l’une de ces valeurs et mesure l’amplitude de son évolution au cours d’une seule minute, agrégée par tranches d’une demi-heure sur la même journée.

RequêteAmplitude du cours en une minute : KO, selon l’heure de New York, 17 juin 2026
Le SQL exact derrière chaque chiffre
SELECT
    formatDateTime(
        toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
        '%H:%i')                                                                 AS et_time,
    round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1)  AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
  AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
  AND window_start <  toDateTime('2026-06-17 21:00:00', 'UTC')
  AND volume > 0
  AND close > 0
GROUP BY et_time
ORDER BY et_time
Run this yourself

Le panneau commence à 08:00, avant l’ouverture de la séance régulière, avec une amplitude moyenne de 0 points de base par barre d’une minute : les minutes pendant lesquelles des transactions ont eu lieu se sont toutes déroulées à un seul cours. La dernière tranche, 16:30, se situe après la clôture et affichait une amplitude moyenne de 4.2 points de base. Un backtest sélectionne un point dans chacune de ces fourchettes et le considère comme le prix d’exécution. Il faut lire la courbe plutôt que ses extrémités : la même hypothèse est favorable à certaines heures et pénalisante à d’autres. Les règles applicables aux actions A ajoutent leurs propres contraintes, car le T+1 empêche de vendre les actions achetées le jour même avant la séance suivante, tandis que les limites de variation quotidiennes peuvent supprimer complètement une sortie modélisée. Notre présentation d’un backtest reproductible montre ce qu’une configuration défendable doit documenter, tandis que le biais d’anticipation traite de l’autre manière dont une courbe apparemment propre peut devenir erronée.

Ajusté ou non ajusté : la question de la provenance

Les opérations sur titres sont une source d’erreurs discrètes pour les screeners. Une action qui fait l’objet d’un split de dix pour une affiche une baisse de 90 % ce jour-là, alors que personne ne perd un centime. Le tableau ci-dessous recense les douze plus grands forward splits sur des valeurs cotées aux États-Unis entre le 1er janvier et le 13 août 2026.

RequêteLes douze plus importants splits à terme sur des cotations américaines, du 1er janvier au 13 août 2026
Le SQL exact derrière chaque chiffre
SELECT
    ticker                                                            AS symbol,
    formatDateTime(execution_date, '%b %e, %Y')                       AS effective_on,
    round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2)   AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
  AND execution_date <= toDate('2026-08-13')
  AND split_from > 0
  AND split_to > split_from
  AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12
Run this yourself

Le plus important transforme une action en 10000, avec prise d’effet le Feb 10, 2026. Des ratios de cette ampleur ne correspondent pas au classique split de quatre pour une : un flux de données sur les opérations sur titres regroupe toute la gamme dans une seule colonne. Le plus petit des douze transforme malgré tout une action en 20, suffisamment pour faire passer un graphique non ajusté pour un effondrement. Un screener de momentum fondé sur les cours bruts les signale tous comme des krachs. Les flux chinois présentent le même problème dans leur propre terminologie et proposent trois variantes de chaque série : non ajustée, ajustée forward et ajustée back. Vérifiez laquelle a été chargée dans votre tableau. Historique des cours ajusté des splits détaille le calcul.

Points à vérifier avant d’auto-héberger un outil de ce type

  • Provenance des données. Identifiez le fournisseur, la licence applicable et vérifiez que l’offre gratuite couvre l’usage prévu.
  • Gestion des clés. Vérifiez où les clés API sont enregistrées sur le disque, qui peut accéder à la page des paramètres et si la machine est accessible depuis l’extérieur de votre propre réseau.
  • Modélisation des coûts. Vérifiez que le backtester intègre les commissions, le slippage et les règles propres au marché. Contrôlez aussi les valeurs utilisées lorsque vous laissez ces champs inchangés.
  • Procédure de mise à jour. Notez le commit exact déployé à côté de vos résultats afin de pouvoir reproduire l’analyse plusieurs mois plus tard.

FAQ

L’utilisation d’un quant workbench auto-hébergé pour les actions A est-elle gratuite ?

Le code est sous licence MIT et gratuit. Les données relèvent d’une autre question : si la clé du fournisseur reste vide, le projet utilise des barres quotidiennes historiques gratuites, la séance en cours étant disponible une à deux heures après la clôture. Tout accès plus rapide ou plus détaillé passe par les offres payantes du fournisseur.

Que signifie concrètement « auto-hébergé » ici ?

La page web, le planificateur, les fichiers enregistrés et le backtester s’exécutent sur votre propre machine ou serveur, sans compte sur la plateforme d’un tiers. Cela ne signifie pas que les données vous appartiennent. Les fonctions d’IA facultatives restent distantes, sauf si vous les connectez à un modèle présent sur votre propre réseau.

La fonction LLM envoie-t-elle mes données à un tiers ?

Oui, lorsqu’elle est activée, vers le endpoint compatible avec OpenAI que vous avez configuré. La fonction est désactivée par défaut : si la clé d’IA est vide, aucune donnée ne quitte la machine.

Pourquoi figer un commit SHA plutôt qu’un tag de version ?

Au 13 août 2026, ce repository ne comptait aucune release publiée ni note de version, et son tag le plus récent pointait vers un code plus ancien que celui de la branche par défaut. « Latest » désignait alors le contenu de la branche au jour du clonage, tandis qu’un commit SHA est exact. La même discipline s’applique plus largement au matériel open source consacré au quant trading : figez la version réellement exécutée.

Notes de vérification

Tous les détails d’architecture et de configuration ci-dessus ont été relevés dans le repository public le 13 août 2026, au commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33, qui était alors la tête de la branche par défaut et datait du 6 août 2026. La page Releases ne listait aucun élément ; la liste des tags comptait 31 tags de version, de v0.1.31 à v0.1.88, le plus récent pointant vers un commit daté du 31 juillet 2026. Les passages entre guillemets sont ceux du mainteneur lui-même. Ils ont été copiés du README et non paraphrasés. La commande de démarrage du conteneur est également citée du README et n’a pas été exécutée ici.

Les panneaux de marché portent sur des valeurs cotées aux États-Unis et sont ancrés sur des dates passées fixes afin que les chiffres restent inchangés. Ils servent à illustrer les deux contrôles applicables à tout marché : le coût d’exécution et l’ajustement lié aux opérations sur titres. Ils ne décrivent pas le marché chinois.


Chaque panneau contient la requête SQL qui l’a produit, dépliable juste en dessous. Pour appliquer le même contrôle de spread à votre propre liste de valeurs avant d’en intégrer une à un screener, demandez-le en anglais courant sur le terminal Strasmore.

#open-source#backtesting#screening#a-shares#self-hosted