Lokaler A-Share-Datensee für KI-Agenten
ashare-lake erstellt einen lokalen A-Share-Datensee mit 39 Datensätzen, Delisting-Daten, zeitpunktbezogenen Abfragen und einem MCP-Server für KI-Agenten.
Ein lokaler A-Share-Datensee enthält die Historie des chinesischen Festland-Aktienmarkts als spaltenorientierte Parquet-Dateien auf Ihrem eigenen Datenträger. Sie können diese Dateien mit DuckDB oder Polars lesen. Das ist etwas anderes als ein Vendor-Endpunkt, den Sie Seite für Seite abfragen. ashare-lake ist ein Open-Source-Projekt, das einen solchen Datensee aufbaut. Dazu gehören auch der tägliche Job zur Aktualisierung und ein Model Context Protocol-Server, über den ein KI-Agent die Daten abfragen kann. Zwei Designentscheidungen machen das Projekt besonders erwähnenswert: Delistings bleiben erhalten, und Fundamentaldaten lassen sich mit dem Kenntnisstand eines vergangenen Datums abfragen.
Warum ein KI-Agent einen lokalen A-Aktien-Datenbestand braucht
Ein Agent, der chinesische Aktien ohne lokale Kopie untersucht, hat zwei Möglichkeiten. Er durchsucht Finanzseiten, verbraucht sein Kontextfenster mit HTML und erzeugt Kennzahlen, die im nächsten Monat niemand reproduzieren kann. Oder er ruft einen zugangsbeschränkten Datenanbieter auf, der die Zahl der Zeilen begrenzt und jedes Ergebnis an ein Konto bindet.
Der Umfang wird häufig unterschätzt. Unser eigenes Data Warehouse enthält US-Marktdaten in Minutentaktung. Eine gewöhnliche Woche sieht darin so aus:
Das exakte SQL hinter jeder Zahl
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 sessionAm Jul 20 erzeugte der Markt 1.79 Millionen Minuten-Bars für 11737 Ticker. Die vier anderen Sitzungen im Panel zeigen dasselbe Muster. Ein nationaler Markt, eine Woche, eine Auflösung. Ein Jahrzehnt täglicher Bars sowie Fundamentaldaten, Indexzugehörigkeiten und Kapitalflussdaten für einen anderen Markt hat dieselbe Größenordnung. Diese Daten seitenweise über HTTP abzurufen, verbraucht den gesamten Lauf eines Agenten.
Ein lokaler Datenbestand verändert zwei Dinge gleichzeitig. Lesezugriffe werden zu einem Dateiscan statt zu einer Abfrage mit Kontingent. Außerdem liefert eine heute formulierte Abfrage auch in sechs Monaten dieselben Zeilen. Genau das muss ein Backtest leisten, damit er überprüfbar bleibt. Unsere Hinweise zu Datenkompetenz für KI-Agenten im Finanzmarkt und zu einer SQL-API für Marktdaten führen dasselbe Argument für US-Daten aus.
Installieren und auf eine Version festlegen
Python 3.10 oder neuer. Legen Sie die Version fest: Zwischen dem 27. Juli und dem 2. August 2026 wurden sechs Releases veröffentlicht. Eine Installation ohne Versionsfestlegung im Setup-Skript eines Agenten führt daher zu einem sich ständig ändernden Ziel. Der Code befindet sich unter rootSunc/ashare-lake und steht unter der Apache-2.0-Lizenz.
pip install ashare-lake==0.5.0installiert den aktuellen Stand Anfang August 2026.asl --versiongibt den installierten Build aus.asl config init --data-root /path/to/ashare-lakeschreibt die mitgelieferte TOML-Beispieldatei und trägt Ihr Datenstammverzeichnis ein. Dafür ist kein Checkout des Repositorys erforderlich.--configlegt den Ausgabepfad fest,--forceüberschreibt vorhandene Inhalte.asl doctorführt die Prüfungen offline aus, bevor Daten übertragen werden.asl servers testprüft die vorgelagerten Quote-Hosts.asl sourcesprüft jede Quelle mit einem--vantagevoncn,overseasoderlocal.
Halten Sie hier an. Der nächste Befehl startet den Backfill. Sie sollten ihn nicht einfach während des Lesens ausführen.
Was der Backfill erledigt
asl init erstellt die Verzeichnisstruktur und füllt die Historie. Laut Projektdokumentation dauert ein vollständiger Lauf mehrere Stunden und benötigt mehrere GB Speicherplatz. Außerdem ist eine aktive Verbindung zu einem vorgeschalteten Tongdaxin-Kursserver erforderlich. Diese Verbindung prüft asl servers test. asl init --profile quick deckt stattdessen die vergangenen drei Jahre ab. Der Vorgang dauert nur wenige Minuten. Dabei bleiben alle Wertpapiere erhalten, die innerhalb dieses Zeitraums gehandelt wurden. Das gilt auch für Wertpapiere, die inzwischen nicht mehr am Markt sind. asl run daily ist anschließend der inkrementelle Job. asl status --datasets meldet Abdeckung und Aktualität für jeden Datensatz. asl serve stellt unter 127.0.0.1:8787 ein schreibgeschütztes Dashboard bereit.
Das Repository enthält keinerlei Daten. Jede Parquet-Datei wird auf Ihrem Rechner erstellt. Für jede Zeile wird außerdem die Herkunft dokumentiert: welche Quelle die Daten geliefert hat und wann sie abgerufen wurden.
Welche 39 Datensätze gibt es?
Sie sind hierarchisch aufgebaut und reichen von Referenzdaten bis zu abgeleiteten Daten: 36 kuratierte Tabellen und drei abgeleitete Tabellen.
- Referenzdaten: Instrumente, ein Handelskalender für den Zeitraum von 2016 bis 2027 sowie der Handelsstatus.
- Marktdaten: Tagesdaten, Indexdaten, 1-Minuten- und 5-Minuten-Daten, einzelne Trade-Ticks, Rohstoffdaten, Anpassungsfaktoren und Delisting-Ereignisse.
- Unternehmensereignisse: Kapitalmaßnahmen, ein Ankündigungsindex und der Zeitplan für die Veröffentlichung von Ergebnissen.
- Fundamentaldaten und Bewertung: Positionen aus Finanzberichten, Bewertungskennzahlen und Analystenkonsens.
- Kapitalströme: Fondsströme, Margin-Handel, Northbound-Ströme und -Bestände, das Dragon-Tiger-Board mit Meldungen zu Großaufträgen, Block Trades sowie institutionelle Bestände.
- Marktstruktur und Branchen: Sektormitglieder, Indexbestandteile, Branchenmitglieder und Branchenindizes.
- Makrodaten: Makroindikatoren, Marktbreite und ein Wirtschaftskalender.
- Sentiment und Rotation: Sentiment-Scores, ein Ranking der meistbeachteten Werte, Sektordaten, Sektor-Fondsströme, Nachrichtenüberschriften und ein Ticker für Eilmeldungen.
- Risiko und Compliance: der Zeitplan für die Aufhebung von Aktiensperren sowie regulatorische Ereignisse.
Die Position eines Datensatzes zeigt, worauf der Autor besonderen Wert legt. Anpassungsfaktoren und Delisting-Ereignisse stehen in der Marktdatenebene direkt neben den Tagesdaten und sind nicht in einem Anhang abgelegt. Gerade diese Einordnung ist für alle, die Strategien anhand historischer Daten testen, die Hälfte des Projekts mit dem größten Wert.
Wie ein lokaler Lake den Survivorship Bias behandelt
Survivorship Bias entsteht, wenn die Grundgesamtheit einer Studie aus den Titeln gebildet wird, die heute noch gelistet sind. Jedes Unternehmen, das fusioniert hat, in Privatbesitz übergegangen oder delistet worden ist, fehlt stillschweigend. Die verschwundenen Titel waren zudem nur selten die Gewinner.
Unser Warehouse kann diese Lücke für den US-Markt quantifizieren. Die Berechnung ist dieselbe, nur mit einer anderen Buchstabierung. Für jedes Jahr nehmen wir jedes Symbol, für das in der zweiten Märzwoche eine Minutenkerze vorlag. Anschließend prüfen wir, welche dieser Symbole in den letzten beiden Juliwochen 2026 noch gehandelt wurden:
Das exakte SQL hinter jeder Zahl
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 yearVon den 8101 Symbolen, die in dieser Woche in 2016 gehandelt wurden, waren 50.1% Ende Juli 2026 noch am Markt. 4040 waren es nicht mehr. Die Kohorte 2025 ergibt 86.7%. Eine auf den heutigen Listings basierende Rückwärtssuche verliert über diese 10 Jahre hinweg einen immer größeren Teil des Marktes.
Die naheliegende Annahme lautet, dass es sich bei den fehlenden Titeln ausschließlich um Penny Stocks gehandelt habe. Eine Einteilung der Kohorte vom März 2021 nach dem durchschnittlichen täglichen Dollar-Handelsvolumen in diesem Monat zeigt ein anderes Bild:
Das exakte SQL hinter jeder Zahl
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)Die under $1M-Kategorie verlor den größten Anteil: 57.5% von 3968 Titeln. Auch die umsatzstärkste Kategorie war nicht ausgenommen. 3.4% der 89 Symbole, die im März 2021 ein tägliches Volumen von $1B or more aufwiesen, waren Ende Juli 2026 nicht mehr gelistet. Fusionen, Going-private-Transaktionen, Insolvenzen und das Ausscheiden aus einem Index enden in einer Preistabelle alle gleich: Die Zeilen hören auf.
ashare-lake behandelt dieses Problem als zentralen Bestandteil der Datenqualität. Der Instrumentedatensatz behält delistete Symbole, statt auf noch aktive Titel zu filtern. Eine Tabelle namens delisting_events erfasst, wie jedes ausgeschiedene Unternehmen vom Markt verschwand. Und universe="all_a" in der Python-API löst einen historischen Snapshot auf, der diese Titel einschließt. Die Dokumentation des Projekts weist für den Zeitraum von 2016 bis 2021 auf eine etwa zweifache Differenz zwischen einem Backtest ausschließlich mit Überlebenden und einem Backtest einschließlich delisteter Titel hin. Das ist das Gegenstück zur Falle in unseren Notizen zum Look-ahead Bias im Backtesting: eine Grundgesamtheit, die stillschweigend die Zukunft kennt.
Punkt-in-time-Abfragen
load("financial_statement_items", as_of="2018-04-30") gibt die jeweils aktuellste Version jeder Kennzahl zurück, die an diesem Datum oder früher veröffentlicht wurde. Spätere Revisionen werden nicht verwendet. Kursbalken enthalten ein adjust-Argument: hfq für eine Rückwärtsanpassung, qfq für eine Normalisierung innerhalb des Abfragefensters oder unveränderte Kurse. Ein Faktor, der auf Zahlen angepasst wurde, die der Markt zu diesem Zeitpunkt noch nicht veröffentlicht hatte, misst nichts. Das ist die erste Prüfung in jeder Pipeline für einen von einem LLM erzeugten Alpha-Faktor.
Registrierung als MCP-Server
Das Model Context Protocol ist die Schnittstelle, über die ein Agent auf Tools zugreift. asl mcp verwendet dafür stdio, und der Client startet den Prozess:
claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml- Jeder andere MCP-Client verwendet dieselben beiden Komponenten:
aslals Befehl sowiemcp --configund einen absoluten Pfad als Argumente. Der Pfad muss absolut sein, da der Client den Prozess aus jedem beliebigen Verzeichnis starten kann.
Es stehen sechs Tools zur Verfügung. Sie sind nach Fragen und nicht nach Datensätzen organisiert: describe_lake für den verfügbaren Datenbestand und die Abfragemöglichkeiten, resolve_symbol für die Zuordnung eines Namens zu einem Code einschließlich delisteter Namen, query_bars, query_fundamentals mit seinem Argument as_of, query_dataset für alle übrigen Abfragen sowie run_sql für eine einzelne schreibgeschützte DuckDB-SELECT-Abfrage über mehrere Datensätze hinweg. Mit einem --live-Flag kann der Server Symbolabfragen und nicht bereinigte Tagesdaten direkt aus der Upstream-Quelle beantworten, ohne sie in den Datenbestand zu schreiben.
Zunächst wichtige Einschränkungen
- Nur A-Aktien. Keine Notierungen in Hongkong oder den USA und nichts außerhalb des chinesischen Festlands.
- Ein persönliches Projekt. Issues und Pull Requests werden nach bestem Wissen und Gewissen bearbeitet. In der Dokumentation steht ausdrücklich, dass keine Verfügbarkeitsgarantie besteht: Upstream-Websites ändern sich, und eine IP-Adresse kann blockiert werden. Dann stoppt die Datenerfassung, bis jemand einen Patch einspielt.
- Apache 2.0 gilt für den Code, nicht für die Daten. Jede Upstream-Quelle hat eigene Nutzungsbedingungen. Der Maintainer gewährt kein Recht, die erstellten Parquet-Dateien weiterzuverteilen oder weiterzuverkaufen. Lesen Sie vor jeder kommerziellen Nutzung die Bedingungen der Quellen.
- Für die eingelesenen Quellen sind weder Konto noch Token erforderlich. Das ist der Vorteil, macht das Projekt aber auch anfällig.
- Die Windows-Unterstützung kam mit 0.3.0 hinzu. Mit 0.3.1 wurde die Mindestversion von Python auf 3.10 angehoben.
Herkunft dieser Projektdaten
Version 0.5.0, die sechs Veröffentlichungstermine und die Python-Mindestversion stammen aus der PyPI-Versionshistorie und dem CHANGELOG des Projekts, eingesehen am 4. August 2026. Der Datenkatalog, das Verhalten bei Delistings und für historische Datenstände, die CLI-Flags, die MCP-Tool-Liste sowie die Angaben zu Lizenzierung und Support stammen aus der Repository-Dokumentation: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md und docs/legal-and-data-sources.md. Software entwickelt sich schneller als Beiträge. Prüfen Sie daher die Dokumentation für die von Ihnen installierte Version. Die beiden Survivorship-Panels messen US-Symbole in unserem eigenen Data Warehouse, nicht chinesische Notierungen. Sie veranschaulichen den Mechanismus, sind aber keine Messung des A-Aktienmarkts.
FAQ
Benötigen Sie einen API-Schlüssel, um einen lokalen A-Share-Datensee aufzubauen?
Nicht bei diesem Projekt. Die eingebundenen Upstream-Quellen erfordern weder Registrierung noch Token, und der Datensee liegt auf Ihrem Rechner. Für jede Quelle gelten eigene Nutzungsbedingungen. Diese müssen vor einer kommerziellen Nutzung geprüft werden.
Wie lange dauert das Backfill des ashare-lake?
Die Dokumentation veranschlagt für ein vollständiges Backfill mehrere Stunden Laufzeit und mehrere GB Speicherplatz. Währenddessen ist eine funktionierende Verbindung zu einem Upstream-Kursserver erforderlich. asl init --profile quick deckt die vergangenen drei Jahre in wenigen Minuten ab und enthält weiterhin Titel, die inzwischen delistet wurden.
Enthält ein lokaler A-Share-Datensee delistete Aktien?
Dieser Datensee tut das. Delistete Symbole bleiben im Instrumentendatensatz erhalten. Eine Tabelle namens delisting_events dokumentiert, wie die jeweilige Notierung endete. universe="all_a" erstellt einen historischen Snapshot, der diese Titel einschließt. Unsere obige Messung für die USA zeigt, wie groß der Teil des Universums ist, den ein ausschließlich aus überlebenden Titeln bestehendes Universum auslässt.
Kann ein KI-Agent ashare-lake direkt abfragen?
Ja. asl mcp stellt über das Model Context Protocol sechs Tools bereit. Eines davon ist ein schreibgeschütztes SQL-Tool. Dadurch fragt der Agent lokale Parquet-Dateien ab, anstatt Daten per Scraping zu erfassen. Registrieren Sie es mit claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.
Ist ashare-lake ein Ersatz für AkShare oder Baostock?
Nein. ashare-lake baut auf diesen Bibliotheken auf. Sie rufen Daten aus Upstream-Quellen ab. Dieses Projekt speichert, versioniert und konsolidiert die abgerufenen Daten in kuratierten Parquet-Dateien – mit Nachvollziehbarkeit auf Zeilenebene und einem eigenen Vertrag für jeden Datensatz.
Jede oben genannte Zahl stammt aus einer gespeicherten und versionierten Abfrage über reale Marktdaten. Erweitern Sie ein beliebiges Panel, um das SQL zu lesen, oder führen Sie dieselbe Survivorship-Prüfung für Ihr eigenes Universum im Strasmore-Terminal aus.