Data lake local de ações A para agentes de IA
O ashare-lake cria um data lake local de ações A com 39 conjuntos de dados, registros de deslistagem, consultas point-in-time e servidor MCP para agentes.
Um data lake local de ações A é o histórico do mercado acionário da China continental armazenado no seu próprio disco como arquivos Parquet colunares, que podem ser lidos pelo DuckDB ou pelo Polars. Em vez de consultar um endpoint de fornecedor página por página, você trabalha com os dados localmente. ashare-lake é um projeto de código aberto que constrói esse lake, inclui o job diário que o mantém atualizado e oferece um servidor Model Context Protocol que permite a um agente de IA consultá-lo. Duas decisões de projeto justificam este artigo: os ativos deslistados são mantidos, e os fundamentos podem ser consultados com base no que estava disponível em uma data passada.
Por que um agente de IA precisa de um data lake local de ações chinesas
Um agente que pesquisa ações chinesas sem uma cópia local tem dois caminhos. Ele coleta dados de páginas financeiras, consome sua janela de contexto com HTML e produz números que ninguém consegue reproduzir no mês seguinte. Ou chama um fornecedor que exige cadastro, limita o número de linhas e vincula cada resultado a uma conta.
A escala é o aspecto mais subestimado. Nosso próprio data warehouse armazena os dados do mercado americano com resolução de um minuto, e uma semana comum desses dados se parece com isto:
O SQL exato por trás de cada número
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 sessionEm Jul 20, o mercado gerou 1.79 milhões de barras de um minuto distribuídas por 11737 tickers, e as outras quatro sessões do painel repetem esse padrão. Um mercado nacional, uma semana, uma resolução. Uma década de barras diárias, fundamentos, composição de índices e registros de fluxo financeiro de outro mercado tem a mesma dimensão, e percorrer esses dados por HTTP consome toda a execução de um agente.
Um data lake local muda duas coisas ao mesmo tempo. As leituras passam a ser uma varredura de arquivos, e não uma operação sujeita a limite de consultas. Além disso, uma consulta escrita hoje retorna as mesmas linhas daqui a seis meses. Isso é necessário para que um backtest possa ser verificado. Nossas notas sobre competências de dados de mercado para agentes de IA e sobre uma API SQL sobre dados de mercado apresentam o mesmo argumento para os dados do mercado americano.
Instale-o com a versão fixada
Python 3.10 ou mais recente. Fixe a versão: seis lançamentos ocorreram entre 27 de julho e 2 de agosto de 2026, e uma instalação sem versão fixada no script de configuração de um agente muda continuamente. O código está em rootSunc/ashare-lake, sob a licença Apache 2.0.
pip install ashare-lake==0.5.0instala a versão atual no início de agosto de 2026.asl --versionexibe a build instalada.asl config init --data-root /path/to/ashare-lakegrava o arquivo TOML de exemplo incluído no pacote, preenchendo o caminho raiz dos seus dados, sem exigir um checkout do repositório.--configdefine o caminho de saída;--forcesobrescreve o arquivo.asl doctorexecuta as verificações offline, antes de qualquer transferência de dados.asl servers testtesta os hosts upstream de cotações.asl sourcestesta cada fonte, com um--vantagedecn,overseasoulocal.
Pare aí. O próximo comando faz o backfill e não deve ser executado enquanto você ainda estiver lendo.
O que o backfill faz
asl init cria a estrutura de diretórios e preenche o histórico. A documentação do projeto estima que uma execução completa leve horas de tempo corrido e ocupe vários GB em disco. Também é necessária uma conexão ativa com um servidor upstream de cotações Tongdaxin, o que asl servers test verifica. asl init --profile quick cobre os três anos mais recentes em minutos. Ainda assim, mantém todos os nomes que negociaram nesse período, inclusive os que deixaram o mercado desde então. asl run daily é o job incremental executado depois. asl status --datasets informa a cobertura e a atualização de cada dataset. asl serve disponibiliza um dashboard somente para leitura em 127.0.0.1:8787.
O repositório não inclui dados. Cada arquivo Parquet é criado na sua máquina. Cada linha registra a sua linhagem, indicando qual fonte a produziu e quando foi obtida.
Quais são os 39 datasets?
Eles estão organizados em camadas, começando pelos dados de referência: 36 tabelas tratadas e 3 tabelas derivadas.
- Referência: instrumentos, um calendário de negociação que cobre de 2016 a 2027 e status de negociação.
- Dados de mercado: barras diárias, barras de índices, barras de 1 minuto e 5 minutos, ticks de negócios executados, barras de commodities, fatores de ajuste e eventos de deslistagem.
- Eventos corporativos: ações corporativas, um índice de anúncios e o calendário de divulgação de resultados.
- Fundamentos e valuation: itens das demonstrações financeiras, métricas de valuation e consenso de analistas.
- Fluxo de capital: fluxo de fundos, operações de margem, fluxos e posições de investidores estrangeiros no sentido norte, o quadro Dragon-Tiger de divulgação de ordens de grande porte, block trades e posições de investidores institucionais.
- Estrutura e setores: integrantes de setores, componentes de índices, integrantes de setores econômicos e índice setorial.
- Macroeconomia: indicadores macroeconômicos, amplitude de mercado e um calendário econômico.
- Sentimento e rotação: pontuações de sentimento, ranking de ativos em alta, barras setoriais, fluxo de fundos por setor, manchetes de notícias e um serviço de notícias em tempo real.
- Risco e compliance: calendário de desbloqueio de ações e eventos regulatórios.
A posição de cada dataset mostra o que o autor considera importante. Fatores de ajuste e eventos de deslistagem estão na camada de dados de mercado, ao lado das barras diárias. Eles não foram relegados a um apêndice. Essa escolha é a parte mais valiosa do projeto para quem testa estratégias com dados históricos.
Como um data lake local trata o viés de sobrevivência
O viés de sobrevivência ocorre quando o universo de um estudo é formado pelos nomes que ainda estão listados hoje. Todas as empresas que foram incorporadas, fecharam o capital ou foram deslistadas ficam silenciosamente de fora. E os nomes que desaparecem raramente são os vencedores.
Nosso warehouse consegue dimensionar essa lacuna no mercado americano, usando a mesma aritmética em outro conjunto de dados. Para cada ano, considere todos os símbolos que tiveram negociações em barras de um minuto na segunda semana de março. Depois, verifique quais ainda registravam negociações nas duas últimas semanas de julho de 2026:
O SQL exato por trás de cada número
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 yearDos 8101 símbolos negociados naquela semana em 2016, 50.1% ainda apareciam no tape no fim de julho de 2026, e 4040 não apareciam mais. A coorte 2025 apresenta 86.7%. Ao aplicar retroativamente um screen baseado nas listagens atuais ao longo desses 10 anos, uma parcela cada vez maior do mercado fica de fora.
A suposição confortável é que os nomes ausentes eram todos penny stocks. A classificação da coorte de março de 2021 por faixas de volume financeiro médio diário naquele mês mostra o contrário:
O SQL exato por trás de cada número
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)A faixa under $1M perdeu a maior parcela: 57.5% de 3968 nomes. A faixa mais líquida também não ficou imune: 3.4% dos 89 símbolos que negociavam $1B or more por dia em março de 2021 haviam saído do mercado no fim de julho de 2026. Incorporações, fechamentos de capital, falências e exclusões de índices terminam da mesma forma em uma tabela de preços: as linhas deixam de existir.
O ashare-lake trata isso como um problema central. O dataset de instrumentos mantém os símbolos deslistados, em vez de filtrar apenas os ativos ainda negociados. Uma tabela delisting_events registra como cada nome saiu do mercado. E universe="all_a" na API de Python resolve um snapshot histórico que os inclui. A documentação do projeto aponta uma diferença de aproximadamente duas vezes entre um backtest que considera apenas sobreviventes e outro que inclui deslistagens no período de 2016 a 2021. É o reflexo do problema apresentado em nossas notas sobre viés de antecipação em backtests: um universo que conhece o futuro sem deixar isso explícito.
Consultas ponto no tempo
load("financial_statement_items", as_of="2018-04-30") retorna a versão mais recente de cada item de linha anunciada até aquela data, e não o número posteriormente reapresentado. As barras aceitam um argumento adjust: hfq para ajuste retroativo, qfq normalizado dentro da janela da consulta, ou preços brutos. Um fator ajustado com números que o mercado ainda não havia divulgado não mede nada. Essa é a primeira verificação a fazer em qualquer pipeline de fator de alpha gerado por LLM.
Registrando-o como servidor MCP
O Model Context Protocol é o mecanismo usado por um agente para acessar ferramentas. asl mcp o utiliza via stdio, e o cliente inicia o processo:
claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml- Qualquer outro cliente MCP usa os mesmos dois elementos:
aslcomo comando emcp --configmais um caminho absoluto como argumentos. O caminho precisa ser absoluto, pois o cliente pode iniciar o processo a partir de qualquer diretório.
Seis ferramentas são disponibilizadas, organizadas por tipo de pergunta, e não por conjunto de dados: describe_lake informa o que existe e como fazer a leitura; resolve_symbol converte um nome em código, incluindo nomes de empresas que já deixaram de ser listadas; query_bars; query_fundamentals, com seu argumento as_of; query_dataset, para todos os demais casos; e run_sql, que executa uma consulta SELECT somente para leitura no DuckDB entre conjuntos de dados. Um sinalizador --live permite que o servidor responda a consultas de símbolos e a dados diários não ajustados diretamente da fonte upstream, sem gravá-los no lake.
Limites que vale a pena conhecer primeiro
- Apenas ações A. Nada de Hong Kong, listagens nos EUA ou qualquer ativo fora da China continental.
- Um projeto pessoal. Issues e pull requests recebem atenção conforme a disponibilidade. A documentação informa claramente que não há garantia de disponibilidade: os sites de origem mudam, e um IP pode ser bloqueado, interrompendo a ingestão até que alguém faça uma correção.
- A licença Apache 2.0 abrange o código, não os dados. Cada fonte de origem mantém os seus próprios termos, e o responsável pelo projeto não concede nenhum direito de redistribuir ou revender os ficheiros Parquet que você criar. Leia os termos das fontes antes de qualquer uso comercial.
- As fontes consultadas não exigem conta nem token. Essa é a vantagem, mas também o ponto de fragilidade.
- O suporte para Windows chegou na versão 0.3.0, e a versão mínima do Python passou para 3.10 na versão 0.3.1.
De onde vêm estes factos sobre o projeto
A versão 0.5.0, as seis datas de lançamento e a versão mínima do Python vêm do histórico de lançamentos do projeto no PyPI e do CHANGELOG, consultados em 4 de agosto de 2026. O catálogo de datasets, o comportamento relativo a exclusões de listagem e a dados point-in-time, as opções da CLI, a lista de ferramentas MCP e as informações sobre licenciamento e suporte vêm da documentação do repositório: docs/datasets/catalog.md, docs/reference/cli.md, docs/reference/mcp.md e docs/legal-and-data-sources.md. O software evolui mais depressa do que os artigos, por isso consulte a documentação correspondente à versão que instalar. Os dois painéis de survivorship medem símbolos dos EUA no nosso próprio data warehouse, não listagens chinesas, e servem como ilustração do mecanismo, não como medição do mercado de ações A.
Perguntas frequentes
É necessária uma chave de API para criar um data lake local de ações A?
Não com esta ferramenta. As fontes upstream consultadas não exigem cadastro nem token, e o próprio data lake fica na sua máquina. Cada fonte tem os seus próprios termos de uso, que devem ser verificados antes de qualquer trabalho comercial.
Quanto tempo leva o backfill do ashare-lake?
A documentação estima que o backfill do histórico completo leve horas de tempo de execução e ocupe vários GB de disco. Também é necessária uma conexão ativa com um servidor upstream de cotações durante todo o processo. asl init --profile quick cobre os três anos mais recentes em minutos e ainda inclui ações que foram posteriormente deslistadas.
Um data lake local de ações A inclui ações deslistadas?
Este inclui. Os tickers deslistados permanecem no dataset de instrumentos. Uma tabela delisting_events registra como cada empresa saiu do universo. universe="all_a" cria um snapshot histórico que também as inclui. A nossa medição dos EUA acima mostra o tamanho do que um universo composto apenas por sobreviventes deixa de fora.
Um agente de IA pode consultar o ashare-lake diretamente?
Sim. asl mcp disponibiliza seis ferramentas pelo Model Context Protocol. Uma delas é uma ferramenta SQL somente para leitura. Assim, o agente consulta arquivos Parquet locais em vez de fazer scraping. Registre-o com claude mcp add ashare-lake -- asl mcp --config /abs/path/to/ashare-lake.toml.
O ashare-lake substitui o AkShare ou o Baostock?
Não. Ele fica acima dessas ferramentas. Essas bibliotecas obtêm dados das fontes upstream. Este projeto armazena, versiona e reconcilia os dados obtidos em arquivos Parquet curados, com linhagem em nível de linha e um contrato para cada dataset.
Todos os números acima vêm de consultas armazenadas e versionadas sobre dados reais de mercado. Expanda qualquer painel para ler o SQL ou execute a mesma verificação de viés de sobrevivência no seu próprio universo no terminal Strasmore.