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

بحيرة بيانات محلية للأسهم الصينية لوكلاء الذكاء الاصطناعي

ينشئ ashare-lake بحيرة محلية لبيانات أسهم A على قرصك، تضم 39 مجموعة بيانات وسجلات إلغاء الإدراج واستعلامات زمنية وخادم MCP، لتعيد تحليل السوق دون مورّد.

بحيرة بيانات محلية لأسهم A هي سجل سوق الأسهم في البرّ الرئيسي الصيني محفوظ على قرصك بصيغة ملفات Parquet عمودية، ويمكن قراءته باستخدام DuckDB أو Polars، بدلاً من الوصول إلى نقطة نهاية لدى مزوّد بيانات واستدعائها صفحةً تلو الأخرى. ashare-lake مشروع مفتوح المصدر ينشئ هذه البحيرة، إلى جانب المهمة اليومية التي تُبقيها محدّثة، وخادم Model Context Protocol يتيح لوكيل ذكاء اصطناعي الاستعلام منها. ويستحق خياران تصميميان تخصيص مقال له: الاحتفاظ بالأسهم التي أُزيل إدراجها، وإتاحة قراءة البيانات الأساسية كما كانت في تاريخ سابق.

لماذا يحتاج وكيل الذكاء الاصطناعي إلى بحيرة بيانات محلية للأسهم الصينية

أمام الوكيل الذي يبحث في الأسهم الصينية من دون نسخة محلية مساران. يمكنه كشط صفحات مالية، وإنفاق نافذة السياق على HTML، ثم إنتاج أرقام لا يستطيع أحد إعادة إنتاجها في الشهر المقبل. أو يمكنه الاتصال بمورّد يشترط التسجيل، ويحدّ عدد الصفوف، ويربط كل نتيجة بحساب.

غالباً ما يُستهان بحجم البيانات. يحتفظ مستودعنا الداخلي ببيانات السوق الأمريكية بدقة الدقائق، ويبدو أسبوع عادي منها على النحو الآتي:

الاستعلامشريط الدقائق الأمريكي لأسبوع واحد: الرموز والأشرطة لكل جلسة، 20–24 يوليو 2026
استعلام 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 session
Run this yourself

خلال Jul 20، أنتجت بيانات السوق 1.79 مليون شريط سعري بالدقيقة عبر 11737 من الرموز، وتتكرر الجلسات الأربع الأخرى في اللوحة بالمعدلات نفسها. سوق وطني واحد، وأسبوع واحد، ودقة زمنية واحدة. ولعقد من البيانات اليومية، والبيانات الأساسية، وعضوية المؤشرات، وسجلات تدفقات الأموال لسوق آخر، البنية نفسها؛ ويؤدي تمرير هذه البيانات على دفعات عبر HTTP إلى استنفاد تشغيل الوكيل.

تغيّر بحيرة البيانات المحلية أمرين في الوقت نفسه. تصبح عمليات القراءة مسحاً للملفات بدلاً من استهلاك حصة، كما أن الاستعلام المكتوب اليوم يعيد الصفوف نفسها بعد ستة أشهر، وهو ما يحتاج إليه الاختبار التاريخي القابل للتحقق. تطرح ملاحظاتنا حول مهارات بيانات السوق لوكلاء الذكاء الاصطناعي وحول واجهة SQL فوق بيانات السوق الحجة نفسها بشأن البيانات الأمريكية.

ثبّته بإصدار محدد

استخدم 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 upstream، وهو ما يتحقق منه asl servers test. أما asl init --profile quick فيغطي السنوات الثلاث الأخيرة بدلاً من ذلك خلال دقائق، مع الاحتفاظ بكل اسم جرى تداوله ضمن هذه الفترة، بما في ذلك الأسماء التي غادرت السوق منذ ذلك الحين. ويتولى asl run daily مهمة التحديث التدريجي بعد ذلك، بينما يعرض asl status --datasets مدى التغطية وحداثة البيانات لكل مجموعة بيانات. ويضع asl serve لوحة معلومات للقراءة فقط على العنوان 127.0.0.1:8787.

لا يتضمن المستودع أي بيانات على الإطلاق. يُنشأ كل ملف Parquet على جهازك، مع تسجيل مصدر كل صف ووقت جلبه ضمن سجل النَسَب على مستوى الصف.

ما مجموعات البيانات الـ39؟

هي منظّمة على طبقات تبدأ من البيانات المرجعية وتمتد إلى الخارج: 36 جدولاً منسقاً و3 جداول مشتقة.

  • البيانات المرجعية: الأدوات المالية، وتقويم تداول يغطي الفترة من 2016 إلى 2027، وحالة التداول.
  • بيانات السوق: بيانات يومية تشمل الافتتاح والأعلى والأدنى والإغلاق والحجم، وبيانات المؤشرات، وبيانات بفواصل زمنية مدتها دقيقة واحدة وخمس دقائق، وبيانات تنفيذات التداول، وبيانات السلع، ومعاملات التعديل، وأحداث الشطب.
  • أحداث الشركات: Corporate actions، وفهرس الإعلانات، والجدول الزمني للإفصاح عن الأرباح.
  • البيانات الأساسية والتقييم: بنود القوائم المالية، ومقاييس التقييم، وتقديرات المحللين المجمعة.
  • تدفقات رأس المال: تدفقات الصناديق، وتداولات الهامش، وتدفقات وممتلكات المستثمرين المتجهة شمالاً، ولوحة Dragon-Tiger للإفصاحات عن الأوامر الكبيرة، والصفقات الكبيرة، وممتلكات المؤسسات.
  • الهيكل والقطاعات: أعضاء القطاعات، ومكوّنات المؤشرات، وأعضاء الصناعات، ومؤشرات الصناعات.
  • الاقتصاد الكلي: المؤشرات الاقتصادية الكلية، واتساع السوق، وتقويم اقتصادي.
  • المعنويات والتناوب: درجات المعنويات، وترتيب الأسهم الرائجة، وبيانات القطاعات، وتدفقات أموال القطاعات، وعناوين الأخبار، ونشرة أخبار عاجلة.
  • المخاطر والامتثال: الجدول الزمني لتحرير الأسهم من القيود، والأحداث التنظيمية.

يُظهر موضع مجموعة البيانات ما يهتم به المؤلف. فمعاملات التعديل وأحداث الشطب موجودة في طبقة بيانات السوق إلى جانب البيانات اليومية، وليست مدفونة في ملحق. وهذا الموضع هو الجزء الذي يحمل أكبر قيمة في المشروع لأي شخص يختبر أفكاراً على البيانات التاريخية.

كيف تتعامل بحيرة محلية مع انحياز البقاء

ينشأ انحياز البقاء عندما تُبنى عينة الدراسة من الأسماء المدرجة حالياً فقط. فكل شركة اندمجت أو تحولت إلى شركة خاصة أو شُطبت من الإدراج تغيب بصمت، ونادراً ما تكون الأسماء التي تختفي هي الرابحة.

يمكن لمستودع بياناتنا قياس حجم هذه الفجوة في السوق الأمريكية، باستخدام الحساب نفسه ولكن بأبجدية مختلفة. لكل سنة، خذ كل رمز سجّل شموعاً زمنية مدتها دقيقة في الأسبوع الثاني من مارس، ثم تحقق من أيٍّ منها ظل يسجل تداولات في الأسبوعين الأخيرين من يوليو 2026:

الاستعلامالبقاء، مقاسًا: مجموعات الرموز الأمريكية في مارس التي لا تزال تتداول في أواخر يوليو 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 year
Run this yourself

من بين 8101 رمزاً جرى تداولها في ذلك الأسبوع من 2016، ظل 50.1% منها ظاهراً على شريط التداول في أواخر يوليو 2026، بينما لم يعد 4040 منها كذلك. أما مجموعة 2025 فتظهر النتيجة 86.7%. وعند تطبيق فلتر يبدأ من الإدراجات الحالية ويمتد إلى الوراء عبر 10 سنة، فإنه يستبعد حصة متزايدة من السوق كلما عادنا أبعد في الزمن.

يفترض البعض بسهولة أن الأسماء المفقودة كانت كلها أسهماً زهيدة السعر. لكن تصنيف مجموعة مارس 2021 إلى شرائح حسب متوسط قيمة التداول اليومية بالدولار خلال ذلك الشهر يعطي نتيجة مختلفة:

الاستعلاممن غادر شريط التداول: رموز مارس 2021 حسب حجم التداول اليومي بالدولار، مقارنةً بأواخر يوليو 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
),
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

فقدت شريحة under $1M أكبر حصة، إذ غاب 57.5% من أصل 3968 اسماً. ولم تكن الشريحة الأكثر نشاطاً مستثناة؛ فقد غادر 3.4% من أصل 89 رمزاً جرى تداولها بقيمة $1B or more يومياً في مارس 2021 قبل أواخر يوليو 2026. فالاندماجات، وعمليات التحول إلى شركات خاصة، والإفلاسات، والخروج من المؤشرات، تنتهي بالطريقة نفسها في جدول الأسعار: تتوقف الصفوف.

يتعامل ashare-lake مع ذلك بوصفه مشكلة أساسية. تحتفظ مجموعة بيانات الأدوات بالرموز المشطوبة من الإدراج بدلاً من تصفيتها إلى الرموز النشطة، ويسجل جدول delisting_events كيفية انتهاء كل اسم غادر السوق، بينما يعيد universe="all_a" في واجهة Python لقطة تاريخية تتضمن تلك الرموز. وتذكر وثائق المشروع أن الفجوة بين اختبار خلفي يقتصر على الناجين واختبار يشمل حالات الشطب تقارب الضعف خلال الفترة من 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 بوصفه الأمر، وmcp --config مع مسار مطلق بوصفهما الوسيطين. يجب أن يكون المسار مطلقاً، لأن العميل قد يبدأ العملية من أي دليل.

تتوفر ست أدوات، وهي منظمة بحسب السؤال لا بحسب مجموعة البيانات: تُستخدم describe_lake لمعرفة البيانات الموجودة وكيفية قراءتها، وresolve_symbol لتحويل الاسم إلى رمز، بما في ذلك الأسماء التي أُزيل إدراجها، وquery_bars، وquery_fundamentals مع وسيطها as_of، وquery_dataset لكل ما عدا ذلك، وrun_sql لتنفيذ استعلام SELECT واحد للقراءة فقط باستخدام DuckDB عبر مجموعات البيانات. ويتيح خيار --live للخادم الإجابة عن عمليات البحث عن الرموز والبيانات اليومية غير المعدّلة من المصدر الأعلى، من دون الكتابة إلى بحيرة البيانات.

حدود ينبغي معرفتها أولاً

  • يقتصر النطاق على أسهم A. لا يشمل ذلك إدراجات هونغ كونغ أو الولايات المتحدة أو أي إدراجات خارج البر الرئيسي للصين.
  • هذا مشروع شخصي. تُعالَج المشكلات وطلبات السحب وفق أفضل جهد ممكن. وتوضح الوثائق صراحةً عدم وجود ضمان للتوافر؛ إذ قد تغيّر المواقع المصدرية بنيتها، وقد يُحظر عنوان IP، ما يوقف جلب البيانات إلى أن يُجري أحدهم التعديلات اللازمة.
  • يغطي ترخيص Apache 2.0 الشيفرة، لا البيانات. ويحتفظ كل مصدر من المصادر الأصلية بشروطه الخاصة. ولا يمنح المشرف أي حق في إعادة توزيع ملفات Parquet التي تنشئها أو إعادة بيعها. اقرأ شروط المصادر قبل أي استخدام تجاري.
  • لا تحتاج إلى حساب أو رمز مميز للمصادر التي يقرأ منها المشروع. وهذه ميزة، لكنها أيضاً مصدر للهشاشة.
  • أضيف دعم Windows في الإصدار 0.3.0، وانتقل الحد الأدنى لإصدار Python إلى 3.10 في الإصدار 0.3.1.
مصادر معلومات المشروع هذه

يستند الإصدار 0.5.0، وتواريخ الإصدارات الستة، والحد الأدنى لإصدار Python إلى سجل إصدارات المشروع على 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.

الأسئلة الشائعة

هل تحتاج إلى مفتاح API لبناء بحيرة بيانات محلية للأسهم A؟

ليس مع هذا المشروع. فالمصادر الأصلية التي يقرأ منها لا تتطلب تسجيلاً أو رمزاً، وتبقى البحيرة نفسها على جهازك. ويحتفظ كل مصدر بشروط استخدامه الخاصة، وهي مهمة قبل تنفيذ أي عمل تجاري.

كم يستغرق ملء البيانات التاريخية في ashare-lake؟

تشير الوثائق إلى أن ملء السجل التاريخي الكامل يستغرق ساعات من وقت التشغيل الفعلي، ويحتاج إلى عدة GB من مساحة القرص، مع ضرورة استمرار الاتصال بمضيف الأسعار الأصلي طوال العملية. ويغطي asl init --profile quick السنوات الثلاث الأخيرة خلال دقائق، كما يضم أسماءً أُزيل إدراجها منذ ذلك الحين.

هل تشمل بحيرة البيانات المحلية للأسهم A الأسهم التي أُزيل إدراجها؟

نعم. تبقى الرموز التي أُزيل إدراجها في مجموعة بيانات الأدوات، ويسجل جدول delisting_events كيفية انتهاء وضع كل اسم، ويبني universe="all_a" لقطة تاريخية تشملها. ويُظهر قياسنا الخاص للسوق الأمريكية أعلاه حجم ما يستبعده الكون الذي يقتصر على الشركات الباقية.

هل يستطيع وكيل ذكاء اصطناعي الاستعلام مباشرةً من ashare-lake؟

نعم. يوفّر asl mcp ست أدوات عبر Model Context Protocol، إحداها أداة SQL للقراءة فقط، ولذلك يستعلم الوكيل من ملفات Parquet المحلية بدلاً من جمع البيانات آلياً من المواقع. سجّله باستخدام claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.

هل يُعد ashare-lake بديلاً عن AkShare أو Baostock؟

لا. بل يعمل فوقهما. تجلب تلك المكتبات البيانات من المصادر الأصلية، بينما يخزّن هذا المشروع ما تجلبه ويُصدر إصدارات منه ويطابقه داخل ملفات Parquet منتقاة، مع تتبع لمصدر كل صف وعقد واحد لكل مجموعة بيانات.


كل رقم وارد أعلاه هو نتيجة استعلام محفوظ ومُدار بالإصدارات على بيانات سوق حقيقية. وسّع أي لوحة لقراءة SQL، أو نفّذ فحص البقاء نفسه على كونك الخاص عبر منصة Strasmore.

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