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

Локальное хранилище данных A-shares для AI-агентов

Проект ashare-lake позволяет создать локальную базу данных акций на вашем диске. Включает тридцать девять наборов данных, историю делистинга и поддержку MCP для работы агентов.

Локальное хранилище данных A-shares

Локальное хранилище данных по акциям A-shares представляет собой архив истории китайского фондового рынка, размещенный на вашем диске в виде колоночных файлов формата Parquet. Эти данные доступны для чтения через DuckDB или Polars, что избавляет от необходимости обращаться к API поставщика для получения каждой страницы информации по отдельности. ashare-lake — это проект с открытым исходным кодом, который позволяет создать такое хранилище, а также включает ежедневный процесс обновления данных и сервер Model Context Protocol, позволяющий AI-агенту выполнять запросы к этой базе. Проект заслуживает внимания благодаря двум архитектурным решениям: сохранению данных о делистингованных компаниях и возможности просмотра фундаментальных показателей по состоянию на любую прошлую дату.

Почему ИИ-агенту необходимо локальное хранилище данных по акциям A-share

У агента, исследующего китайский рынок акций без локальной копии данных, есть два пути. Он может парсить финансовые сайты, расходуя контекстное окно на 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 API для рыночных данных приводят те же аргументы применительно к данным по рынку США.

Установка с фиксацией версии

Python версии 3.10 или новее. Зафиксируйте версию: в период с двадцать седьмого июля по второе августа две тысячи двадцать шестого года вышло шесть релизов, поэтому установка без фиксации версии в скрипте настройки агента делает среду нестабильной. Код размещен в репозитории rootSunc/ashare-lake под лицензией Apache 2.0.

  • pip install ashare-lake==0.5.0 устанавливает текущий релиз по состоянию на начало августа две тысячи двадцать шестого года.
  • 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.

На этом остановитесь. Следующая команда запускает заполнение исторических данных, и ее не следует выполнять в процессе чтения документации.

Функции процесса backfill

asl init создает структуру каталогов и заполняет исторические данные. Согласно документации проекта, полный цикл занимает несколько часов реального времени и требует несколько гигабайт дискового пространства. Для работы необходимо активное соединение с вышестоящим сервером котировок Tongdaxin, что и проверяет asl servers test. asl init --profile quick ограничивается данными за последние три года, выполняется за несколько минут и сохраняет все инструменты, торговавшиеся в этот период, включая те, что уже ушли с рынка. asl run daily отвечает за последующее инкрементальное обновление, asl status --datasets формирует отчеты о покрытии и актуальности по каждому набору данных, а asl serve запускает панель мониторинга в режиме «только чтение» по адресу 127.0.0.1:8787.

Репозиторий не содержит готовых данных. Каждый файл Parquet создается непосредственно на вашем компьютере, при этом для каждой строки сохраняется история происхождения, указывающая, какой источник ее сформировал и когда она была получена.

Что представляют собой тридцать девять наборов данных?

Они структурированы по уровням, начиная с эталонных данных: тридцать шесть подготовленных таблиц и три производных.

  • Эталонные данные: инструменты, торговый календарь на период с две тысячи шестнадцатого по две тысячи двадцать седьмой год, торговый статус.
  • Рыночные данные: дневные бары, бары индексов, одноминутные и пятиминутные бары, тики сделок, бары по сырьевым товарам, коэффициенты корректировки, события делистинга.
  • Корпоративные события: корпоративные действия, индекс объявлений, график раскрытия отчетности.
  • Фундаментальные показатели и оценка: статьи финансовой отчетности, метрики оценки, консенсус-прогнозы аналитиков.
  • Движение капитала: потоки фондов, маржинальная торговля, потоки и позиции northbound, раскрытие информации о крупных сделках (dragon-tiger board), блочные сделки, институциональные владения.
  • Структура и отрасль: участники секторов, компоненты индексов, участники отраслей, отраслевые индексы.
  • Макроэкономика: макроэкономические индикаторы, рыночный охват (market breadth), экономический календарь.
  • Настроения и ротация: оценки настроений, рейтинги популярности, отраслевые бары, отраслевые потоки фондов, заголовки новостей, лента оперативных новостей.
  • Риски и комплаенс: график разблокировки акций, регуляторные события.

Расположение набора данных указывает на приоритеты автора. Коэффициенты корректировки и события делистинга находятся на уровне рыночных данных рядом с дневными барами, а не вынесены в приложение; именно это размещение составляет половину ценности проекта для любого, кто тестирует торговые идеи на исторических данных.

Как локальное хранилище данных решает проблему ошибки выжившего

Ошибка выжившего возникает, когда выборка для исследования формируется только из тех компаний, которые торгуются на бирже сегодня. Все компании, которые прошли через слияния, стали частными или были исключены из листинга, молчаливо отсутствуют, а исчезнувшие названия редко бывают успешными.

Наше хранилище позволяет оценить масштаб этого пробела для рынка США — та же арифметика, но в другом представлении. Для каждого года мы берем все тикеры, по которым были зафиксированы минутные бары во вторую неделю марта, а затем проверяем, какие из них продолжали торговаться в последние две недели июля 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 годам, то по мере углубления в прошлое он будет отсеивать всё большую долю рынка.

Существует удобное предположение, что все исчезнувшие компании были «мусорными» акциями (penny stocks). Однако сортировка когорты марта 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 API позволяет получить исторический срез, включающий эти бумаги. В документации проекта сообщается о примерно двукратном разрыве в результатах бэктеста между стратегией, учитывающей только выживших, и стратегией с учетом делистинга за период с 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-shares. Никаких листингов в Гонконге, США или за пределами материкового Китая.
  • Персональный проект. Запросы на исправление ошибок и изменения (pull requests) рассматриваются в меру возможностей, а документация прямо указывает на отсутствие гарантий доступности: источники данных меняются, а IP-адрес может быть заблокирован, что останавливает процесс загрузки до тех пор, пока кто-либо не внесёт исправления.
  • Лицензия Apache 2.0 распространяется на код, но не на данные. Каждый источник сохраняет свои собственные условия использования, и автор проекта не предоставляет прав на перераспределение или перепродажу созданных вами файлов Parquet. Ознакомьтесь с условиями источников перед любым коммерческим использованием.
  • Для работы с источниками не требуются учетные записи или токены, что является одновременно преимуществом и уязвимостью проекта.
  • Поддержка Windows появилась в версии 0.3.0, а минимально необходимая версия Python была поднята до 3.10 в версии 0.3.1.
Источники информации о проекте

Версия 0.5.0, шесть дат выпуска и минимальная версия Python взяты из истории релизов PyPI и CHANGELOG проекта по состоянию на 4 августа 2026 года. Каталог наборов данных, информация о делистинге и поведении point-in-time, флаги CLI, список инструментов MCP, а также формулировки условий лицензирования и поддержки взяты из документации репозитория: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md и docs/legal-and-data-sources.md. Программное обеспечение обновляется быстрее, чем статьи, поэтому проверяйте документацию для той версии, которую вы устанавливаете. Две панели выживаемости (survivorship panels) оценивают тикеры США в нашем собственном хранилище, а не китайские листинги, и служат иллюстрацией механизма, а не замером рынка A-shares.

Часто задаваемые вопросы

Нужен ли API-ключ для создания локального хранилища данных по акциям A-share?

Для этого проекта — нет. Используемые источники данных не требуют регистрации или токенов, а само хранилище размещается на вашем оборудовании. Каждый источник имеет свои условия использования, которые необходимо учитывать перед началом любой коммерческой деятельности.

Сколько времени занимает заполнение ashare-lake историческими данными?

Согласно документации, полная загрузка истории занимает несколько часов реального времени и требует несколько гигабайт дискового пространства; при этом на протяжении всего процесса необходимо стабильное соединение с хостом котировок. asl init --profile quick позволяет загрузить данные за последние три года за несколько минут, включая инструменты, которые были делистингованы за этот период.

Включает ли локальное хранилище данных A-share акции, прошедшие делистинг?

Да. Тикеры исключенных из листинга компаний остаются в наборе данных об инструментах, таблица delisting_events фиксирует обстоятельства прекращения торгов по каждому наименованию, а universe="all_a" позволяет сформировать исторический срез, включающий эти бумаги. Наши измерения по рынку США, приведенные выше, показывают масштаб данных, которые теряются при использовании вселенных, состоящих только из активных компаний.

Может ли AI-агент напрямую обращаться к 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