Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-08

Data lake local des actions A pour agents IA

ashare-lake crée un data lake local des actions A avec 39 jeux de données, les radiations, des requêtes à une date passée et un serveur MCP pour agents.

Un data lake local des actions A conserve l’historique du marché actions de Chine continentale sur votre propre disque, sous forme de fichiers Parquet colonnaires lisibles avec DuckDB ou Polars, au lieu d’interroger un endpoint fournisseur page par page. ashare-lake est un projet open source qui construit ce data lake, ainsi que le job quotidien qui le met à jour et un serveur Model Context Protocol permettant à un agent IA de l’interroger. Deux choix de conception justifient cet article : les valeurs radiées de la cote sont conservées, et les données fondamentales peuvent être consultées telles qu’elles étaient connues à une date passée.

Pourquoi un agent d’IA a besoin d’un data lake local sur les actions chinoises

Un agent qui analyse les actions chinoises sans copie locale a deux options. Il extrait les données de pages financières, consomme sa fenêtre de contexte avec du HTML et produit des chiffres que personne ne pourra reproduire le mois prochain. Ou il appelle un fournisseur dont l’accès est conditionné à une inscription, qui plafonne le nombre de lignes et rattache chaque résultat à un compte.

L’échelle est le facteur le plus souvent sous-estimé. Notre propre entrepôt contient les données du marché américain à la minute. Une semaine ordinaire ressemble à ceci :

RequêteUne semaine de tape minute US : symboles et barres par séance, 20–24 juil. 2026
Le SQL exact derrière chaque chiffre
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session,
       formatDateTime(toDate(toTimeZone(window_start, 'America/New_York')), '%b %e') AS session_label,
       uniqExact(ticker) AS tickers_count,
       round(count() / 1000000, 2) AS minute_bars_millions
FROM global_markets.delayed_stocks_minute_aggs
WHERE toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-07-20')
  AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-24')
GROUP BY session, session_label
ORDER BY session
Run this yourself

Sur Jul 20, le marché a produit 1.79 millions de barres à la minute sur 11737 titres, et les quatre autres séances du panneau suivent le même schéma. Un marché national, une semaine, une résolution. Une décennie de données quotidiennes, de fondamentaux, de compositions d’indices et de données de flux de capitaux pour un autre marché présente la même ampleur. Les parcourir par HTTP consomme l’exécution d’un agent.

Un data lake local change deux choses à la fois. Les lectures deviennent un parcours de fichiers plutôt qu’une consommation de quota. De plus, une requête écrite aujourd’hui renvoie les mêmes lignes dans six mois. C’est indispensable pour qu’un backtest puisse être vérifié. Nos notes sur les compétences en données de marché pour les agents d’IA et sur une API SQL au-dessus des données de marché défendent le même principe pour les données américaines.

Installez-le en figeant une version

Python 3.10 ou version ultérieure. Figez la version : six versions sont sorties entre le 27 juillet et le 2 août 2026, et une installation sans version figée dans le script de configuration d’un agent est une cible mouvante. Le code se trouve dans rootSunc/ashare-lake, sous licence Apache 2.0.

  • pip install ashare-lake==0.5.0 installe la version actuelle début août 2026.
  • asl --version affiche le build installé.
  • asl config init --data-root /path/to/ashare-lake écrit le fichier TOML d’exemple fourni, avec le chemin racine de vos données renseigné, sans nécessiter de cloner le dépôt. --config définit le chemin de sortie, --force écrase le fichier existant.
  • asl doctor exécute les contrôles hors ligne, avant tout transfert de données.
  • asl servers test teste les serveurs de cotations en amont. asl sources teste chaque source, avec un --vantage de cn, overseas ou local.

Arrêtez-vous là. La commande suivante lance le backfill. Ne l’exécutez pas pendant que vous lisez.

Ce que fait le backfill

asl init crée l’arborescence des répertoires et reconstitue l’historique. La documentation du projet estime qu’une exécution complète nécessite plusieurs heures de temps réel et plusieurs Go d’espace disque. Elle requiert aussi une connexion active à un serveur de cotations Tongdaxin en amont, ce que vérifie asl servers test. asl init --profile quick couvre les trois dernières années en quelques minutes. Il conserve également toutes les valeurs ayant été négociées pendant cette période, y compris celles qui ont depuis quitté le marché. asl run daily est ensuite le job incrémental. asl status --datasets indique la couverture et la fraîcheur de chaque dataset. asl serve déploie un dashboard en lecture seule sur 127.0.0.1:8787.

Le repository ne contient aucune donnée. Chaque fichier Parquet est généré sur votre machine. Chaque ligne conserve sa traçabilité, avec l’indication de la source utilisée et de la date de récupération.

Quels sont les 39 jeux de données ?

Ils sont organisés par couches, en partant des données de référence : 36 tables élaborées et 3 tables dérivées.

  • Référentiel : instruments, calendrier de trading couvrant la période 2016-2027, statut de cotation.
  • Données de marché : barres quotidiennes, barres d’indices, barres à 1 minute et à 5 minutes, ticks de transactions, barres de matières premières, facteurs d’ajustement, événements de radiation.
  • Opérations sur titres : corporate actions, index des annonces, calendrier de publication des résultats.
  • Données fondamentales et valorisation : postes des états financiers, indicateurs de valorisation, consensus des analystes.
  • Flux de capitaux : flux des fonds, trading sur marge, flux et positions northbound, dragon-tiger board des déclarations de gros ordres, block trades, positions des investisseurs institutionnels.
  • Structure et secteurs : membres des secteurs, composantes des indices, membres des secteurs d’activité, indice sectoriel.
  • Macroéconomie : indicateurs macroéconomiques, breadth de marché, calendrier économique.
  • Sentiment et rotation : scores de sentiment, classement des valeurs les plus recherchées, barres sectorielles, flux des fonds sectoriels, titres de l’actualité, fil d’actualité flash.
  • Risque et conformité : calendrier de déblocage des actions, événements réglementaires.

La place occupée par un jeu de données indique ce qui compte pour son auteur. Les facteurs d’ajustement et les événements de radiation se trouvent dans la couche des données de marché, à côté des barres quotidiennes, et non dans une annexe. Pour quiconque teste des stratégies sur des données historiques, ce choix d’organisation constitue la moitié de la valeur du projet.

Comment un lac local traite le biais de survivance

Le biais de survivance apparaît lorsque l’univers d’une étude est constitué des titres encore cotés aujourd’hui. Chaque entreprise ayant fusionné, étant sortie de la cote ou ayant été retirée de la cote est absente sans que cela soit signalé. Or les titres disparus sont rarement les gagnants.

Notre entrepôt de données permet de mesurer cette lacune sur le marché américain, selon le même calcul, mais avec un autre alphabet. Pour chaque année, prenez tous les symboles ayant enregistré une barre minute durant la deuxième semaine de mars, puis vérifiez lesquels enregistraient encore des échanges durant les deux dernières semaines de juillet 2026 :

RequêteSurvivorship mesuré : cohortes de symboles US de mars cotant encore fin juillet 2026
Le SQL exact derrière chaque chiffre
WITH on_tape_now AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-07-20')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
    GROUP BY ticker
),
cohort AS (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS cohort_year,
           ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2025
      AND toMonth(toTimeZone(window_start, 'America/New_York')) = 3
      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 14
    GROUP BY cohort_year, ticker
)
SELECT c.cohort_year AS year,
       count() AS names_on_tape_count,
       countIf(n.ticker != '') AS still_trading_count,
       count() - countIf(n.ticker != '') AS gone_count,
       round(100 * countIf(n.ticker != '') / count(), 1) AS still_trading_pct
FROM cohort AS c
LEFT JOIN on_tape_now AS n ON c.ticker = n.ticker
GROUP BY year
ORDER BY year
Run this yourself

Parmi les 8101 symboles qui se négociaient cette semaine-là en 2016, 50.1% figuraient encore dans les cotations fin juillet 2026, tandis que 4040 n’y figuraient plus. La cohorte 2025 s’établit à 86.7%. Un screen construit rétrospectivement à partir des titres cotés aujourd’hui exclut une part croissante du marché à mesure qu’il remonte sur ces 10 années.

L’hypothèse rassurante consiste à penser que les titres manquants étaient tous des penny stocks. Le classement de la cohorte de mars 2021 par tranches de volume quotidien moyen en dollars ce mois-là montre le contraire :

RequêteQui a quitté le tape : symboles de mars 2021 par volume quotidien en dollars, vérifiés par rapport à fin juillet 2026
Le SQL exact derrière chaque chiffre
WITH on_tape_now AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-07-20')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
    GROUP BY ticker
),
march_2021 AS (
    SELECT ticker,
           sum(toFloat64(close) * toFloat64(volume))
             / uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS avg_daily_dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-03-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2021-03-31')
    GROUP BY ticker
)
SELECT multiIf(d.avg_daily_dollar_volume >= 1000000000, '$1B or more',
               d.avg_daily_dollar_volume >= 100000000, '$100M to $1B',
               d.avg_daily_dollar_volume >= 10000000, '$10M to $100M',
               d.avg_daily_dollar_volume >= 1000000, '$1M to $10M',
               'under $1M') AS liquidity_bucket,
       count() AS names_count,
       countIf(n.ticker = '') AS gone_count,
       round(100 * countIf(n.ticker = '') / count(), 1) AS gone_pct
FROM march_2021 AS d
LEFT JOIN on_tape_now AS n ON d.ticker = n.ticker
GROUP BY liquidity_bucket
ORDER BY min(d.avg_daily_dollar_volume)
Run this yourself

La tranche under $1M a perdu la plus grande part, soit 57.5% des 3968 titres. La tranche la plus active n’était pas épargnée : 3.4% des 89 symboles négociant $1B or more par jour en mars 2021 avaient disparu fin juillet 2026. Fusions, sorties de la cote, faillites et sorties d’indice aboutissent tous au même résultat dans une table de prix : les lignes s’arrêtent.

ashare-lake traite ce point comme un problème central. Le jeu de données des instruments conserve les symboles radiés au lieu de se limiter aux titres encore cotés. Une table delisting_events indique comment chaque titre a disparu, et universe="all_a" dans l’API Python reconstitue un instantané historique qui les inclut. La documentation du projet fait état d’un écart d’environ deux fois entre un backtest limité aux survivants et un backtest incluant les radiations sur la période 2016-2021. C’est l’image inversée du piège décrit dans nos notes sur le biais d’anticipation dans les backtests : un univers qui connaît discrètement l’avenir.

Données disponibles à la date considérée

load("financial_statement_items", as_of="2018-04-30") renvoie la dernière version de chaque ligne publiée à cette date ou avant, et non la valeur révisée ultérieurement. Les barres comportent un argument adjust : hfq pour un ajustement rétrospectif, qfq pour une normalisation à l’intérieur de la fenêtre de requête, ou les prix bruts. Un facteur ajusté sur des chiffres que le marché n’avait pas encore publiés ne mesure rien. C’est le premier point à vérifier dans tout pipeline de facteur alpha généré par un LLM.

L’enregistrer comme serveur MCP

Le Model Context Protocol permet à un agent d’accéder aux outils. asl mcp communique via stdio, et le client lance le processus :

  • claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml
  • Tout autre client MCP utilise les deux mêmes éléments : asl comme commande, et mcp --config ainsi qu’un chemin absolu comme arguments. Le chemin doit être absolu, car le client peut lancer le processus depuis n’importe quel répertoire.

Six outils sont disponibles. Ils sont organisés par type de question, et non par dataset : describe_lake indique ce qui existe et comment le lire ; resolve_symbol convertit un nom en code, y compris pour les valeurs radiées de la cote ; query_bars interroge les barres de cours ; query_fundamentals utilise son argument as_of ; query_dataset couvre tous les autres besoins ; et run_sql exécute une requête DuckDB SELECT en lecture seule sur plusieurs datasets. Un indicateur --live permet au serveur de répondre aux recherches de symboles et de fournir les barres quotidiennes non ajustées depuis la source amont, sans écrire dans le lake.

Limites à connaître d’abord

  • Actions A uniquement. Ni Hong Kong, ni cotations aux États-Unis, ni aucune valeur en dehors de la Chine continentale.
  • Un projet personnel. Les issues et les pull requests sont traitées dans la mesure du possible. La documentation précise clairement qu’aucune garantie de disponibilité n’est offerte : les sites sources évoluent et une adresse IP peut être bloquée, ce qui interrompt l’ingestion jusqu’à la mise en place d’un correctif.
  • La licence Apache 2.0 couvre le code, pas les données. Chaque source amont conserve ses propres conditions. Le mainteneur n’accorde aucun droit de redistribuer ou de revendre les fichiers Parquet que vous générez. Lisez les conditions des sources avant toute utilisation commerciale.
  • Aucun compte ni token n’est nécessaire pour les sources interrogées. C’est à la fois l’intérêt du projet et sa fragilité.
  • La prise en charge de Windows a été ajoutée dans la version 0.3.0, et la version minimale de Python est passée à 3.10 dans la version 0.3.1.
Origine de ces informations sur le projet

La version 0.5.0, les six dates de publication et la version minimale de Python proviennent de l’historique des versions du projet sur PyPI et du CHANGELOG, consultés le 4 août 2026. Le catalogue des jeux de données, le comportement concernant les radiations et les données point-in-time, les options de la CLI, la liste des outils MCP, ainsi que les informations relatives à la licence et au support proviennent de la documentation du dépôt : docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md et docs/legal-and-data-sources.md. Les logiciels évoluent plus vite que les articles. Consultez donc la documentation correspondant à la version que vous installez. Les deux panneaux sur le biais de survivance mesurent des symboles américains dans notre propre entrepôt de données, et non des cotations chinoises. Ils illustrent le mécanisme plutôt qu’ils ne mesurent le marché des actions A.

FAQ

Faut-il une clé API pour construire un data lake local d’actions A-share ?

Pas avec cet outil. Les sources amont qu’il interroge ne nécessitent ni inscription ni token, et le data lake est stocké sur votre machine. Chaque source conserve ses propres conditions d’utilisation, qu’il faut vérifier avant tout usage commercial.

Combien de temps faut-il pour effectuer le backfill d’ashare-lake ?

La documentation estime qu’un backfill de l’historique complet prend plusieurs heures en temps réel et nécessite plusieurs Go d’espace disque. Une connexion fonctionnelle à un serveur de cotations amont est requise pendant toute l’opération. asl init --profile quick couvre les trois dernières années en quelques minutes et inclut toujours les titres qui ont depuis été retirés de la cote.

Un data lake local d’actions A-share inclut-il les titres retirés de la cote ?

Oui. Les symboles retirés de la cote restent dans le jeu de données des instruments. Une table delisting_events indique comment chaque titre a cessé d’être coté, et universe="all_a" construit un instantané historique qui les inclut. Notre propre mesure sur les États-Unis présentée plus haut montre ce qu’un univers limité aux survivants exclut.

Un agent d’IA peut-il interroger directement ashare-lake ?

Oui. asl mcp expose six outils via le Model Context Protocol, dont un outil SQL en lecture seule. L’agent interroge ainsi les fichiers Parquet locaux au lieu de faire du scraping. Enregistrez-le avec claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.

ashare-lake remplace-t-il AkShare ou Baostock ?

Non. Il se situe au-dessus de ces bibliothèques. Elles récupèrent les données auprès de sources amont. Ce projet stocke, versionne et réconcilie ensuite ces données dans des fichiers Parquet sélectionnés, avec une traçabilité au niveau de chaque ligne et un contrat par jeu de données.


Chaque chiffre présenté ci-dessus provient d’une requête stockée et versionnée sur des données de marché réelles. Développez un panneau pour consulter le SQL, ou exécutez le même contrôle du biais de survivance sur votre propre univers dans le terminal Strasmore.

#market-data#mcp#a-shares#open-source#ai-agents