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

Local A-Share Data Lake para sa AI Agents

Ang ashare-lake ay local A-share data lake sa sarili mong disk: 39 datasets, delisting records, point-in-time queries, at MCP server para sa AI agents.

Ang local A-share data lake ay kasaysayan ng Chinese mainland equity market na naka-save sa sarili mong disk bilang columnar Parquet files. Mabubuksan ito gamit ang DuckDB o Polars, sa halip na gumamit ng vendor endpoint na tinatawagan nang paisa-isang page. Ang ashare-lake ay isang open-source project na bumubuo ng ganitong data lake, kasama ang daily job na nagpapanatili rito na updated at isang Model Context Protocol server na nagpapahintulot sa AI agent na mag-query rito. Dalawang design choice ang dahilan kung bakit karapat-dapat itong talakayin dito: pinananatili ang mga delisted name, at mababasa ang fundamentals batay sa impormasyong available sa isang nakaraang petsa.

Bakit kailangan ng AI agent ng lokal na A-share data lake

May dalawang opsyon ang agent na nagsasaliksik ng Chinese equities kung wala itong lokal na kopya. Una, maaari itong mag-scrape ng finance pages, ubusin ang context window sa HTML, at gumawa ng mga numerong walang makapag-reproduce sa susunod na buwan. Ikalawa, maaari itong tumawag sa vendor na nangangailangan ng registration, may limitasyon sa bilang ng rows, at nag-uugnay sa bawat resulta sa isang account.

Ang scale ang bahaging madalas minamaliit. Ang sarili naming warehouse ay naglalaman ng US tape sa minute resolution, at ganito ang hitsura ng isang ordinaryong linggo:

QueryIsang linggo ng US minute tape: mga symbol at bar bawat session, Jul 20-24, 2026
Ang eksaktong SQL sa likod ng bawat numero
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

Noong Jul 20, nakagawa ang tape ng 1.79 milyong minute bars sa 11737 symbols, at inuulit ito ng apat pang session sa panel. Isang pambansang merkado, isang linggo, isang resolution. Ganoon din ang hugis ng isang dekada ng daily bars, fundamentals, index membership, at money-flow records para sa isa pang merkado. Kapag dinaanan ito nang paisa-isang page sa HTTP, nauubos ang run ng agent.

Dalawang bagay agad ang nababago ng isang lokal na lake. Nagiging file scan ang reads sa halip na quota, at ang query na isinulat ngayon ay nagbabalik ng parehong rows pagkalipas ng anim na buwan. Ito ang kailangan para maging nasusuri ang isang backtest. Pareho ang puntong inilalahad ng aming mga tala tungkol sa mga kasanayan sa market data para sa AI agents at sa isang SQL API sa market data para sa US data.

I-install ito, naka-pin sa isang bersyon

Python 3.10 o mas bago. I-pin ang bersyon: anim na release ang inilabas mula July 27 hanggang August 2, 2026, kaya ang install na walang pin sa setup script ng agent ay palaging nagbabago. Nasa rootSunc/ashare-lake ang code sa ilalim ng Apache 2.0.

  • Ini-install ng pip install ashare-lake==0.5.0 ang kasalukuyang release noong unang bahagi ng August 2026.
  • Ipinapakita ng asl --version ang naka-install na build.
  • Isinusulat ng asl config init --data-root /path/to/ashare-lake ang naka-package na halimbawang TOML na may nakalagay nang data root mo, nang hindi kailangang mag-checkout ng repository. Itinatakda ng --config ang output path, at ino-overwrite naman ito ng --force.
  • Pinapatakbo ng asl doctor ang mga check nito offline, bago ilipat ang anumang data.
  • Sinusuri ng asl servers test ang upstream quote hosts. Sinusuri ng asl sources ang bawat source, na may --vantage na cn, overseas, o local.

Dito muna. Ang susunod na command ay ang backfill, at hindi ito dapat patakbuhin habang nagbabasa.

Ginagawa ng backfill

Ginagawa ng asl init ang layout ng directory at pinupunan ang historical data. Ayon sa documentation ng proyekto, umaabot sa ilang oras ang full run at kumokonsumo ng ilang GB na disk space. Kailangan din nito ng live connection sa upstream Tongdaxin quote host, na vine-verify ng asl servers test. Para sa nakaraang tatlong taon, asl init --profile quick ang ginagamit. Ilang minuto lamang ang kailangan nito, at pinananatili pa rin nito ang bawat pangalan na na-trade sa loob ng panahong iyon, kabilang ang mga pangalang umalis na sa merkado. Ang asl run daily ang incremental job pagkatapos nito. Iniuulat ng asl status --datasets ang coverage at freshness ng bawat dataset. Naglalagay naman ang asl serve ng read-only dashboard sa 127.0.0.1:8787.

Walang kasamang data ang repository. Bawat Parquet file ay binubuo sa iyong machine. May row-level lineage ang bawat row na nagtatala kung aling source ang gumawa nito at kung kailan ito kinuha.

Ano ang 39 na dataset?

Naka-layer ang mga ito, mula sa reference data palabas: 36 na curated table at 3 derived table.

  • Reference: mga instrument, trading calendar mula 2016 hanggang 2027, at trading status.
  • Market data: daily bars, index bars, 1-minute at 5-minute bars, trade ticks, commodity bars, adjustment factors, at mga delisting event.
  • Corporate events: corporate actions, announcement index, at iskedyul ng earnings disclosure.
  • Fundamentals at valuation: mga item sa financial statement, valuation metrics, at analyst consensus.
  • Capital flow: fund flow, margin trading, northbound flows at holdings, dragon-tiger board ng mga disclosure para sa malalaking order, block trades, at institutional holdings.
  • Structure at industriya: mga miyembro ng sector, index constituents, mga miyembro ng industriya, at industry index.
  • Macro: macro indicators, market breadth, at economic calendar.
  • Sentiment at rotation: sentiment scores, hot rank, sector bars, sector fund flow, mga headline ng balita, at flash news wire.
  • Risk at compliance: iskedyul ng share unlock at mga regulatory event.

Ipinapakita ng lokasyon ng isang dataset kung ano ang mahalaga sa author. Ang adjustment factors at delisting events ay nasa market-data layer, katabi ng daily bars, at hindi inilagay sa appendix. Ang pagkakalagay na iyon ang kalahati ng proyekto na pinakamahalaga para sa sinumang sumusubok ng mga idea gamit ang historical data.

Paano hinahawakan ng isang lokal na lake ang survivorship bias

Nakukuha ang survivorship bias kapag ang universe ng isang pag-aaral ay binuo mula sa mga pangalan na nakalista pa rin ngayon. Tahimik na nawawala ang bawat kumpanyang nag-merge, naging private, o na-delist. At bihira lamang na ang mga nawawalang pangalan ang mga nagwagi.

Maaaring sukatin ng aming warehouse ang puwang na iyon para sa US market. Pareho ang arithmetic, ibang alphabet lamang. Para sa bawat taon, kunin ang lahat ng symbol na nagkaroon ng minute bar sa ikalawang linggo ng March. Pagkatapos, tingnan kung alin sa mga ito ang nagkaroon pa rin ng prints sa huling dalawang linggo ng July 2026:

QueryNasusukat na survivorship: mga March cohort ng US symbol na patuloy na nagte-trade noong huling bahagi ng July 2026
Ang eksaktong SQL sa likod ng bawat numero
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

Sa 8101 symbol na nag-trade sa linggong iyon noong 2016, 50.1% ang nasa tape pa noong huling bahagi ng July 2026, at 4040 ang wala na. Ang 2025 cohort ay 86.7%. Kapag nagpatakbo ng screen na binuo mula sa mga listing ngayon at ibinalik ito sa nakaraang 10 taon, lumalaki ang bahagi ng market na iniiwan nito habang tumatagal.

Karaniwang ipinapalagay na penny stocks lamang ang mga nawawalang pangalan. Ngunit iba ang ipinapakita ng pag-uuri sa March 2021 cohort ayon sa average daily dollar volume nito noong buwang iyon:

QuerySino ang nawala sa tape: mga March 2021 symbol ayon sa daily dollar volume, sinuri laban sa huling bahagi ng July 2026
Ang eksaktong SQL sa likod ng bawat numero
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

Ang under $1M tier ang nawalan ng pinakamalaking bahagi, 57.5% sa 3968 pangalan. Hindi rin nakaligtas ang may pinakamalaking trading activity: 3.4% sa 89 symbol na nag-trade ng $1B or more kada araw noong March 2021 ang nawala na pagsapit ng huling bahagi ng July 2026. Mergers, take-privates, bankruptcies, at index exits ay nagtatapos sa iisang paraan sa isang price table: humihinto ang mga row.

Itinuturing ito ng ashare-lake bilang pangunahing problema. Pinananatili ng instruments dataset ang mga na-delist na symbol sa halip na salain lamang ang mga live na symbol. Itinatala naman ng delisting_events table kung paano nagtapos ang bawat nawalang pangalan. At ang universe="all_a" sa Python API ay kumukuha ng historical snapshot na kasama ang mga ito. Ayon sa sariling docs ng proyekto, humigit-kumulang two-fold ang agwat sa pagitan ng backtest na survivor-only at ng backtest na kasama ang mga delisting mula 2016 hanggang 2021. Ito ang kabaligtaran ng bitag sa aming mga tala tungkol sa look-ahead bias sa backtesting: isang universe na tahimik nang alam ang hinaharap.

Mga point-in-time na pagbasa

Ibinabalik ng load("financial_statement_items", as_of="2018-04-30") ang pinakabagong bersyon ng bawat line item na inanunsyo sa o bago ang petsang iyon, hindi ang numerong kalaunan ay nirestate. May adjust argument ang mga bar: hfq para sa backward adjustment, qfq para sa normalization sa loob ng query window, o raw prices. Walang sinusukat ang factor na isinakto gamit ang mga numerong hindi pa nailalabas ng market. Ito ang unang dapat suriin sa anumang pipeline ng LLM generated alpha factor.

Pagrehistro dito bilang MCP server

Ang Model Context Protocol ang ginagamit ng agent para makakuha ng mga tool. Ipinapadala ito ng asl mcp sa pamamagitan ng stdio, at inilulunsad ng client ang proseso:

  • claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml
  • Ginagamit ng iba pang MCP client ang parehong dalawang bahagi: asl bilang command, at mcp --config kasama ang absolute path bilang mga argument. Kailangang absolute ang path dahil maaaring simulan ng client ang proseso mula sa anumang directory.

Anim na tool ang available. Inayos ang mga ito batay sa tanong, hindi sa dataset: ang describe_lake para malaman kung ano ang available at kung paano ito basahin; ang resolve_symbol para iugnay ang pangalan sa code, kabilang ang mga delisted name; ang query_bars; ang query_fundamentals na may as_of argument; ang query_dataset para sa iba pang pangangailangan; at ang run_sql para sa isang read-only DuckDB SELECT sa maraming dataset. Sa pamamagitan ng --live flag, maaaring kumuha ang server ng sagot para sa symbol lookup at unadjusted daily bars mula sa upstream nang hindi nagsusulat sa lake.

Mga limitasyong dapat munang malaman

  • A-shares lamang. Walang Hong Kong, US listings, o anuman sa labas ng mainland China.
  • Personal na proyekto ito. Pinaglalaanan ng best-effort na atensyon ang issues at pull requests. Malinaw din sa docs na walang garantiya sa availability: nagbabago ang upstream sites, at maaaring ma-block ang isang IP, na magpapahinto sa ingestion hanggang may mag-patch nito.
  • Saklaw ng Apache 2.0 ang code, hindi ang data. Sariling terms ang pinananatili ng bawat upstream source, at walang ibinibigay na karapatan ang maintainer na i-redistribute o i-resell ang mga Parquet file na binuo mo. Basahin ang terms ng source bago gamitin sa anumang commercial na aktibidad.
  • Walang account o token na kailangan para sa mga source na binabasa nito. Ito ang appeal nito, ngunit ito rin ang dahilan kung bakit marupok ang setup.
  • Dumating ang Windows support sa 0.3.0, at tinaasan ang minimum na Python version sa 3.10 sa 0.3.1.
Pinagmulan ng mga impormasyong ito tungkol sa proyekto

Ang version 0.5.0, ang anim na release date, at ang minimum na Python version ay mula sa release history ng proyekto sa PyPI at sa CHANGELOG, na binasa noong August 4, 2026. Ang dataset catalog, ang delisting at point-in-time na behavior, ang CLI flags, ang listahan ng MCP tools, at ang wording tungkol sa licensing at support ay mula sa docs ng repository: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md, at docs/legal-and-data-sources.md. Mas mabilis magbago ang software kaysa sa mga post, kaya tingnan ang docs para sa version na ini-install mo. Sinusukat ng dalawang survivorship panel ang mga US symbol sa sarili naming warehouse, hindi ang Chinese listings, at nagsisilbi lamang itong ilustrasyon ng mekanismo, hindi pagsukat sa A-share market.

Mga Madalas Itanong

Kailangan ba ng API key para gumawa ng lokal na A-share data lake?

Hindi para sa isang ito. Ang upstream sources na binabasa nito ay hindi nangangailangan ng registration o token, at nasa sarili mong machine ang data lake. May sarili pa ring terms of use ang bawat source, na kailangang suriin bago gamitin para sa anumang komersiyal na gawain.

Gaano katagal ang backfill ng ashare-lake?

Ayon sa dokumentasyon, ang full-history backfill ay tumatagal nang ilang oras na aktuwal na wall time at kumokonsumo ng ilang GB ng disk space. Kailangan ding tuloy-tuloy ang gumaganang koneksyon sa upstream quote host. Sinasaklaw ng asl init --profile quick ang pinakahuling three years sa loob ng ilang minuto, at kasama pa rin dito ang mga pangalan na na-delist na.

Kasama ba sa lokal na A-share data lake ang mga na-delist na stock?

Kasama. Nananatili ang mga na-delist na symbol sa instruments dataset. Itinatala naman ng delisting_events table kung paano nagtapos ang bawat pangalan, at gumagawa ang universe="all_a" ng historical snapshot na kasama ang mga iyon. Ipinapakita ng sarili naming US measurement sa itaas kung gaano kalaki ang iniiwan ng universe na survivor-only.

Maaari bang direktang mag-query ang isang AI agent sa ashare-lake?

Oo. Naglalantad ang asl mcp ng six tools sa Model Context Protocol, kabilang ang isang read-only SQL tool. Dahil dito, nagku-query ang agent sa lokal na Parquet sa halip na mag-scrape. I-register ito gamit ang claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.

Kapalit ba ng AkShare o Baostock ang ashare-lake?

Hindi. Nasa ibabaw ito ng mga iyon. Kumukuha ang mga library na iyon ng data mula sa upstream, samantalang iniimbak, binibigyan ng version, at nire-reconcile ng project na ito ang nakukuha nila sa curated Parquet, na may row-level lineage at tig-isang contract para sa bawat dataset.


Ang bawat figure sa itaas ay isang stored at versioned query mula sa aktuwal na market data. I-expand ang anumang panel para basahin ang SQL, o patakbuhin ang parehong survivorship check sa sarili mong universe sa Strasmore terminal.

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