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

Bina Data Lake A-share Tempatan untuk Ejen AI

ashare-lake membina data lake A-share pada cakera anda dengan tiga puluh sembilan set data, rekod nyahsenarai, pertanyaan point-in-time, serta pelayan MCP untuk ejen AI.

Data lake A-share tempatan ialah sejarah pasaran ekuiti tanah besar China yang disimpan pada cakera anda sendiri sebagai fail Parquet kolumnar, yang boleh dibaca oleh DuckDB atau Polars, bukannya titik akhir vendor yang anda panggil satu halaman pada satu masa. ashare-lake ialah projek sumber terbuka yang membina data lake tersebut, berserta tugasan harian yang memastikan data sentiasa terkini dan pelayan Model Context Protocol yang membolehkan ejen AI membuat pertanyaan terhadapnya. Dua pilihan reka bentuk menjadikannya layak untuk dibincangkan di sini: nama yang telah dinyahsenarai dikekalkan, dan data fundamental boleh dibaca berdasarkan tarikh yang lalu.

Mengapa ejen AI memerlukan data lake A-share tempatan

Ejen yang membuat kajian tentang ekuiti China tanpa salinan tempatan mempunyai dua pilihan. Ia melakukan skrap pada laman kewangan, menghabiskan tetingkap konteksnya pada HTML dan menghasilkan angka yang tidak boleh dihasilkan semula oleh sesiapa pun pada bulan hadapan. Atau, ia memanggil vendor yang memerlukan pendaftaran, yang mengehadkan baris data dan mengikat setiap hasil kepada satu akaun.

Skala adalah bahagian yang sering dipandang rendah. Gudang data kami sendiri menyimpan pita data US pada resolusi seminit, dan satu minggu biasa kelihatan seperti ini:

PertanyaanSatu minggu pita minit AS: simbol dan bar setiap sesi, 20-24 Jul 2026
SQL tepat di sebalik setiap nombor
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

Pada Jul 20 pita tersebut menghasilkan 1.79 juta bar seminit merentasi 11737 simbol, dan empat sesi lain dalam panel tersebut mengulangi perkara yang sama. Satu pasaran negara, satu minggu, satu resolusi. Sedekad bar harian, fundamental, keahlian indeks, dan rekod aliran wang untuk pasaran lain mempunyai bentuk yang sama, dan memuatkannya melalui HTTP akan menghabiskan masa larian ejen.

Data lake tempatan mengubah dua perkara serentak. Bacaan menjadi imbasan fail dan bukannya kuota, dan pertanyaan yang ditulis hari ini akan mengembalikan baris yang sama dalam tempoh enam bulan, iaitu keperluan untuk ujian ke belakang (backtest) yang boleh disemak. Nota kami mengenai kemahiran data pasaran untuk ejen AI dan mengenai API SQL ke atas data pasaran mengemukakan hujah yang sama untuk data US.

Pasang, tetapkan pada satu versi

Python 3.10 atau lebih baharu. Tetapkan versi tersebut: enam keluaran telah dilancarkan antara 27 Julai dan 2 Ogos 2026, dan pemasangan tanpa tetapan versi di dalam skrip penyediaan ejen adalah sasaran yang berubah-ubah. Kod tersebut terletak di rootSunc/ashare-lake di bawah lesen Apache 2.0.

  • pip install ashare-lake==0.5.0 memasang keluaran semasa setakat awal Ogos 2026.
  • asl --version memaparkan binaan yang dipasang.
  • asl config init --data-root /path/to/ashare-lake menulis contoh TOML yang dipakej dengan akar data anda diisi, tiada semakan repositori diperlukan. --config menetapkan laluan output, --force menulis ganti.
  • asl doctor menjalankan semakannya di luar talian, sebelum sebarang data dipindahkan.
  • asl servers test meninjau hos sebut harga huluan. asl sources meninjau setiap sumber, dengan --vantage bagi cn, overseas, atau local.

Berhenti di situ. Perintah seterusnya ialah pengisian semula (backfill), dan ia bukanlah sesuatu yang patut dimulakan semasa sedang membaca.

Fungsi backfill

asl init mencipta susun atur direktori dan mengisi data sejarah. Dokumentasi projek menyatakan bahawa pelaksanaan penuh mengambil masa beberapa jam dan menggunakan beberapa GB ruang cakera, serta memerlukan sambungan langsung ke hos sebut harga Tongdaxin huluan, iaitu perkara yang disahkan oleh asl servers test. asl init --profile quick pula meliputi tempoh tiga tahun terkini dalam masa beberapa minit, dan masih mengekalkan setiap nama yang didagangkan dalam tempoh tersebut, termasuk nama yang telah keluar daripada pasaran. asl run daily ialah tugasan tambahan selepas itu, asl status --datasets melaporkan liputan dan kesegaran bagi setiap set data, dan asl serve menyediakan papan pemuka baca-sahaja pada 127.0.0.1:8787.

Repositori ini tidak membekalkan sebarang data. Setiap fail Parquet dibina pada mesin anda, dengan salasilah peringkat baris pada setiap baris yang merekodkan sumber yang menghasilkannya dan masa ia diperoleh.

Apakah 39 set data tersebut?

Ia disusun secara berlapis, bermula daripada data rujukan ke luar: 36 jadual yang dikurasi dan tiga jadual terbitan.

  • Rujukan: instrumen, kalendar dagangan yang meliputi tahun 2016 hingga 2027, dan status dagangan.
  • Data pasaran: bar harian, bar indeks, bar satu minit dan lima minit, tick dagangan, bar komoditi, faktor pelarasan, dan peristiwa penyahsenaraian.
  • Peristiwa korporat: tindakan korporat, indeks pengumuman, dan jadual pendedahan pendapatan.
  • Fundamental dan penilaian: item penyata kewangan, metrik penilaian, dan konsensus penganalisis.
  • Aliran modal: aliran dana, dagangan margin, aliran dan pegangan arah utara (northbound), pendedahan pesanan besar papan dragon-tiger, dagangan blok, dan pegangan institusi.
  • Struktur dan industri: ahli sektor, konstituen indeks, ahli industri, dan indeks industri.
  • Makro: indikator makro, keluasan pasaran, dan kalendar ekonomi.
  • Sentimen dan putaran: skor sentimen, kedudukan hangat (hot rank), bar sektor, aliran dana sektor, tajuk berita, dan saluran berita kilat.
  • Risiko dan pematuhan: jadual pembukaan kunci saham (share unlock) dan peristiwa kawal selia.

Kedudukan sesuatu set data menunjukkan perkara yang diutamakan oleh penulis. Faktor pelarasan dan peristiwa penyahsenaraian diletakkan dalam lapisan data pasaran di samping bar harian, bukannya diletakkan di dalam lampiran. Penempatan tersebut merupakan separuh daripada projek yang paling bernilai bagi sesiapa yang menguji idea berdasarkan sejarah.

Bagaimana tasik data tempatan menangani bias kemandirian

Bias kemandirian berlaku apabila skop kajian hanya diambil daripada nama-nama yang masih tersenarai pada hari ini. Setiap syarikat yang bergabung, menjadi syarikat persendirian, atau dinyahsenarai hilang begitu sahaja, dan nama-nama yang lenyap itu jarang sekali terdiri daripada syarikat yang berjaya.

Gudang data kami boleh mengukur kelompangan tersebut bagi pasaran AS, dengan aritmetik yang sama dalam abjad yang berbeza. Bagi setiap tahun, ambil setiap simbol yang mencatatkan bar seminit pada minggu kedua bulan Mac, kemudian semak yang mana antara simbol tersebut masih aktif dalam dua minggu terakhir bulan Julai 2026:

PertanyaanKelangsungan hidup, diukur: kohort Mac simbol AS yang masih didagangkan pada lewat Julai 2026
SQL tepat di sebalik setiap nombor
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

Daripada 8101 simbol yang didagangkan pada minggu tersebut dalam 2016, 50.1% masih berada di papan dagangan pada lewat Julai 2026, dan 4040 pula tidak lagi. Kohort 2025 mencatatkan 86.7%. Jalankan saringan yang dibina daripada senarai hari ini secara ke belakang merentasi 10 tahun tersebut dan ia akan menggugurkan bahagian pasaran yang semakin meluas sepanjang tempoh itu.

Andaian yang selesa ialah nama-nama yang hilang itu semuanya adalah saham sen (penny stocks). Menyusun kohort Mac 2021 mengikut peringkat berdasarkan purata volum dolar harian pada bulan tersebut menunjukkan sebaliknya:

PertanyaanSiapa yang meninggalkan pita: simbol Mac 2021 mengikut volum dolar harian, disemak berbanding lewat Julai 2026
SQL tepat di sebalik setiap nombor
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

Peringkat under $1M kehilangan bahagian terbesar, iaitu 57.5% daripada 3968 nama. Peringkat yang paling aktif juga tidak terkecuali: 3.4% daripada 89 simbol yang didagangkan sebanyak $1B or more sehari pada Mac 2021 telah tiada menjelang lewat Julai 2026. Penggabungan, penswastaan, muflis, dan penyingkiran indeks semuanya berakhir dengan cara yang sama dalam jadual harga: baris data tersebut terhenti.

ashare-lake menganggap perkara ini sebagai masalah utama. Set data instrumen mengekalkan simbol yang dinyahsenarai dan bukannya menapis kepada simbol yang masih aktif, jadual delisting_events merekodkan bagaimana setiap nama yang hilang itu berakhir, dan universe="all_a" dalam API Python menyelesaikan syot kilas sejarah yang merangkumi simbol-simbol tersebut. Dokumentasi projek itu sendiri melaporkan jurang kira-kira dua kali ganda antara ujian ke belakang (backtest) yang hanya melibatkan syarikat yang mandiri dengan ujian yang merangkumi penyahsenaraian bagi tempoh 2016 hingga 2021. Ini adalah cerminan kepada perangkap dalam nota bias pandang ke hadapan dalam ujian ke belakang kami: satu alam semesta yang secara senyap mengetahui masa depan.

Bacaan titik masa

load("financial_statement_items", as_of="2018-04-30") mengembalikan versi terkini bagi setiap butiran yang diumumkan pada atau sebelum tarikh tersebut, bukan angka yang dinyatakan semula kemudian. Bar harga membawa argumen adjust: hfq untuk pelarasan ke belakang, qfq yang dinormalkan dalam tetingkap pertanyaan, atau harga mentah. Faktor yang dipadankan dengan angka yang belum diterbitkan oleh pasaran tidak mengukur apa-apa, dan ini adalah perkara pertama yang perlu diperiksa dalam mana-mana saluran faktor alfa yang dijana LLM.

Mendaftarkannya sebagai pelayan MCP

Model Context Protocol ialah cara ejen memilih alat. asl mcp menggunakan protokol ini melalui stdio, dan klien melancarkan proses tersebut:

  • claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml
  • Mana-mana klien MCP lain memerlukan dua perkara yang sama: asl sebagai arahan, dan mcp --config berserta laluan mutlak sebagai argumen. Laluan tersebut mestilah mutlak, kerana klien mungkin memulakan proses daripada mana-mana direktori.

Enam alat disediakan, disusun mengikut soalan dan bukannya mengikut set data: describe_lake untuk mengetahui perkara yang wujud dan cara membacanya, resolve_symbol untuk menukar nama kepada kod (termasuk nama yang telah dinyahsenarai), query_bars, query_fundamentals dengan argumen as_of miliknya, query_dataset untuk perkara lain, dan run_sql untuk satu arahan SELECT DuckDB baca-sahaja merentas set data. Bendera --live membolehkan pelayan menjawab carian simbol dan bar harian yang tidak diselaraskan daripada sumber hulu tanpa menulis ke dalam lake.

Had yang perlu diketahui terlebih dahulu

  • Hanya saham A. Tiada penyenaraian Hong Kong, tiada penyenaraian AS, dan tiada apa-apa di luar tanah besar China.
  • Projek peribadi. Isu dan permintaan tarik (pull requests) diberikan perhatian berdasarkan usaha terbaik, dan dokumentasi menyatakan dengan jelas bahawa tiada jaminan ketersediaan: tapak sumber berubah, dan alamat IP boleh disekat, yang akan menghentikan proses pengambilan data sehingga seseorang melakukan tampalan.
  • Apache 2.0 melindungi kod, bukan data. Setiap sumber asal mengekalkan terma masing-masing, dan penyelenggara tidak memberikan hak untuk mengedar semula atau menjual semula fail Parquet yang anda bina. Baca terma sumber sebelum sebarang penggunaan komersial.
  • Tiada akaun atau token diperlukan untuk sumber yang dibacanya, yang merupakan tarikan utama serta kelemahan projek ini.
  • Sokongan Windows bermula pada versi 0.3.0, dan keperluan minimum Python dinaikkan kepada 3.10 pada versi 0.3.1.
Dari mana fakta projek ini diperoleh

Versi 0.5.0, enam tarikh keluaran, dan keperluan minimum Python diperoleh daripada sejarah keluaran PyPI projek dan CHANGELOG, yang dibaca pada 4 Ogos 2026. Katalog set data, penyahsenaraian dan tingkah laku point-in-time, bendera CLI, senarai alat MCP, serta perihal pelesenan dan sokongan diperoleh daripada dokumentasi repositori: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md, dan docs/legal-and-data-sources.md. Perisian berkembang lebih pantas daripada hantaran, jadi semak dokumentasi untuk versi yang anda pasang. Dua panel survivorship mengukur simbol AS dalam gudang data kami sendiri, bukan penyenaraian China, dan berfungsi sebagai ilustrasi mekanik dan bukannya ukuran pasaran saham A.

Soalan Lazim

Adakah anda memerlukan kunci API untuk membina data lake A-share tempatan?

Tidak untuk yang ini. Sumber hulu yang dibacanya tidak memerlukan pendaftaran atau token, dan data lake itu sendiri disimpan pada mesin anda. Setiap sumber mempunyai syarat penggunaan tersendiri, yang perlu diambil kira sebelum sebarang kerja komersial dilakukan.

Berapa lama masa yang diambil untuk backfill ashare-lake?

Dokumen menyatakan bahawa backfill sejarah penuh mengambil masa beberapa jam dan beberapa GB ruang cakera, dengan sambungan yang stabil ke hos sebut harga hulu diperlukan sepanjang proses tersebut. asl init --profile quick meliputi tiga tahun terkini dalam masa beberapa minit dan masih merangkumi nama syarikat yang telah dinyahsenarai.

Adakah data lake A-share tempatan merangkumi saham yang telah dinyahsenarai?

Ya, yang ini merangkumi saham tersebut. Simbol yang dinyahsenarai kekal dalam set data instrumen, jadual delisting_events merekodkan bagaimana setiap nama berakhir, dan universe="all_a" membina syot kilat sejarah yang merangkuminya. Pengukuran AS kami di atas menunjukkan saiz data yang tertinggal jika hanya menggunakan alam semesta saham yang masih aktif.

Bolehkah ejen AI membuat pertanyaan terus kepada ashare-lake?

Ya. asl mcp mendedahkan enam alat melalui Model Context Protocol, salah satunya ialah alat SQL baca sahaja, jadi ejen membuat pertanyaan kepada Parquet tempatan dan bukannya melakukan scraping. Daftarkannya dengan claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.

Adakah ashare-lake pengganti kepada AkShare atau Baostock?

Tidak. Ia berada di atasnya. Pustaka tersebut mengambil data daripada sumber hulu; projek ini menyimpan, mengurus versi, dan menyelaraskan data yang diambil ke dalam format Parquet yang disusun dengan salasilah peringkat baris dan satu kontrak bagi setiap set data.


Setiap angka di atas adalah pertanyaan yang disimpan dan diletakkan versi ke atas data pasaran sebenar, kembangkan mana-mana panel untuk membaca SQL, atau jalankan semakan kemandirian yang sama pada alam semesta anda sendiri di terminal Strasmore.

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