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

Data Lake A-Share Lokal untuk Agen AI

ashare-lake membangun data lake A-share lokal di disk Anda: 39 dataset, catatan delisting, query point-in-time, dan server MCP untuk agen AI.

Data lake A-share lokal adalah histori pasar ekuitas Tiongkok daratan yang tersimpan di disk Anda sendiri sebagai file Parquet kolumnar. Data tersebut dapat dibaca oleh DuckDB atau Polars, bukan melalui endpoint vendor yang dipanggil satu halaman setiap kali. ashare-lake adalah proyek open-source yang membangun data lake tersebut, termasuk job harian untuk menjaganya tetap mutakhir serta server Model Context Protocol yang memungkinkan agen AI melakukan query. Dua pilihan desain membuatnya layak dibahas di sini: saham yang telah delisting tetap disimpan, dan data fundamental dapat dibaca berdasarkan tanggal historis tertentu.

Mengapa agen AI memerlukan data lake lokal untuk data A-share

Agen yang meneliti ekuitas China tanpa salinan lokal memiliki dua pilihan. Agen tersebut dapat melakukan scraping halaman keuangan, menghabiskan context window untuk HTML, lalu menghasilkan angka yang tidak dapat direproduksi bulan depan. Atau, agen tersebut dapat memanggil vendor yang membatasi akses melalui registrasi, yang membatasi jumlah baris dan mengaitkan setiap hasil dengan sebuah akun.

Skala adalah aspek yang sering diremehkan. Data warehouse kami sendiri menyimpan tape AS dengan resolusi per menit, dan satu minggu biasa dari data tersebut terlihat seperti ini:

QuerySkala tape satu minggu: simbol dan bar per sesi AS, 20–24 Jul 2026
SQL tepat di balik setiap angka
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, tape menghasilkan 1.79 juta minute bar across 11737 simbol, dan empat sesi lain dalam panel tersebut menunjukkan pola yang sama. Satu pasar nasional, satu minggu, satu resolusi. Data daily bar selama satu dekade, fundamental, keanggotaan indeks, dan catatan money flow untuk pasar lain memiliki bentuk yang sama. Memuatnya secara bertahap melalui HTTP akan menghabiskan satu eksekusi agen.

Lake lokal mengubah dua hal sekaligus. Pembacaan data menjadi pemindaian file, bukan penggunaan kuota. Selain itu, query yang ditulis hari ini akan mengembalikan baris yang sama enam bulan lagi. Hal ini diperlukan agar backtest dapat diverifikasi. Catatan kami tentang keterampilan data pasar untuk agen AI dan tentang SQL API di atas data pasar menyampaikan argumen yang sama untuk data AS.

Instal satu versi yang dipatok

Python 3.10 atau yang lebih baru. Patok versinya: enam rilis diterbitkan antara 27 Juli dan 2 Agustus 2026, sehingga instalasi tanpa versi yang dipatok di dalam skrip setup agent akan terus berubah. Kodenya tersedia di rootSunc/ashare-lake di bawah lisensi Apache 2.0.

  • pip install ashare-lake==0.5.0 menginstal rilis saat ini pada awal Agustus 2026.
  • asl --version menampilkan build yang terinstal.
  • asl config init --data-root /path/to/ashare-lake menulis contoh TOML yang disertakan dengan root data Anda, tanpa memerlukan checkout repository. --config menetapkan path output, sedangkan --force menimpa file yang ada.
  • asl doctor menjalankan pemeriksaannya secara offline, sebelum data dipindahkan.
  • asl servers test memeriksa host kuotasi upstream. asl sources memeriksa setiap sumber, dengan --vantage sebesar cn, overseas, atau local.

Berhenti sampai di sini. Perintah berikutnya adalah backfill, dan perintah itu tidak boleh dijalankan sambil membaca.

Yang dilakukan backfill

asl init membuat struktur direktori dan mengisi data historis. Dokumentasi proyek memperkirakan proses penuh memerlukan waktu berjam-jam dan beberapa GB ruang disk. Proses ini juga memerlukan koneksi aktif ke quote host Tongdaxin upstream, yang diverifikasi oleh asl servers test. Sebaliknya, asl init --profile quick mencakup tiga tahun terakhir dalam hitungan menit. Proses ini tetap mempertahankan setiap nama yang diperdagangkan dalam periode tersebut, termasuk nama yang kemudian tidak lagi diperdagangkan di pasar. asl run daily adalah incremental job setelahnya, asl status --datasets melaporkan cakupan dan kesegaran data untuk setiap dataset, sedangkan asl serve menampilkan dashboard read-only di 127.0.0.1:8787.

Repository ini tidak menyertakan data apa pun. Setiap file Parquet dibuat di mesin Anda. Setiap baris juga memiliki row-level lineage yang mencatat sumber data dan waktu pengambilannya.

Apa saja 39 dataset tersebut?

Dataset tersebut disusun berlapis, mulai dari data referensi hingga data turunan: 36 tabel terkurasi dan 3 tabel turunan.

  • Referensi: instrumen, kalender perdagangan yang mencakup 2016 hingga 2027, serta status perdagangan.
  • Data pasar: bar harian, bar indeks, bar 1 menit dan 5 menit, trade ticks, bar komoditas, adjustment factors, serta peristiwa delisting.
  • Peristiwa korporasi: corporate actions, indeks pengumuman, serta jadwal pengungkapan earnings.
  • Fundamental dan valuasi: item laporan keuangan, metrik valuasi, serta konsensus analis.
  • Arus modal: fund flow, margin trading, arus dan kepemilikan northbound, dragon-tiger board yang memuat pengungkapan order besar, block trades, serta kepemilikan institusional.
  • Struktur dan industri: anggota sektor, konstituen indeks, anggota industri, serta indeks industri.
  • Makro: indikator makro, market breadth, serta kalender ekonomi.
  • Sentimen dan rotasi: skor sentimen, peringkat saham populer, bar sektor, arus dana sektor, headline berita, serta flash news wire.
  • Risiko dan kepatuhan: jadwal share unlock serta peristiwa regulasi.

Posisi suatu dataset menunjukkan hal yang dianggap penting oleh penulis. Adjustment factors dan peristiwa delisting ditempatkan di lapisan data pasar bersama bar harian, bukan di lampiran. Bagi siapa pun yang menguji ide berdasarkan data historis, penempatan tersebut merupakan bagian proyek yang paling bernilai.

Bagaimana local lake menangani survivorship bias

Survivorship bias muncul ketika universe suatu studi dibentuk dari saham yang masih tercatat saat ini. Setiap perusahaan yang merger, menjadi perusahaan privat, atau delisting tidak terlihat dalam data. Saham yang menghilang juga jarang merupakan saham dengan kinerja terbaik.

Warehouse kami dapat mengukur celah tersebut untuk pasar AS dengan perhitungan yang sama dalam format berbeda. Untuk setiap tahun, ambil semua simbol yang mencatat minute bar pada minggu kedua Maret. Kemudian, periksa simbol mana yang masih mencatat transaksi pada dua minggu terakhir Juli 2026:

QuerySurvivorship terukur: kohort simbol AS bulan Maret yang masih diperdagangkan pada akhir Juli 2026
SQL tepat di balik setiap angka
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

Dari 8101 simbol yang diperdagangkan pada minggu tersebut di 2016, sebanyak 50.1% masih tercatat pada tape pada akhir Juli 2026, sedangkan 4040 tidak lagi tercatat. Kelompok 2025 menunjukkan 86.7%. Jika screen yang dibangun dari listing saat ini dijalankan mundur selama 10 tahun tersebut, semakin besar bagian pasar yang hilang.

Asumsi yang umum adalah bahwa semua simbol yang hilang merupakan penny stocks. Pengelompokan cohort Maret 2021 ke dalam beberapa tier berdasarkan average daily dollar volume pada bulan tersebut menunjukkan hal yang berbeda:

QuerySiapa yang meninggalkan tape: simbol Maret 2021 berdasarkan volume dolar harian, diperiksa terhadap akhir Juli 2026
SQL tepat di balik setiap angka
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

Tier under $1M kehilangan porsi terbesar, yaitu 57.5% dari 3968 simbol. Tier dengan aktivitas tertinggi juga tidak sepenuhnya terlindungi: 3.4% dari 89 simbol yang diperdagangkan sebesar $1B or more per hari pada Maret 2021 sudah tidak tercatat pada akhir Juli 2026. Merger, take-private, kebangkrutan, dan keluarnya saham dari indeks semuanya berakhir dengan cara yang sama dalam tabel harga: barisnya berhenti.

ashare-lake memperlakukan hal ini sebagai masalah utama. Dataset instruments mempertahankan simbol yang telah delisting, bukan hanya menyisakan simbol yang masih aktif. Tabel delisting_events mencatat bagaimana setiap simbol tersebut berakhir, dan universe="all_a" dalam Python API menyelesaikan snapshot historis yang mencakup simbol-simbol itu. Dokumentasi proyek sendiri melaporkan kesenjangan sekitar two-fold antara backtest yang hanya menggunakan saham yang masih bertahan dan backtest yang memasukkan saham delisting untuk periode 2016 hingga 2021. Ini merupakan cerminan dari jebakan dalam catatan kami tentang look-ahead bias dalam backtesting: universe yang secara diam-diam mengetahui masa depan.

SECPembacaan point-in-time

load("financial_statement_items", as_of="2018-04-30") mengembalikan versi terbaru dari setiap line item yang diumumkan pada atau sebelum tanggal tersebut, bukan angka yang kemudian disajikan kembali. Bar memiliki argumen adjust: hfq untuk backward adjustment, qfq yang dinormalisasi di dalam query window, atau harga mentah. Faktor yang dibentuk berdasarkan angka yang belum dipublikasikan oleh pasar tidak mengukur apa pun. Hal ini merupakan pemeriksaan pertama yang harus dilakukan dalam setiap pipeline alpha factor yang dihasilkan LLM.

Mendaftarkannya sebagai server MCP

Model Context Protocol adalah cara agent mengambil tools. asl mcp menjalankannya melalui stdio, dan client meluncurkan proses tersebut:

  • claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml
  • Client MCP lainnya menggunakan dua bagian yang sama: asl sebagai command, serta mcp --config dan absolute path sebagai arguments. Path harus absolute karena client dapat memulai proses dari direktori mana pun.

Enam tools tersedia dan dikelompokkan berdasarkan pertanyaan, bukan berdasarkan dataset: describe_lake untuk mengetahui data yang tersedia dan cara membacanya, resolve_symbol untuk mengubah nama menjadi kode, termasuk nama yang sudah delisted, query_bars, query_fundamentals dengan argumen as_of, query_dataset untuk kebutuhan lainnya, serta run_sql untuk satu query DuckDB SELECT yang hanya-baca di seluruh dataset. Flag --live memungkinkan server menjawab pencarian symbol dan menyediakan daily bars yang belum disesuaikan langsung dari upstream tanpa menulis data ke lake.

Batasan penting yang perlu diketahui terlebih dahulu

  • Hanya A-shares. Tidak mencakup Hong Kong, listing di AS, atau apa pun di luar Tiongkok daratan.
  • Ini adalah proyek pribadi. Issue dan pull request ditangani berdasarkan upaya terbaik. Dokumentasinya juga menyatakan secara jelas bahwa tidak ada jaminan ketersediaan: situs upstream dapat berubah dan sebuah IP dapat diblokir, sehingga proses ingest berhenti sampai seseorang memperbaiki kodenya.
  • Apache 2.0 mencakup kode, bukan data. Setiap sumber upstream tetap memiliki ketentuannya sendiri. Maintainer tidak memberikan hak untuk mendistribusikan ulang atau menjual kembali file Parquet yang Anda buat. Baca ketentuan sumber sebelum menggunakannya untuk tujuan komersial.
  • Tidak diperlukan akun atau token untuk sumber yang dibaca proyek ini. Hal tersebut menjadi keunggulannya sekaligus sumber kerentanannya.
  • Dukungan Windows hadir pada 0.3.0, dan versi minimum Python berubah menjadi 3.10 pada 0.3.1.
Asal fakta-fakta proyek ini

Versi 0.5.0, enam tanggal rilis, dan versi minimum Python berasal dari riwayat rilis PyPI serta CHANGELOG proyek, yang dibaca pada 4 Agustus 2026. Katalog dataset, perilaku delisting dan point-in-time, flag CLI, daftar tool MCP, serta keterangan mengenai lisensi dan dukungan berasal dari dokumentasi repository: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md, dan docs/legal-and-data-sources.md. Perangkat lunak berubah lebih cepat daripada artikel, jadi periksa dokumentasi untuk versi yang Anda instal. Dua panel survivorship mengukur simbol AS di warehouse kami sendiri, bukan listing Tiongkok, dan dimaksudkan sebagai ilustrasi mekanismenya, bukan sebagai pengukuran pasar A-shares.

FAQ

Apakah Anda memerlukan API key untuk membangun data lake saham A-share secara lokal?

Tidak untuk proyek ini. Sumber upstream yang dibaca tidak memerlukan registrasi atau token, dan data lake itu sendiri berada di mesin Anda. Setiap sumber memiliki ketentuan penggunaan masing-masing, yang harus diperhatikan sebelum digunakan untuk pekerjaan komersial.

Berapa lama waktu yang diperlukan untuk melakukan backfill ashare-lake?

Dokumentasi menyebutkan bahwa backfill riwayat penuh memerlukan waktu beberapa jam dan beberapa GB ruang disk. Koneksi yang berfungsi ke host kuotasi upstream juga harus tersedia sepanjang proses. asl init --profile quick mencakup tiga tahun terakhir dalam hitungan menit dan tetap memasukkan saham yang kemudian delisting.

Apakah data lake saham A-share lokal mencakup saham yang delisting?

Ya. Simbol yang delisting tetap berada dalam dataset instrumen. Tabel delisting_events mencatat bagaimana setiap saham berakhir, dan universe="all_a" membangun snapshot historis yang mencakup saham-saham tersebut. Pengukuran kami sendiri atas pasar AS di atas menunjukkan besarnya data yang tidak tercakup jika hanya menggunakan universe saham yang masih bertahan.

Bisakah AI agent melakukan query langsung ke ashare-lake?

Bisa. asl mcp menyediakan enam tool melalui Model Context Protocol, termasuk satu tool SQL read-only. Dengan demikian, agent melakukan query ke Parquet lokal, bukan scraping. Daftarkan tool tersebut menggunakan claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.

Apakah ashare-lake merupakan pengganti AkShare atau Baostock?

Tidak. ashare-lake berada di atas keduanya. Library tersebut mengambil data dari upstream. Proyek ini menyimpan, memberi versi, dan merekonsiliasi data yang diambil ke dalam Parquet terkurasi, dengan lineage pada tingkat baris dan satu kontrak untuk setiap dataset.


Setiap angka di atas berasal dari query tersimpan dan berversi atas data pasar aktual. Buka panel mana pun untuk membaca SQL-nya, atau jalankan pemeriksaan survivorship yang sama pada universe Anda sendiri di terminal Strasmore.

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