快速开始

AxData 快速开始

本文介绍 AxData 的本地安装、启动和常用入口。优先推荐完整项目安装,它包含 Python SDK、CLI、API 和 Web 控制台;只在脚本或 Notebook 中使用 SDK 时,也可以直接 pip install axdata。Windows 使用 PowerShell 命令,macOS/Linux 使用 Bash 命令。想写新插件时,直接跳到 plugin-development.md

0. 完整项目和 Web 控制台

运行下面一行命令即可拉取完整项目并安装本地开发环境。

Windows PowerShell:

git clone https://github.com/electkismet/AxData.git AxData; cd AxData; powershell -ExecutionPolicy Bypass -File .\scripts\bootstrap.ps1

macOS / Linux:

git clone https://github.com/electkismet/AxData.git AxData && cd AxData && bash scripts/bootstrap.sh

这条命令会拉取完整项目、创建 .venv、安装本地 Python 包和 Web 依赖。

运行完整项目需要本机具备 3 个运行环境:Git 用来下载源码,Python 3.11+ 用来运行 SDK/API,Node.js 22.12+ 或更新 LTS 用来运行 Web 控制台。

常见环境安装方式如下。

Windows PowerShell:

winget install --id Git.Git -e
winget install --id Python.Python.3.12 -e
winget install --id OpenJS.NodeJS.LTS -e

macOS Homebrew:

brew install git python@3.12 node

Ubuntu / Debian:

sudo apt update
sudo apt install -y git python3 python3-venv python3-pip curl ca-certificates

Ubuntu / Debian 自带的 nodejs 版本可能偏旧;如果 node --version 低于 22.12,请从 Node.js 官网、NodeSource、nvm/fnm 或系统软件源安装更新的 Node.js。

安装完成后重新打开终端,确认命令可用:

git --version
python --version
node --version
npm --version

启动 API。

Windows PowerShell:

.\.venv\Scripts\python -m uvicorn apps.api.main:app --host 127.0.0.1 --port 8666 --reload

macOS / Linux:

./.venv/bin/python -m uvicorn apps.api.main:app --host 127.0.0.1 --port 8666 --reload

启动 Web:

npm run dev:web

打开 Web 控制台:

http://127.0.0.1:8667

1. Python 包安装

只需要 Python SDK/CLI 时,可以直接安装 axdata 包:

pip install axdata

如果希望放在虚拟环境里:

python -m venv .venv
.\.venv\Scripts\python -m pip install -U pip
.\.venv\Scripts\python -m pip install axdata

axdata 会安装 AxData SDK、CLI、本地查询能力和默认数据源能力。安装后可以直接在 Python 里用 SDK,也可以用 CLI 查看本机状态;不需要先启动 API 或 Web。

axdata doctor
axdata plugin list

axdata init 只用于提前创建本地 data/metadata/cache/logs/ 等目录;SDK 本地查询、源端临时请求和 Web/API 启动会按需使用默认路径。

import axdata as ax

client = ax.AxDataClient()
stocks = client.stock_basic_exchange(exchange="SSE", fields=["instrument_id", "name"])

2. 源码开发说明

完整项目安装完成后,可以查看插件和本机状态:

.\.venv\Scripts\axdata plugin list --json
.\.venv\Scripts\axdata doctor

随项目提供的 TDX/TDX Ext 插件安装后默认可用,不需要手动启用;也可以按需禁用。普通 TDX Provider 是 axdata.source.tdx_external,TDX Ext 扩展行情 Provider 是 axdata.source.tdx_ext_external

源码开发时可运行轻量测试和离线检查:

.\.venv\Scripts\python -m pytest tests\test_data_collection_loop.py -q
.\.venv\Scripts\python scripts\smoke_real_sources.py --json

写出本地 Parquet 后,可用 DuckDB 直接查:

@'
import duckdb

con = duckdb.connect()
rows = con.execute("""
    SELECT *
    FROM read_parquet('data/core/table=daily/**/*.parquet', hive_partitioning = true)
    LIMIT 5
""").fetchall()
print(rows)
'@ | .\.venv\Scripts\python -

新仓库没有本地 core Parquet 时,DuckDB 查询会提示路径不存在;先运行 Collector/Downloader 或可选真实源 smoke 写出样本后再查。

如果不使用 bootstrap,也可以手动安装。最小源码开发命令如下:

python -m venv .venv
.\.venv\Scripts\python -m pip install -U pip
.\.venv\Scripts\python -m pip install -e ".[dev]"
.\.venv\Scripts\python -m pip install -e libs\axdata_core
.\.venv\Scripts\python -m pip install -e packages\axdata-sdk
.\.venv\Scripts\python -m pip install -e packages\axdata-source-tencent
.\.venv\Scripts\python -m pip install -e packages\axdata-source-cninfo
.\.venv\Scripts\python -m pip install -e packages\axdata-source-tdx
.\.venv\Scripts\python -m pip install -e packages\axdata-source-tdx-ext
npm install

TDX 能力来自独立插件包。普通 TDX Provider 是 axdata.source.tdx_external,TDX Ext 扩展行情 Provider 是 axdata.source.tdx_ext_external;两者独立安装,安装后默认可用,也可以按需禁用。未安装或被显式禁用时,Web/CLI/API 会在 Provider 状态里显示原因。

3. 源码启动 API 和 Web

本节面向已经 clone 仓库并完成源码开发安装的用户。只用 pip install axdata 安装 SDK/CLI 时,可以跳过本节。

启动前可以先跑一次诊断;init 只用于提前创建本地目录,不是 SDK 或 API 的强制前置步骤:

.\.venv\Scripts\axdata init
.\.venv\Scripts\axdata config show
.\.venv\Scripts\axdata doctor
.\.venv\Scripts\axdata status

init 会幂等创建 data/rawdata/stagingdata/coredata/factor、与 data root 同级的 metadata/collectorplugins/site-packagescachelogs,并在缺失时写入默认 metadata/plugins.json。例如 --data-root C:\axdata\data 会配套使用 C:\axdata\metadataC:\axdata\pluginsC:\axdata\cacheC:\axdata\logs。它不会联网、 不会自动安装第三方插件,也不会写入任何第三方源 token。

config show 用来确认当前 data root、metadata root、插件配置、插件 site-packages、Collector store、 API/Web 地址。doctor 会离线检查 Python/AxData 版本、目录是否存在且可写、DuckDB/pyarrow/pandas/FastAPI/uvicorn、 ProviderRegistry、已发现/启用/失败/冲突插件、TDX 插件是否安装启用、8666/8667 端口是否可能被占用、 最近 Collector task/run 和真实源 smoke 的可运行条件。需要脚本处理时可以加 --json

启动 API:

.\.venv\Scripts\python -m uvicorn apps.api.main:app --host 127.0.0.1 --port 8666 --reload

API 默认地址是 http://127.0.0.1:8666。另开一个终端检查:

curl http://127.0.0.1:8666/health
curl http://127.0.0.1:8666/v1/config
curl http://127.0.0.1:8666/v1/status
curl http://127.0.0.1:8666/v1/doctor

启动 Web:

npm run dev:web

Web 默认地址是 http://127.0.0.1:8667,只作为本机管理台。API 和 Web 开发时使用不同端口。API host/port、Web 本机端口可以这样覆盖:

$env:AXDATA_API_PORT = "8766"
.\.venv\Scripts\python -m uvicorn apps.api.main:app --host 127.0.0.1 --port 8766 --reload

$env:AXDATA_WEB_PORT = "8767"
npm run dev:web

启动后可以在 Web 的配置页查看本地状态与诊断。该页面会调用 /v1/status/v1/doctor,展示 API 状态、data/metadata/plugin 目录、已安装/已启用/禁用/失败或冲突插件数量、Collector 摘要、最近失败 run、端口和目录可写性等检查项。检查项会按 OK/WARN/ERROR/SKIP 显示;有下一步动作时会展示 next_action 或可复制的 action_command。如果 API 调用失败,页面会显示错误文本,不会白屏。

4. 查看插件和接口目录

CLI:

.\.venv\Scripts\axdata plugin list --json
.\.venv\Scripts\axdata plugin installed --json
.\.venv\Scripts\axdata plugin collectors --json

Provider 和已安装插件的 JSON 里会包含 status_messagenext_actionaction_command,以及 install_sourcecan_enablecan_disablecan_uninstalluninstall_block_reason。插件已安装但未启用、 manifest 不可发现、import/entry point 失败、版本不兼容或冲突时,先看这些字段再决定 enable、重装或调整 override。预装插件可以启用、禁用、逻辑卸载并重新启用;AXP 管理安装的插件可以由 AxData 物理卸载;Python 环境或 editable/development 路径发现的非预装插件需要用 pip uninstall 或移除开发路径。插件卸载不会删除已采集数据、metadata、用户 Task 或 run history。

API:

curl http://127.0.0.1:8666/v1/plugins/providers
curl http://127.0.0.1:8666/v1/plugins/installed
curl http://127.0.0.1:8666/v1/plugins/collectors
curl http://127.0.0.1:8666/v1/request/interfaces

Web:

Web 的 Provider 状态和已安装插件卡片也会展示 status_messagenext_actionaction_command。TDX 缺失或不可用时只提示安装并启用 TDX 插件,不提供 core 兜底路径,也不会自动联网安装依赖。如果只启用了普通 TDX,source_request 目录为 core/generic 135 个接口 + 普通 TDX 90 个接口;包存在但未启用的 TDX Ext 应显示为 disabled,可点击启用;安装并启用 TDX Ext 后,扩展行情 31 个接口会以“通达信扩展行情”一级菜单出现,不混入普通通达信详情页。

5. 源端直取和本地查询

Python SDK 本地查询:

import axdata as ax

client = ax.AxDataClient()
stocks = client.stock_basic_exchange(exchange="SSE", fields=["instrument_id", "name", "list_date"])
bars = client.daily(ts_code="000001.SZ", start_date="20240101", end_date="20240131")

本地查询只读已经写入 data/core 的 Parquet。新仓库没有自带真实行情文件时,上面的查询会提示对应 core 表还没有数据;先用 client.call(...) 或 Downloader/Collector 验证源端和采集链路。

源端直取:

preview = client.call(
    "stock_codes_tdx",
    scope="all",
    fields=["instrument_id", "name", "exchange"],
)

常用 source-only 小样本也走同一入口,例如:

quote = client.call("stock_realtime_snapshot_tdx", code="000001.SZ", fields=["instrument_id", "last_price", "change_pct"])
index_bars = client.call("index_kline_tdx", code="000001.SH", period="day", count=20)
etf_bars = client.call("etf_kline_tdx", code="510050.SH", period="day", count=20)
constituents = client.call("concept_constituents_tdx", concept_code="881386", count=5)
intraday = client.call("stock_intraday_today_tdx", code="000001.SZ")
recent_intraday = client.call("stock_intraday_recent_history_tdx", code="000001.SZ", trade_date="20260519")
index_intraday = client.call("index_intraday_history_tdx", code="000001.SH", trade_date="20260617")
etf_trades = client.call("etf_trades_today_tdx", code="510050.SH")
trades = client.call("stock_trades_history_tdx", code="000001.SZ", trade_date="20260511")
finance = client.call("stock_finance_summary_tdx", code="000001.SZ")

CLI 等价源端直取:

.\.venv\Scripts\axdata request stock_realtime_snapshot_tdx `
  --param code=000001.SZ `
  --fields instrument_id,last_price,change_pct `
  --json

.\.venv\Scripts\axdata request stock_trades_history_tdx `
  --params '{\"code\":\"000001.SZ\",\"trade_date\":\"20260511\"}' `
  --fields instrument_id,trade_datetime,price,volume `
  --json

.\.venv\Scripts\axdata request index_intraday_history_tdx `
  --params '{\"code\":\"000001.SH\",\"trade_date\":\"20260617\"}' `
  --fields instrument_id,trade_time,price `
  --json

.\.venv\Scripts\axdata request etf_trades_today_tdx `
  --params '{\"code\":\"510050.SH\"}' `
  --fields instrument_id,trade_time,price `
  --json

.\.venv\Scripts\axdata request index_realtime_rank_tdx `
  --params '{\"sort\":\"change_pct\",\"count\":5}' `
  --json

源端直取默认不写入 raw/staging/core/factor,也不代表接口已经加入 Collector task template。TDX 插件未安装或被显式禁用时,CLI/API/SDK 会返回可读错误并提示检查 axdata.source.tdx_external

HTTP 源端直取:

curl -X POST http://127.0.0.1:8666/v1/request/stock_codes_tdx `
  -H "Content-Type: application/json" `
  -d "{\"params\":{\"scope\":\"all\"},\"fields\":[\"instrument_id\",\"name\",\"exchange\"]}"

curl -X POST http://127.0.0.1:8666/v1/request/index_kline_tdx `
  -H "Content-Type: application/json" `
  -d "{\"params\":{\"code\":\"000001.SH\",\"period\":\"day\",\"count\":20},\"fields\":[\"instrument_id\",\"trade_time\",\"close\"]}"

直接用 DuckDB 查看本地 Parquet:

@'
import duckdb

con = duckdb.connect()
rows = con.execute("""
    SELECT *
    FROM read_parquet('data/core/table=daily/**/*.parquet', hive_partitioning = true)
    LIMIT 5
""").fetchall()
print(rows)
'@ | .\.venv\Scripts\python -

新仓库没有本地 core Parquet 时,上面的查询会提示路径不存在;先运行 Collector/Downloader 或真实源 smoke,把样本写入 data/core 或指定输出目录后再查询。

采集或下载写出 Parquet 后,可以先用数据浏览命令确认本地到底有什么:

.\.venv\Scripts\axdata data list
.\.venv\Scripts\axdata data inspect daily
.\.venv\Scripts\axdata data preview daily --limit 20
.\.venv\Scripts\axdata query daily --symbol 000001.SZ --start 20240101 --end 20240131 --limit 100

这些命令只读本地 metadata 和 Parquet,不请求真实源。data list / data inspect 优先读取 Collector/Downloader metadata;缺少行数、列或日期范围时只读 Parquet footer/schema metadata 补充,不为了列表展示对大文件做全量 COUNT(*)。目录型 Parquet 的 footer 统计有文件数和目录数上限;超过上限时会标记 metadata 受限,不返回误导性的精确行数。新增写入 metadata 时,inspect 也会显示 write_modeprimary_keypartition_bydate_field、写入前后行数和去重行数;旧 run 缺字段时为空。previewquery 的返回行数默认受限,并且 Data Browser 单次最多返回 100 行;大数据量下优先传 --symbol--start--end--fields,让 DuckDB 只读取必要列和日期分区,缺匹配日期分区时直接返回空结果。需要大规模分析时,直接用 DuckDB、Python SDK 或导出任务,不在第一版 Data Browser 里做任意 SQL 编辑器。

API 等价入口:

curl http://127.0.0.1:8666/v1/data/datasets
curl http://127.0.0.1:8666/v1/data/datasets/daily
curl "http://127.0.0.1:8666/v1/data/datasets/daily/preview?symbol=000001.SZ&start=20240101&end=20240131&limit=20"

Web 控制台顶部的 Data Browser 页面会展示 dataset 列表、行数、日期范围、quality 状态、字段、输出路径和小范围 preview。如果本地还没有数据,它会显示空状态;先创建并运行 Collector task,或显式运行 Downloader/真实源 smoke 后再刷新。详情区会额外展示交易日历状态、日期缺口、非交易日、K 线异常和复权异常计数;CLI 的 axdata data inspect <dataset> 非 JSON 输出也会显示这些高层摘要,完整字段仍在 JSON 的 quality 对象中。

6. 采集器和 Collector task

当前已经实现两类写出入口:

查看可用 CollectorSpec:

.\.venv\Scripts\python -m axdata_core.cli plugin collectors --json

当前默认内置采集器包含 TDX 8 个独立 CollectorSpec:tdx.stock_codes_tdx.snapshottdx.stock_suspensions_tdx.snapshottdx.stock_st_list_tdx.snapshottdx.stock_daily_share_tdx.snapshottdx.stock_daily_price_limit_tdx.snapshottdx.stock_kline_daily_tdx.snapshottdx.stock_limit_ladder_tdx.snapshottdx.stock_theme_strength_rank_tdx.snapshotstock_capital_changes_tdxstock_adj_factor_tdx 保留在接口页和兼容下载入口,但不再作为采集器展示。交易所保留为 Source Provider 接口和本地基础数据能力,不再提供默认 CollectorSpec。巨潮、腾讯、东方财富和新浪的预装接口仍可在接口页或 axdata request 中临时查询,但不再默认出现在 Collector 或 Downloader 目录里。TDX source Provider manifest 不再贡献 legacy CollectorSpec;它仍提供 TDX 源端接口和 /v1/downloaders 兼容入口。创建 Collector task 需要一个真实存在的 collector_name

本地离线测试已经覆盖 Collector Runner 的基础链路:

runner_entry 或 legacy Downloader -> CollectorRun -> Parquet 主数据 + 可选 CSV/DuckDB -> log/quality/output_paths -> DuckDB query

quality 会保留 schemaprimary_keyrow_count 三个旧状态键,并额外展示 quality_statusrow_count_value、required columns 是否存在、缺失列、required 列空值计数、重复主键行数、日期/时间范围、非负数值列检查、实际/期望/额外列和字段映射。写入链路还会记录 write_modepartition_bywrite_primary_keywrite_date_field、写入前后行数、去重行数和触达分区。Web/CLI/API 直接展示同一个 JSON;如果某个采集器没有日期字段或数值字段,不会因为缺这些声明而失败。

行情类质量检查会结合本地交易日历:本地已有 trade_cal 时,dailystock_kline_daily_tdx 会输出交易日历覆盖、缺失交易日样本、非交易日多出样本和按证券代码的小样本覆盖摘要。采集任务层已经把 trade_cal 收口为系统基础依赖:日线任务运行前会先检查本地交易日历,缺失或覆盖不足时返回 dependency_missing,提示先同步“基础数据 / 交易日历”。日 K 线会检查 OHLC 高低关系、成交量/成交额非负。日期缺口不一定是错误,可能是停牌、未上市/退市、源端遗漏或本次只采了部分范围。

这表示框架链路可用,不表示所有真实源都已有生产级全市场 Collector。第一批核心表的当前状态是:

core 表当前源端接口当前采集状态
stock_basic_exchangestock_codes_tdxstock_basic_info_exchangeTDX source Provider 保留兼容 DownloaderProfile,axdata.collector.tdx 提供独立 CollectorSpec;交易所保留 source_request/兼容 DownloaderProfile,不再提供默认采集器;如需长期全量入库,应按采集器规范补充转换任务
trade_calstock_trade_calendar_exchange系统基础数据;Web 显示为“基础数据 / 交易日历”,trade_cal_refresh 会同步本地日历 cache,供其它采集任务运行前检查
dailystock_kline_daily_tdxschema/query/storage 已就绪;axdata.collector.tdx 独立 CollectorSpec 可写显式代码小样本;如需全市场长期更新,应补充专用转换任务
adj_factorstock_adj_factor_tdxschema/query/storage 与源端接口保留;不再作为默认采集器进入采集页;如需长期维护复权因子,应补充专用重建策略

创建 TDX 采集任务:

.\.venv\Scripts\python -m axdata_core.cli collector task add tdx.stock_codes_tdx.snapshot `
  --task-id stock_codes_refresh `
  --trigger-type manual `
  --params '{\"scope\":\"all\"}' `
  --fields instrument_id,symbol,tdx_code,exchange,name,market `
  --formats parquet `
  --json

也可以从当前可用模板创建核心任务。模板只使用安全默认参数,不会一键全市场重采:

.\.venv\Scripts\axdata collector task templates
.\.venv\Scripts\axdata collector task create-from-template daily --json

dailystock_kline_daily_tdx 模板需要 TDX 采集器插件 axdata.collector.tdx 已安装并启用;缺失时模板列表会显示下一步命令。它们还声明 required_datasets=["trade_cal"],因此建议先在 Web 中同步“基础数据 / 交易日历”。TDX 日线默认 code=000001.SZ,count=800,adjust=none

空的 Collector task store 会自动 seed 一个默认可见任务:stock_kline_daily_tdx_sample。它默认禁用,不会自动联网采集;用户可以在 CLI/API/Web 中查看、启用、禁用或手动运行。缺少或禁用 TDX 采集器插件时,该默认任务仍显示,但运行会提示“请安装/启用 TDX 采集器插件 (axdata.collector.tdx)”。缺少交易日历时,TDX 日线任务会提示“交易日历未同步,请先同步基础数据:交易日历。”stock_kline_daily_tdx_sample 仍使用 snapshot,因为当前日线轻量路径还没有稳定转换为正式 daily.trade_date 写入。

手动运行并等待结果:

.\.venv\Scripts\python -m axdata_core.cli collector task run stock_kline_daily_tdx_sample --wait --json

手动 run 可以只覆盖本次参数,不修改 task 定义:

.\.venv\Scripts\axdata collector task run daily_sample_tdx `
  --symbol 000001.SZ `
  --limit 20 `
  --wait `
  --json

这里的 daily_sample_tdx 是上面 collector task create-from-template daily 创建出的任务 id。若你没有创建模板任务,也可以直接运行默认可见的 stock_kline_daily_tdx_sample;TDX 采集器插件缺少或禁用时会生成失败 run,并提示安装/启用 axdata.collector.tdx

按日期区间补采:

.\.venv\Scripts\axdata collector task backfill daily_sample_tdx `
  --start 20240101 `
  --end 20240131 `
  --symbol 000001.SZ `
  --limit 20 `
  --wait `
  --json

查看任务、运行历史和汇总:

.\.venv\Scripts\python -m axdata_core.cli collector task list --json
.\.venv\Scripts\python -m axdata_core.cli collector run list --json
.\.venv\Scripts\python -m axdata_core.cli collector run info <run_id> --json
.\.venv\Scripts\python -m axdata_core.cli collector status --json

API 创建任务:

curl -X POST http://127.0.0.1:8666/v1/collector/tasks `
  -H "Content-Type: application/json" `
  -d "{\"collector_name\":\"tdx.stock_codes_tdx.snapshot\",\"task_id\":\"stock_codes_refresh\",\"trigger_type\":\"manual\",\"params\":{\"scope\":\"all\"},\"fields\":[\"instrument_id\",\"symbol\",\"tdx_code\",\"exchange\",\"name\",\"market\"],\"formats\":[\"parquet\"]}"

API 手动运行并查看状态:

curl -X POST http://127.0.0.1:8666/v1/collector/tasks/stock_codes_refresh/run `
  -H "Content-Type: application/json" `
  -d "{}"

curl http://127.0.0.1:8666/v1/collector/status
curl http://127.0.0.1:8666/v1/collector/runs
curl http://127.0.0.1:8666/v1/collector/runs/<run_id>
curl http://127.0.0.1:8666/v1/tasks/trade_cal_refresh/runs

输出路径会出现在 run 的 output_paths 字段中。失败信息在 error,跳过原因在 skip_reason,失败退避时间在 backoff_until。 task/run JSON 也会包含 status_messagenext_actionaction_command,用于提示 disabled、duplicate skip、 failure backoff、资源组等待和失败 run 的下一步排查命令。 任务状态还会显示 next_run_atlast_success_atlast_failure_atlast_error_summaryretry_countqueue_statuscan_run_nowblocked_reason 和本次 run 的 params_override。backfill run 会在 metadata.backfill_range 中记录 start/end。 新 run 还会记录 eventsstage_timingserror_categoryerror_summaryevents 是轻量时间线, 可看到 run 是否停在 queued、provider/profile 解析、下载、写文件、质量检查或 metadata 记录;stage_timings 会显示排队、Provider 解析、下载、写入、质量检查和总耗时,未执行阶段为 nullerror_category 会把常见失败归为 provider_missingplugin_disabledinvalid_paramsnetwork_errorupstream_emptyupstream_errorschema_mismatchwrite_failedstorage_permissionquality_failedbackoff_blocked 等类别,不能可靠判断时为 unknown。失败后先看 collector run info <run_id> --json 里的分类、事件和下一步动作,再决定改参数、启用插件、检查网络或修复输出目录。 quality_status=ok 表示本次 profile/schema 声明的基础检查通过;warn 表示有非阻塞提示,例如空结果或额外列;error 表示 required columns、主键或声明的数值范围有 blocking 问题。

Web 配置页的调度区域会展示同样的信息:task 模板、task 状态、trigger、resource_group、enabled/disabled、最近 run、run history、错误分类/摘要、stage timings、event timeline、qualityoutput_paths 和下一步动作。状态汇总使用最近窗口,同时返回完整 run 总数和状态计数;排查单次运行时进入 run detail。可以从可用模板创建任务,也可以对已有 task 提交手动运行或小范围 backfill;长路径和长命令会自动换行。

7. 真实源小样本检查

普通开发和 CI 的默认测试不请求真实网络。真实源小样本检查放在独立脚本里,必须显式启用:

.\.venv\Scripts\python scripts\smoke_real_sources.py --json
# 默认只输出 4 个核心表 skip,不请求网络。

.\.venv\Scripts\python scripts\smoke_real_sources.py --run `
  --output-dir $env:TEMP\axdata-real-source-smoke `
  --json

Web 配置页只展示真实源小样本检查的状态和推荐命令,不会自动运行真实网络检查。需要覆盖当前三项核心小样本时,在命令行显式运行:

.\.venv\Scripts\python scripts\smoke_real_sources.py --run `
  --interfaces stock_basic_exchange trade_cal daily `
  --output-dir $env:TEMP\axdata-real-source-smoke `
  --json

脚本当前示例覆盖三项核心小样本路径:

core 表源端接口当前链路
stock_basic_exchangestock_basic_info_exchange交易所源端取数小样本,写 core Parquet,再用 DuckDB 读回
trade_calstock_trade_calendar_exchange交易所源端取数日期范围,写 core Parquet,再用 DuckDB 读回
dailystock_kline_daily_tdx需要 TDX 插件;当前是显式小样本 smoke/core profile 路径,不是 core 兜底,也不是生产级全市场日线任务

第一批 source-only 接口不会进入默认目标。需要联网检查时必须显式指定接口名,例如:

.\.venv\Scripts\python scripts\smoke_real_sources.py --run `
  --interfaces tencent_realtime_snapshot `
  --output-dir $env:TEMP\axdata-real-source-smoke `
  --json

source-only 目标用于联网小样本检查,主路径仍以 Parquet 写出并用 DuckDB 读回;CSV/DuckDB 可以作为额外导出或缓存。旧 JSONL 只属于兼容下载/调试输出,不作为采集页主路径展示。当前可显式选择的第一批接口包括 stock_historical_list_exchangecninfo_announcementscninfo_announcement_detailtencent_realtime_snapshoteastmoney_dragon_tiger_dailyeastmoney_margin_tradingeastmoney_research_reportsstock_financial_report_sina;其中公告详情需要传入可访问的 --announcement-url

如果要检查 TDX 两项,先安装插件包;随项目提供的 TDX 包安装后默认可用:

.\.venv\Scripts\python -m pip install -e packages\axdata-source-tdx
.\.venv\Scripts\python scripts\smoke_real_sources.py --run `
  --output-dir $env:TEMP\axdata-real-source-smoke `
  --json

只跑 dailyadj_factor

.\.venv\Scripts\python scripts\smoke_real_sources.py --run `
  --interfaces daily adj_factor `
  --output-dir $env:TEMP\axdata-real-source-smoke `
  --json

--enable-provider 仍可用于临时覆盖 smoke 输出目录里的插件配置,但不会安装 Python 包;如果当前 .venv 没有 axdata-source-tdx entry point,TDX 两项仍会 skip 并提示安装。editable 本地开发安装和 wheel / .axp 安装都通过同一套 Registry 发现逻辑。

输出目录中可以直接查看:

data/core/table=<table>/.../*.parquet
snapshots/<run_id>/<interface>/parquet/*.parquet
snapshots/<run_id>/<interface>/csv/*.csv
snapshots/<run_id>/<interface>/duckdb/*.duckdb
metadata/real_source_smoke/<run_id>/summary.json

pass 表示真实源返回小样本、写出 Parquet、质量检查通过且 DuckDB 能读回;skip 会区分未安装、已安装但未启用、已发现但状态异常或未显式运行;fail 表示真实网络、上游、参数或限流等问题。真实源小样本检查是可选流程,不进入默认 pytest -q 的联网路径。

可选 pytest 入口默认跳过:

.\.venv\Scripts\python -m pytest tests\test_real_source_smoke.py -q
# 默认:离线 dry-skip 测试通过,真实源测试 skipped。

$env:AXDATA_RUN_REAL_SMOKE = "1"
.\.venv\Scripts\python -m pytest tests\test_real_source_smoke.py -q

8. AXP 本地插件安装

.axp 是本地安装信封,不是信任信封。它可以包含 Provider wheel、manifest、README、LICENSE、checksum 和依赖 wheels。

开发自己的插件前先读 plugin-development.md。AxData 只把带有 axdata-provider.jsonaxdata-plugin.json manifest 的 Python 包识别为 AxData 插件;缺少 manifest 的 entry point 会进入 doctor/status 诊断,不会出现在普通插件列表或插件统计里。

本地开发随项目提供的 TDX 插件时,最短路径是 editable 安装插件包并检查状态:

.\.venv\Scripts\python -m pip install -e packages\axdata-source-tdx
.\.venv\Scripts\axdata plugin list --json
.\.venv\Scripts\axdata doctor

预览:

.\.venv\Scripts\axdata plugin axp-preview C:\path\to\plugin.axp --json

离线安装,默认不启用:

.\.venv\Scripts\axdata plugin axp-install C:\path\to\plugin.axp --json

允许联网安装缺失依赖:

.\.venv\Scripts\axdata plugin axp-install C:\path\to\plugin.axp --allow-online-deps --json

安装后启用或禁用:

.\.venv\Scripts\axdata plugin enable axdata.source.example
.\.venv\Scripts\axdata plugin disable axdata.source.example
.\.venv\Scripts\axdata doctor
.\.venv\Scripts\axdata status

AXP checksum 只用于完整性和打包一致性检查,不证明作者身份、不证明代码安全、不授予内置权限。AxData 不做插件市场、中心审核或签名验签。默认安装只使用包内 dependency wheels 和当前 AxData 插件运行环境;缺 required dependency、版本不满足或冲突时会拒绝安装并给出提示。只有显式传入 --allow-online-deps 时,才允许 pip 从当前环境配置的索引安装缺失依赖。

9. 使用边界