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

AIエージェント向けローカルA株データレイク

ashare-lakeは、39種類のデータセット、上場廃止記録、特定時点のクエリ、エージェント向けMCPサーバーを備えたローカルA株データレイクを構築します。

ローカルA株データレイクとは、中国本土の株式市場の履歴データを、ベンダーのエンドポイントへ一ページずつアクセスするのではなく、自分のディスク上に列指向のParquetファイルとして保存する仕組みです。DuckDBやPolarsで読み取れます。ashare-lakeは、このデータレイクに加え、データを最新に保つ日次ジョブと、AIエージェントがデータを照会できるModel Context Protocolサーバーを構築するオープンソースプロジェクトです。ここで取り上げる理由は、二つの設計上の選択にあります。上場廃止銘柄を保持していることと、過去の特定時点におけるファンダメンタルズを読み取れることです。

AIエージェントにローカルの中国A株データレイクが必要な理由

ローカルコピーを持たずに中国株を調査するエージェントには、二つの方法があります。金融情報ページをスクレイピングし、コンテキストウィンドウをHTMLに費やしたうえで、翌月には誰も再現できない数値を出力する方法です。もう一つは、登録が必要なベンダーを呼び出す方法です。この場合、行数に上限があり、すべての結果がアカウントにひもづきます。

過小評価されがちなのが規模です。当社のデータウェアハウスには、米国市場のティックデータが分単位の解像度で保存されています。その通常の一週間は、次のようになります。

クエリ米国の分足テープの一週間:セッション当たりの銘柄数とバー数、2026年7月20~24日
各数値の背後にある正確な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経由でページングすると、エージェントの処理時間を使い切ってしまいます。

ローカルデータレイクにすると、二つの点が同時に変わります。読み取りはクォータ制限ではなくファイルスキャンになり、今日書いたクエリは六カ月後にも同じ行を返します。これはバックテストを検証可能にするために必要です。当社のAIエージェント向けマーケットデータのスキルに関するメモと、マーケットデータ上のSQL APIに関するメモでも、米国市場のデータについて同じ点を論じています。

インストール時にバージョンを固定する

Python 3.10以降を使用します。バージョンは固定してください。2026年7月27日から8月2日までの間に六つのリリースが公開されており、エージェントのセットアップスクリプト内でバージョンを指定せずにインストールすると、内容が変わり続けます。コードはApache 2.0ライセンスで、rootSunc/ashare-lakeにあります。

  • pip install ashare-lake==0.5.0は、2026年8月初旬時点の現行リリースをインストールします。
  • asl --versionは、インストール済みのビルドを表示します。
  • asl config init --data-root /path/to/ashare-lakeは、データルートを入力したパッケージ同梱のサンプルTOMLを書き出します。リポジトリのチェックアウトは不要です。--configで出力先を指定し、--forceで上書きします。
  • asl doctorは、データを移動する前にオフラインでチェックを実行します。
  • asl servers testは、上流の気配値ホストを確認します。asl sourcesは各ソースを確認し、--vantageとしてcnoverseaslocalのいずれかを指定します。

ここで止めてください。次のコマンドはバックフィルを実行します。読みながら実行するものではありません。

バックフィルの処理内容

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ファイルは利用者のマシン上で構築され、各行には、どのソースが生成元となったか、いつ取得されたかを記録する行レベルのデータ来歴が付与されます。

39のデータセットとは何ですか?

基準データから外側へ向かって階層化されています。厳選したテーブルが36個、派生テーブルが3個あります。

  • 基準データ:銘柄情報、2016年から2027年までを対象とする取引カレンダー、取引ステータス。
  • 市場データ:日足、指数足、1分足・5分足、約定ティック、商品足、調整係数、上場廃止イベント。
  • コーポレートイベント:コーポレートアクション、発表インデックス、決算開示スケジュール。
  • ファンダメンタルズとバリュエーション:財務諸表項目、バリュエーション指標、アナリスト・コンセンサス。
  • 資金フロー:ファンドフロー、信用取引、北向き資金のフローと保有状況、大口注文の開示を集計した龍虎榜、ブロック取引、機関投資家の保有状況。
  • 構成と業種:セクター構成銘柄、指数構成銘柄、業種構成銘柄、業種指数。
  • マクロ:マクロ指標、市場の騰落状況、経済カレンダー。
  • センチメントとローテーション:センチメントスコア、注目度ランキング、セクター足、セクター別資金フロー、ニュース見出し、速報ニュース配信。
  • リスクとコンプライアンス:株式ロックアップ解除スケジュール、規制イベント。

データセットの配置からは、著者が何を重視しているかが分かります。調整係数や上場廃止イベントは付録に置かれず、日足と同じ市場データ層に含まれています。この配置こそ、過去データで投資アイデアを検証する人にとって、プロジェクトの価値の半分を占める部分です。

地域市場で生存者バイアスに対処する方法

生存者バイアスは、調査対象の母集団を現在も上場している銘柄から作ると生じます。合併した企業、非公開化した企業、上場廃止となった企業は、気付かれないまま除外されます。消えた銘柄が勝ち組であることは、ほとんどありません。

当社のデータウェアハウスでは、米国市場についてこの欠落の規模を算出できます。表記体系が異なるだけで、計算方法は同じです。各年について、三月第2週に分足が記録された全銘柄を取り出し、そのうち二千二十六年七月の最後の2週間にも取引記録が残っていた銘柄を確認します。

クエリ生存状況の測定:2026年3月の米国銘柄コホートのうち、2026年7月下旬も取引されている銘柄
各数値の背後にある正確な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

2016の週に取引されていた8101銘柄のうち、二千二十六年七月下旬にも取引記録が残っていたのは50.1%、残っていなかったのは4040でした。2025年のコホートでは86.7%となります。現在の上場銘柄を起点に、10年前までさかのぼってスクリーニングすると、市場の欠落割合は次第に拡大します。

消えた銘柄はすべてペニー株だった、という都合のよい前提があります。しかし、二千二十一年三月のコホートを同月の1日平均売買代金で階層化すると、実態は異なります。

クエリテープから消えた銘柄:日次ドル出来高別の2021年3月の米国銘柄を、2026年7月下旬と照合
各数値の背後にある正確な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の階層で、3968銘柄の57.5%に達しました。最も活発に取引された階層も例外ではありません。二千二十一年三月に1日$1B or moreの売買代金で取引されていた89銘柄のうち、二千二十六年七月下旬までに市場から消えたのは3.4%でした。合併、非公開化、破産、指数からの除外は、価格テーブル上ではすべて同じ結果になります。行が消えるのです。

ashare-lakeはこの問題を主要な論点として扱います。instrumentsデータセットには上場廃止銘柄を残し、現存銘柄だけに絞り込むことはありません。delisting_eventsテーブルには、各銘柄がどのような形で市場を離れたかを記録します。Python APIのuniverse="all_a"は、上場廃止銘柄を含む過去時点のスナップショットを返します。同プロジェクトの文書によると、二千十六年から二千二十一年では、上場廃止を含めたバックテストと生存銘柄だけを使ったバックテストの間に、およそ2倍の差が生じます。これは、当社のバックテストにおける先読みバイアスのノートで扱った罠の裏返しです。つまり、将来を密かに知っている銘柄ユニバースです。

時点に即したデータの読み取り

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は、データセット横断で読み取り専用のDuckDB SELECTを一つ実行します。--liveフラグを指定すると、サーバーはレイクに書き込まず、上流データから銘柄検索と未調整の日次バーを返せます。

まず確認しておきたい制約

  • A株のみが対象です。香港上場銘柄、米国上場銘柄、中国本土以外の銘柄は対象外です。
  • 個人プロジェクトです。IssueやPull Requestへの対応は可能な範囲に限られます。ドキュメントにも、可用性は保証されないと明記されています。上流サイトの仕様変更やIPブロックにより、誰かが修正するまでデータ取り込みが停止する可能性があります。
  • コードにはApache 2.0ライセンスが適用されますが、データには適用されません。各上流ソースにはそれぞれの利用規約があり、メンテナーは作成したParquetファイルの再配布や再販売の権利を付与していません。商用利用の前に、各ソースの規約を確認してください。
  • 読み取り対象のソースでは、アカウントもトークンも不要です。これが利点である一方、脆弱性にもなっています。
  • Windows対応は0.3.0で追加され、Pythonの最低対応バージョンは0.3.1で3.10に引き上げられました。
これらのプロジェクト情報の出典

バージョン0.5.0、6つのリリース日、Pythonの最低対応バージョンは、2026年8月4日に確認したプロジェクトのPyPIリリース履歴とCHANGELOGに基づいています。データセットカタログ、上場廃止銘柄とポイントインタイムの扱い、CLIフラグ、MCPツール一覧、ライセンスとサポートに関する説明は、リポジトリのドキュメントであるdocs/datasets/catalog.mddocs/reference/cli.mddocs/reference/mcp.mddocs/legal-and-data-sources.mdに基づいています。ソフトウェアは記事より速く更新されるため、インストールするバージョンのドキュメントを確認してください。2つのサバイバーシップパネルは、当社のデータウェアハウスにある米国銘柄を対象に計測したもので、中国上場銘柄ではありません。A株市場の計測結果ではなく、仕組みを示す例として掲載しています。

FAQ

ローカルのA株データレイクを構築するにはAPIキーが必要ですか?

このデータレイクには必要ありません。読み込む上流ソースは、登録やトークンを必要としません。データレイク自体も利用者のマシン上で動作します。各ソースにはそれぞれ利用規約があるため、商用利用の前に確認が必要です。

ashare-lakeのバックフィルにはどのくらい時間がかかりますか?

ドキュメントによると、全履歴のバックフィルには実時間で数時間かかり、ディスク容量を数GB使用します。処理中は上流の株価ホストへの接続も継続して必要です。asl init --profile quickは直近三年分を数分で処理し、すでに上場廃止となった銘柄も含みます。

ローカルのA株データレイクには上場廃止銘柄も含まれますか?

含まれます。上場廃止銘柄は銘柄データセットに残り、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の代替ですか?

いいえ。ashare-lakeはそれらの上位に位置します。これらのライブラリは上流ソースからデータを取得します。ashare-lakeは取得したデータを、行単位のリネージュとデータセットごとの単一の契約情報を備えた、整備済みのParquetとして保存、バージョン管理、突合します。


上記のすべての数値は、実際の市場データに対する保存・バージョン管理済みクエリから得られたものです。各パネルを展開してSQLを確認するか、Strasmore terminalで同じサバイバーシップ検証を自身のユニバースに対して実行してください。

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