AI एजेंट के लिए स्थानीय A-share डेटा लेक कैसे बनाएं
ashare-lake आपके डिस्क पर उनतालीस डेटासेट के साथ एक स्थानीय A-share डेटा लेक बनाता है। इसमें डीलिस्ट रिकॉर्ड्स, पॉइंट-इन-टाइम क्वेरी और AI एजेंट के लिए MCP सर्वर शामिल है।
स्थानीय A-share डेटा लेक का निर्माण
स्थानीय A-share डेटा लेक का अर्थ है चीनी मुख्य भूमि के इक्विटी बाजार का पूरा इतिहास, जो आपके स्वयं के डिस्क पर कॉलम-आधारित Parquet फाइलों के रूप में मौजूद है। इसे किसी वेंडर एंडपॉइंट के बजाय DuckDB या Polars द्वारा पढ़ा जा सकता है, जिसे एक बार में एक पेज कॉल करना पड़ता है। ashare-lake एक ओपन-सोर्स प्रोजेक्ट है जो इसे तैयार करता है, साथ ही इसमें एक दैनिक जॉब शामिल है जो इसे अपडेट रखती है और एक Model Context Protocol सर्वर है जो AI एजेंट को इसे क्वेरी करने की सुविधा देता है। इसके दो डिज़ाइन विकल्प इसे यहाँ चर्चा के योग्य बनाते हैं: इसमें डीलिस्ट (delisted) हो चुके नाम रखे जाते हैं, और फंडामेंटल डेटा को किसी पिछली तारीख के अनुसार पढ़ा जा सकता है।
AI एजेंट को स्थानीय A-share डेटा लेक की आवश्यकता क्यों है
चीनी इक्विटी पर शोध करने वाले एजेंट के पास स्थानीय कॉपी न होने पर दो रास्ते होते हैं। या तो वह फाइनेंस पेजों को स्क्रैप करता है, जिससे उसका कॉन्टेक्स्ट विंडो HTML में ही खर्च हो जाता है और ऐसे आंकड़े मिलते हैं जिन्हें अगले महीने कोई दोहरा नहीं सकता। या फिर वह किसी ऐसे वेंडर को कॉल करता है जिसके लिए रजिस्ट्रेशन अनिवार्य है, जो पंक्तियों (rows) की संख्या सीमित कर देता है और हर परिणाम को एक अकाउंट से जोड़ देता है।
स्केल वह हिस्सा है जिसे कम करके आंका जाता है। हमारे अपने वेयरहाउस में मिनट-दर-मिनट रेजोल्यूशन पर US टेप मौजूद है, और इसका एक सामान्य सप्ताह कुछ इस तरह दिखता है:
हर आंकड़े के पीछे का पूरा SQL
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 sessionJul 20 को टेप ने 11737 सिंबल के लिए 1.79 मिलियन मिनट बार तैयार किए, और पैनल के अन्य चार सत्रों में भी यही स्थिति रहती है। एक राष्ट्रीय बाजार, एक सप्ताह, एक रेजोल्यूशन। दूसरे बाजार के लिए एक दशक के डेली बार, फंडामेंटल्स, इंडेक्स मेंबरशिप और मनी-फ्लो रिकॉर्ड का आकार भी ऐसा ही है, और HTTP के माध्यम से इसे पेज करने पर एजेंट का रन बेकार हो जाता है।
एक स्थानीय डेटा लेक एक साथ दो चीजें बदल देता है। रीड्स कोटा के बजाय फाइल स्कैन बन जाते हैं, और आज लिखी गई क्वेरी छह महीने बाद भी वही पंक्तियाँ लौटाती है, जो कि बैकटेस्ट के सत्यापन के लिए आवश्यक है। AI एजेंटों के लिए मार्केट डेटा कौशल और मार्केट डेटा पर SQL API पर हमारे नोट्स US डेटा के लिए भी यही तर्क देते हैं।
इसे इंस्टॉल करें, एक वर्ज़न पर पिन करें
Python 3.10 या उससे नया वर्ज़न। वर्ज़न को पिन करें: 27 जुलाई और 2 अगस्त, 2026 के बीच छह रिलीज़ आई हैं, और किसी एजेंट की सेटअप स्क्रिप्ट के भीतर अनपिन किया हुआ इंस्टॉलेशन एक बदलता हुआ लक्ष्य है। कोड rootSunc/ashare-lake पर Apache 2.0 के तहत उपलब्ध है।
pip install ashare-lake==0.5.0अगस्त 2026 की शुरुआत तक के वर्तमान रिलीज़ को इंस्टॉल करता है।asl --versionइंस्टॉल किए गए बिल्ड को प्रिंट करता है।asl config init --data-root /path/to/ashare-lakeआपके डेटा रूट के साथ पैक्ड उदाहरण TOML को लिखता है, इसके लिए रिपॉजिटरी चेकआउट की आवश्यकता नहीं है।--configआउटपुट पाथ सेट करता है,--forceओवरराइट करता है।asl doctorकिसी भी डेटा के मूव होने से पहले, अपने चेक को ऑफलाइन चलाता है।asl servers testअपस्ट्रीम कोट होस्ट्स की जांच करता है।asl sourcesप्रत्येक स्रोत की जांच करता है, जिसमें--vantageके साथcn,overseas, याlocalशामिल है।
वहां रुकें। अगला कमांड बैकफिल है, और इसे पढ़ते समय शुरू करने वाली चीज़ नहीं है।
बैकफिल क्या करता है
asl init डायरेक्टरी लेआउट बनाता है और इतिहास को भरता है। प्रोजेक्ट के दस्तावेज़ों के अनुसार, एक पूर्ण रन में कई घंटों का समय और डिस्क पर कई GB जगह लगती है। इसके लिए एक अपस्ट्रीम Tongdaxin कोट होस्ट से लाइव कनेक्शन की आवश्यकता होती है, जिसकी पुष्टि asl servers test करता है। इसके बजाय, asl init --profile quick पिछले तीन वर्षों के डेटा को कुछ ही मिनटों में कवर कर लेता है। यह उस अवधि के दौरान ट्रेड किए गए हर नाम को सुरक्षित रखता है, जिसमें वे नाम भी शामिल हैं जो अब बाजार से बाहर हो चुके हैं। asl run daily इसके बाद का इंक्रीमेंटल जॉब है, asl status --datasets प्रति डेटासेट कवरेज और ताज़गी की रिपोर्ट देता है, और asl serve 127.0.0.1:8787 पर एक रीड-ओनली डैशबोर्ड उपलब्ध कराता है।
यह रिपॉजिटरी कोई डेटा नहीं भेजती है। हर Parquet फ़ाइल आपके मशीन पर ही बनाई जाती है, जिसमें प्रत्येक पंक्ति पर रो-लेवल वंशावली (lineage) दर्ज होती है, जो यह बताती है कि किस स्रोत ने इसे तैयार किया और इसे कब प्राप्त किया गया था।
39 डेटासेट क्या हैं?
ये डेटासेट संदर्भ डेटा से बाहर की ओर परतों में व्यवस्थित हैं: 36 क्यूरेटेड टेबल और 3 व्युत्पन्न (derived) टेबल।
- संदर्भ (Reference): इंस्ट्रूमेंट्स, 2016 से 2027 तक का ट्रेडिंग कैलेंडर, और ट्रेडिंग स्टेटस।
- मार्केट डेटा: डेली बार्स, इंडेक्स बार्स, 1-मिनट और 5-मिनट बार्स, ट्रेड टिक्स, कमोडिटी बार्स, एडजस्टमेंट फैक्टर्स, और डीलिस्टिंग इवेंट्स।
- कॉर्पोरेट इवेंट्स: कॉर्पोरेट एक्शन्स, एक अनाउंसमेंट इंडेक्स, और अर्निंग्स डिस्क्लोजर शेड्यूल।
- फंडामेंटल्स और वैल्यूएशन: फाइनेंशियल स्टेटमेंट आइटम्स, वैल्यूएशन मेट्रिक्स, और एनालिस्ट कंसेंसस।
- कैपिटल फ्लो: फंड फ्लो, मार्जिन ट्रेडिंग, नॉर्थबाउंड फ्लो और होल्डिंग्स, लार्ज-ऑर्डर डिस्क्लोजर का ड्रैगन-टाइगर बोर्ड, ब्लॉक ट्रेड्स, और इंस्टीट्यूशनल होल्डिंग्स।
- स्ट्रक्चर और इंडस्ट्री: सेक्टर मेंबर्स, इंडेक्स कॉन्स्टिट्यूएंट्स, इंडस्ट्री मेंबर्स, और इंडस्ट्री इंडेक्स।
- मैक्रो: मैक्रो इंडिकेटर्स, मार्केट ब्रेड्थ, और एक इकोनॉमिक कैलेंडर।
- सेंटीमेंट और रोटेशन: सेंटीमेंट स्कोर्स, हॉट रैंक, सेक्टर बार्स, सेक्टर फंड फ्लो, न्यूज़ हेडलाइंस, और एक फ्लैश न्यूज़ वायर।
- रिस्क और कंप्लायंस: शेयर अनलॉक शेड्यूल, और रेगुलेटरी इवेंट्स।
कोई डेटासेट किस स्थान पर है, इससे पता चलता है कि लेखक के लिए क्या महत्वपूर्ण है। एडजस्टमेंट फैक्टर्स और डीलिस्टिंग इवेंट्स को किसी परिशिष्ट में रखने के बजाय डेली बार्स के साथ मार्केट-डेटा लेयर में रखा गया है। यह व्यवस्था इस प्रोजेक्ट का वह हिस्सा है जो ऐतिहासिक डेटा पर रणनीतियों का परीक्षण करने वाले किसी भी व्यक्ति के लिए सबसे अधिक मूल्यवान है।
स्थानीय लेक (lake) सर्वाइवरशिप बायस को कैसे संभालती है
सर्वाइवरशिप बायस तब उत्पन्न होता है जब किसी अध्ययन का दायरा केवल उन नामों तक सीमित होता है जो आज भी लिस्टेड हैं। वे सभी कंपनियां जो मर्ज हो गईं, निजी हो गईं या डीलिस्ट हो गईं, वे चुपचाप गायब हो जाती हैं, और जो नाम गायब होते हैं, वे शायद ही कभी विजेता होते हैं।
हमारा वेयरहाउस अमेरिकी बाजार के लिए उस अंतर का आकार माप सकता है, जो एक अलग वर्णमाला में वही गणित है। प्रत्येक वर्ष के लिए, उन सभी सिंबल को लें जिन्होंने मार्च के दूसरे सप्ताह में एक मिनट का बार प्रिंट किया था, फिर जांचें कि उनमें से कौन से जुलाई 2026 के अंतिम दो सप्ताहों में भी प्रिंट हो रहे थे:
हर आंकड़े के पीछे का पूरा SQL
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 year2016 में उस सप्ताह ट्रेड करने वाले 8101 सिंबल में से, 50.1% जुलाई 2026 के अंत में भी टेप पर थे, और 4040 नहीं थे। 2025 कोहोर्ट 86.7% दर्शाता है। आज की लिस्टिंग से बनी स्क्रीन को उन 10 वर्षों में पीछे की ओर चलाएं, तो यह जैसे-जैसे पीछे जाती है, बाजार का एक बड़ा हिस्सा छोड़ती जाती है।
यह मान लेना सुविधाजनक है कि गायब हुए सभी नाम पेनी स्टॉक्स थे। मार्च 2021 के कोहोर्ट को उस महीने के औसत दैनिक डॉलर वॉल्यूम के आधार पर टियर में बांटने पर कुछ और ही पता चलता है:
हर आंकड़े के पीछे का पूरा SQL
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)under $1M टियर ने सबसे बड़ा हिस्सा खोया, जो 3968 नामों में से 57.5% था। सबसे व्यस्त टियर भी इससे अछूता नहीं था: मार्च 2021 में $1B or more प्रतिदिन ट्रेड करने वाले 89 सिंबल में से 3.4% जुलाई 2026 के अंत तक जा चुके थे। मर्जर, टेक-प्राइवेट, दिवालियापन और इंडेक्स से बाहर होना, सभी का प्राइस टेबल में एक ही अंत होता है: पंक्तियां रुक जाती हैं।
ashare-lake इसे एक प्राथमिक समस्या के रूप में देखती है। इंस्ट्रूमेंट्स डेटासेट डीलिस्ट किए गए सिंबल को बनाए रखता है, न कि केवल लाइव सिंबल को फ़िल्टर करता है, एक delisting_events टेबल रिकॉर्ड करती है कि प्रत्येक समाप्त नाम का अंत कैसे हुआ, और Python API में universe="all_a" एक ऐतिहासिक स्नैपशॉट को हल करता है जिसमें वे शामिल होते हैं। प्रोजेक्ट के अपने दस्तावेज़ 2016 से 2021 के बीच केवल-सर्वाइवर बैकटेस्ट और डीलिस्टिंग-समावेशी बैकटेस्ट के बीच लगभग दो गुना का अंतर बताते हैं। यह हमारे बैकटेस्टिंग में लुक-अहेड बायस नोट्स में मौजूद जाल का सटीक प्रतिबिंब है: एक ऐसा यूनिवर्स जिसे भविष्य का चुपचाप पता होता है।
पॉइंट-इन-टाइम रीड्स
load("financial_statement_items", as_of="2018-04-30") उस तारीख को या उससे पहले घोषित प्रत्येक लाइन आइटम का नवीनतम संस्करण लौटाता है, न कि बाद में संशोधित संख्या। बार्स में एक adjust तर्क होता है: बैकवर्ड एडजस्टमेंट के लिए hfq, क्वेरी विंडो के भीतर नॉर्मलाइज्ड के लिए qfq, या रॉ प्राइसेस। उन संख्याओं पर फिट किया गया फैक्टर जिन्हें बाजार ने अभी तक प्रकाशित नहीं किया था, वह कुछ भी नहीं मापता है, जो कि किसी भी LLM जनरेटेड अल्फा फैक्टर पाइपलाइन में जांचने वाली पहली चीज है।
MCP सर्वर के रूप में रजिस्टर करना
Model Context Protocol वह माध्यम है जिसके द्वारा एक एजेंट टूल्स का उपयोग करता है। asl mcp इसे stdio के माध्यम से संचालित करता है, और क्लाइंट इस प्रक्रिया को शुरू करता है:
claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml- कोई भी अन्य MCP क्लाइंट इन्हीं दो घटकों का उपयोग करता है: कमांड के रूप में
asl, और तर्कों (arguments) के रूप मेंmcp --configके साथ एक एब्सोल्यूट पाथ। पाथ का एब्सोल्यूट होना अनिवार्य है, क्योंकि क्लाइंट किसी भी डायरेक्टरी से प्रक्रिया शुरू कर सकता है।
इसमें छह टूल्स उपलब्ध हैं, जिन्हें डेटासेट के बजाय प्रश्नों के आधार पर व्यवस्थित किया गया है: क्या मौजूद है और उसे कैसे पढ़ा जाए इसके लिए describe_lake, नाम से कोड खोजने के लिए resolve_symbol (जिसमें डीलिस्ट किए गए नाम भी शामिल हैं), query_bars, as_of तर्क के साथ query_fundamentals, अन्य सभी कार्यों के लिए query_dataset, और डेटासेट के बीच एक सिंगल रीड-ओनली DuckDB SELECT के लिए run_sql। एक --live फ्लैग सर्वर को लेक में लिखे बिना अपस्ट्रीम से सिंबल लुकअप और अनएडजस्टेड डेली बार्स का उत्तर देने की अनुमति देता है।
जानने योग्य सीमाएं
- केवल A-shares। हांगकांग, अमेरिकी लिस्टिंग या मुख्य भूमि चीन के बाहर का कुछ भी शामिल नहीं है।
- एक व्यक्तिगत प्रोजेक्ट। इश्यू और पुल रिक्वेस्ट पर सर्वोत्तम प्रयास के आधार पर ध्यान दिया जाता है, और दस्तावेज़ स्पष्ट रूप से बताते हैं कि उपलब्धता की कोई गारंटी नहीं है: अपस्ट्रीम साइटें बदलती रहती हैं, और IP ब्लॉक हो सकता है, जिससे किसी के द्वारा पैच किए जाने तक डेटा इनजेस्ट रुक जाता है।
- Apache 2.0 कोड को कवर करता है, डेटा को नहीं। प्रत्येक अपस्ट्रीम स्रोत की अपनी शर्तें होती हैं, और मेंटेनर आपके द्वारा बनाई गई Parquet फाइलों को पुनर्वितरित या पुनर्विक्रय करने का कोई अधिकार नहीं देता है। किसी भी व्यावसायिक उपयोग से पहले स्रोत की शर्तें पढ़ें।
- जिन स्रोतों से यह डेटा पढ़ता है, उनके लिए किसी खाते या टोकन की आवश्यकता नहीं है, जो इसका आकर्षण भी है और कमजोरी भी।
- विंडोज सपोर्ट 0.3.0 में आया, और 0.3.1 में पायथन का न्यूनतम संस्करण 3.10 हो गया।
ये प्रोजेक्ट तथ्य कहां से आए हैं
संस्करण 0.5.0, छह रिलीज तिथियां, और पायथन का न्यूनतम संस्करण प्रोजेक्ट के PyPI रिलीज इतिहास और CHANGELOG से लिए गए हैं, जिसे 4 अगस्त, 2026 को पढ़ा गया था। डेटासेट कैटलॉग, डिलिस्टिंग और पॉइंट-इन-टाइम व्यवहार, CLI फ्लैग, MCP टूल सूची, और लाइसेंसिंग तथा सपोर्ट संबंधी शब्दावली रिपॉजिटरी के दस्तावेज़ों से ली गई है: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md, और docs/legal-and-data-sources.md। सॉफ्टवेयर पोस्ट की तुलना में तेजी से बदलते हैं, इसलिए जो संस्करण आप इंस्टॉल करते हैं उसके लिए दस्तावेज़ देखें। दो सर्वाइवरशिप पैनल हमारे अपने वेयरहाउस में अमेरिकी सिंबल को मापते हैं, न कि चीनी लिस्टिंग को, और ये A-share बाजार के मापन के बजाय केवल कार्यप्रणाली के उदाहरण के रूप में हैं।
अक्सर पूछे जाने वाले प्रश्न
क्या स्थानीय A-share डेटा लेक बनाने के लिए API key की आवश्यकता होती है?
इस मामले में नहीं। जिन अपस्ट्रीम स्रोतों से यह डेटा पढ़ता है, उनके लिए किसी पंजीकरण या टोकन की आवश्यकता नहीं होती है, और डेटा लेक पूरी तरह से आपकी मशीन पर रहता है। प्रत्येक स्रोत की अपनी उपयोग की शर्तें होती हैं, जिनका किसी भी व्यावसायिक कार्य से पहले ध्यान रखना आवश्यक है।
ashare-lake को बैकफिल करने में कितना समय लगता है?
दस्तावेजों के अनुसार, पूर्ण इतिहास को बैकफिल करने में कुछ घंटों का समय और कई GB डिस्क स्पेस लगता है, जिसके लिए पूरे समय अपस्ट्रीम कोट होस्ट के साथ एक सक्रिय कनेक्शन की आवश्यकता होती है। asl init --profile quick पिछले तीन वर्षों के डेटा को कुछ ही मिनटों में कवर कर लेता है और इसमें वे नाम भी शामिल हैं जो अब delist हो चुके हैं।
क्या स्थानीय A-share डेटा लेक में delist हो चुके शेयर शामिल हैं?
इसमें शामिल हैं। Delist हो चुके symbols 'instruments' डेटासेट में बने रहते हैं, 'delisting_events' टेबल यह रिकॉर्ड करती है कि प्रत्येक नाम का अंत कैसे हुआ, और universe="all_a" एक ऐतिहासिक स्नैपशॉट तैयार करता है जिसमें वे शामिल होते हैं। ऊपर दिया गया हमारा अपना US मापन यह दर्शाता है कि केवल जीवित कंपनियों (survivor-only) के यूनिवर्स को चुनने पर कितना डेटा छूट जाता है।
क्या कोई AI एजेंट सीधे ashare-lake को क्वेरी कर सकता है?
हाँ। asl mcp 'Model Context Protocol' के माध्यम से छह टूल्स प्रदान करता है, जिनमें से एक read-only SQL टूल है, जिससे एजेंट scraping के बजाय सीधे स्थानीय Parquet को क्वेरी करता है। इसे claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml के साथ रजिस्टर करें।
क्या ashare-lake, AkShare या Baostock का विकल्प है?
नहीं। यह उनसे ऊपर स्थित है। वे लाइब्रेरीज़ अपस्ट्रीम से डेटा लाती हैं; यह प्रोजेक्ट उस डेटा को स्टोर करता है, उसका वर्ज़न बनाता है, और उसे row-level lineage के साथ क्यूरेटेड Parquet में व्यवस्थित करता है, जहाँ प्रत्येक डेटासेट के लिए एक निश्चित अनुबंध होता है।
ऊपर दिए गए सभी आंकड़े वास्तविक बाजार डेटा पर आधारित स्टोर्ड और वर्ज़न-नियंत्रित क्वेरी हैं। SQL पढ़ने के लिए किसी भी पैनल को विस्तार दें, या Strasmore टर्मिनल पर अपने स्वयं के यूनिवर्स पर वही सर्वाइवरशिप चेक चलाएं।