Agent-ready A-share market and research data SDK with DuckDB, Tushare, iFinD, optional MinIO, REST and MCP.
Project description
n-ashare-market
面向程序与 Agent 的 A 股市场数据 SDK。当前版本提供:
- Tushare 历史日线:
none / qfq / hfq; - iFinD
THS_RQ实时行情快照; - Insight 历史 tick 与
1/5/15/30/60minK 线; - Insight 实时 tick/1min 单会话订阅与 SSE;
- 完整覆盖旧
ashare-history-system的 41 个数据集与 8 个引用表; - 在旧范围之上额外提供财务报表、Insight 1min/tick 和实时能力;
- DuckDB 本地高速查询;MinIO raw/curated Parquet、覆盖清单、实时归档和带鉴权的外部下载可选;
- MinIO 实时小对象安全 compact;
- 本地/远程 Python SDK;
- FastAPI REST/OpenAPI;
- MCP tools/resources;
- 支持 NDJSON 分批消费,并提供来源、新鲜度和覆盖度元数据。
Insight 使用独立 Python 3.10 subprocess bridge,主 SDK 保持 Python 3.11+。
1. 架构
Tushare history ─┐
iFinD snapshot ──┼─ MarketDataService ─ normalization ─ DuckDB query store
Insight bridge ──┘ └────────── optional MinIO replica/artifacts
│
├─ Python SDK
├─ REST / OpenAPI
├─ CLI
└─ MCP Server
DuckDB 是查询优先的本地存储;MinIO 是可选的共享持久化和分发层,不承担实时消息总线职责。实时请求先由 iFinD 返回给调用方,再按配置归档到 DuckDB/MinIO。
详细设计见 docs/architecture.md,数据目录和全量重建见 docs/research.md,旧系统逐项覆盖见 docs/legacy-coverage.md。
2. 安装
Python 需要 3.11 或更高版本。
cd ashare-market-sdk
python -m venv .venv
. .venv/bin/activate
pip install -e .
cp .env.example .env
从 PyPI 安装发布版本:
pip install n-ashare-market
从 Git 仓库安装 Python SDK
仓库发布后,客户端不需要复制源码。推荐打 tag 后固定版本安装:
pip install "n-ashare-market @ git+https://gitlab.thoughtyard.com.cn/aion/ashare-market-sdk.git@v0.5.13"
私有仓库建议使用已经配置好的 SSH key,避免把访问 token 写入命令或日志:
pip install "n-ashare-market @ git+ssh://git@gitlab.thoughtyard.com.cn/aion/ashare-market-sdk.git@v0.5.13"
如果以后把它放在一个 monorepo 的 ashare-market-sdk/ 子目录,则使用:
pip install "n-ashare-market @ git+https://gitlab.example.com/YOUR_ORG/YOUR_REPO.git@v0.5.13#subdirectory=ashare-market-sdk"
安装后验证命令是否在 PATH(这一步由部署人员执行):
ashare-market --help
iFinD 的官方 iFinDAPI==0.0.8 已作为运行依赖安装,并提供 iFinDPy 模块。运行 REST/MCP 的 Python 环境必须能够执行:
import iFinDPy
Linux 版还依赖原生动态库。Docker 镜像会安装 libidn.so.11、libgcc、libstdc++、zlib、ncurses,
并把 SDK bin64 加入动态库搜索路径;构建最后会对 libShellExport.so、libFTDataInterface.so 和
libhcrypt-3.1.so 执行 ldd 检查,缺失依赖会直接终止构建。/health 与 /v1/sync/status 的
providers.ifind.sdk 会返回 loadable、missing_libraries、missing_files、Python 位数和机器架构。
非 Docker 环境必须按照同花顺 Linux 部署文档补齐 ldd 中的 not found 项,并确保 SDK bin64 位于
LD_LIBRARY_PATH。如果登录返回 -340,需要开通官方接口域名/IP 白名单或配置
bin64/Tool/etc/system_setting.ini 代理。
Docker 服务镜像会从 PyPI 下载并校验官方 insight-python-linux==5.2.0。该 SDK 的 Linux 原生扩展
最高只支持 Python 3.10,因此镜像内置隔离的 Python 3.10 bridge 运行时,主服务仍使用 Python 3.11。
直接从 PyPI 安装本项目且需要 Insight 分钟线或实时订阅时,先准备独立的 Python 3.10 环境:
pip install n-ashare-market
python3.10 -m venv /opt/ashare-insight
/opt/ashare-insight/bin/pip install 'pandas>=2.2,<3' 'pyarrow>=18,<23'
ashare-market-install-insight --python /opt/ashare-insight/bin/python
非 Docker 环境还需要把 bridge 指向上述解释器:
ASHARE_MARKET_INSIGHT_USERNAME=...
ASHARE_MARKET_INSIGHT_PASSWORD=...
ASHARE_MARKET_INSIGHT_PYTHON=/opt/ashare-insight/bin/python
桥接部署细节见 docs/insight.md。
然后在 .env 中配置:
ASHARE_MARKET_TUSHARE_TOKEN=...
ASHARE_MARKET_IFIND_USERNAME=...
ASHARE_MARKET_IFIND_PASSWORD=...
不要把真实 token、用户名或密码提交到仓库。
3. 启动 MinIO
docker compose -f deploy/docker-compose.minio.yml up -d
ashare-market ensure-buckets
默认地址:
- S3 API:
http://127.0.0.1:9000 - Console:
http://127.0.0.1:9001
ensure-buckets 会创建并启用版本控制:
ashare-curatedashare-rawashare-realtimeashare-artifactsashare-catalog
一键启动完整服务
配置好 .env 后,一条命令启动 REST API、Streamable HTTP MCP、历史同步和实时监督器。DuckDB 模式要求先为
ASHARE_MARKET_DEPLOY_TOKEN 配置长随机值;deploy/start.sh 会启动独立同步容器、蓝绿只读容器和固定 Nginx 网关:
./deploy/start.sh
停止服务:
./deploy/stop.sh
不使用 Docker 时可直接运行(minio/hybrid 模式才需要先启动 MinIO):
ashare-market serve --host 0.0.0.0 --port 8020
启动完成后,REST 地址为 http://<服务器>:8020,MCP 地址为
http://<服务器>:8020/mcp。ashare-sync 是唯一 DuckDB 写入者,运行 10 个同步 worker、同步游标和行情会话;
ashare-blue、ashare-green 只读取已发布快照,Nginx 健康检查通过后无损重载到备用颜色,再排空旧连接。
同步状态、跟踪配置、同步命令和实时会话由网关转发到 ashare-sync,因此更新只读 API 不会重启同步任务。
同步程序需要更新时单独执行 ./deploy/update-sync.sh,历史读取仍由当前颜色持续提供。
需要让历史查询读取刚同步完成的数据时执行:
./deploy/publish-data.sh
发布脚本在同步容器内创建一致性 DuckDB/SQLite 快照,启动备用只读容器并切流;查询服务始终可用。实时行情接口直接由
ashare-sync 提供,不等待历史快照发布。第一次从旧单容器目录迁移时,脚本会拒绝复制仍在写入的 DuckDB;这次基础架构
迁移需要先停止旧容器,后续代码部署和数据快照发布均不再中断读取服务。
默认自动同步注册表中的全部历史/引用数据集,并额外纳入 daily_raw、weekly 和分钟数据集。有历史起点的数据集优先从默认起点断点补齐到当前目标日,不会在全量 coverage 闭合前强制刷新最近5天;不传同步日期就是全量同步。监督器目标、THS 游标和回补任务持久化在 DuckDB,重启从第一个未覆盖 chunk 恢复。同一目标日期已经完成后不会重复同步。查询和回测导出不会改变同步范围,只按照各自请求的 start_date/end_date/lookback_bars 读取本地数据。必须携带代码的 Provider 接口会分别从 stock_basic、index_basic 自动推导股票和指数全集;ETF 使用 fund_daily 按交易日批量提取全市场。跟踪库只用于可选的范围缩小。之后服务按照官方数据发布时间和交易日历持续刷新。实时订阅只有在
ASHARE_MARKET_RUNTIME_REALTIME_SYMBOLS 明确配置股票列表时才启用。运行状态可通过
GET /v1/runtime 查看;同步任务统一后的 progress.scanned/progress.total 扫描进度和
coverage_percent 覆盖率通过 GET /v1/sync/status 查看;容器同步日志可通过
docker compose --project-directory . -f deploy/docker-compose.blue-green.yml logs -f ashare-sync 跟踪。
状态响应包含 service_version 和 status_schema_version=3.4;queue 会显示当前优先阶段、尚未完成的
important 数据集、被阶段屏障阻塞的普通数据集、同步 worker 数、每个数据集的分块并发、每个分块的 Provider
请求并发、最大在途请求数、每分钟请求上限、当前分钟已用/剩余额度、窗口起止时间和限流模式。
同步严格分为 important 和 normal 两个阶段;important 未全部完成时普通任务不会进入执行队列。每个回补切片内
的全部未覆盖分块会提交到有界线程池并行获取,仍由全局 400 次/分钟限流器统一控制。
股票日线直接使用 Tushare daily 和 adj_factor 接口完成复权及 MA 计算,不再依赖 pro_bar 的内部空值处理。
DuckDB 查询、结果读取和写入在同一连接锁内完整执行;Provider 仍并行获取,但数据库提交串行,避免并发线程覆盖
pending result。运行状态接口直接在 API event loop 返回内存快照,不再等待同步接口的线程池额度。
每个数据集的 cursor 会返回本轮恢复位置和下一个批次/日期窗口;游标随 coverage 一起持久化,重启或下一切片不再从
第 0 批重复扫描。dataset_groups 同时列出重要、已完成、未开始、未完成和跳过的数据集。
trade_cal 每次默认同步当前自然年的 01-01..12-31,包含尚未到来的交易日安排。股票日线的有效全量起点为
1990-12-19,stk_limit 按 Tushare 的可用历史从 2007-01-01 开始。状态中的 phase/sync_scope 明确区分
recent_refresh 与 full_backfill;refresh_start_date/refresh_end_date 仅用于没有默认全量范围的数据集,
full_history_start_date/full_history_end_date 才是历史回补范围,current_start_date/current_end_date 只在当前 chunk 执行期间有值,完成后会清空。全量 coverage 未闭合时状态为 partial/failed,不会再用 rows=0 冒充同步完成。
无日期的 ths_member 快照会按 ASHARE_MARKET_RUNTIME_REFERENCE_BATCH_SIZE 个概念代码分批刷新,避免单次全量 Provider 请求阻塞其他数据集。
需要代码的自动同步默认从基础代码表推导全集;独立 SQLite 跟踪库用于按需缩小范围,默认位于 ASHARE_MARKET_TRACKING_DB_PATH。记录以
dataset + symbol 为主键,可以为同一股票选择不同的数据集和不同历史起点:
ashare-market track-add income 002436.SZ --start 2018-01-01
ashare-market track-add balancesheet 002436.SZ --start 2018-01-01
ashare-market track-list --dataset income
ashare-market track-update income 002436.SZ --enabled false
ashare-market track-delete income 002436.SZ
也可通过 REST、Python SDK 或 MCP 工具维护;启用的记录会在后续自动同步周期按所属 dataset 拉取,不会影响其他数据集的股票范围。
4. Python SDK
本地模式
本地模式在当前 Python 进程中直接调用 Tushare、iFinD 和存储后端。将
ASHARE_MARKET_STORAGE_BACKEND=duckdb 后,查询直接读本机 ASHARE_MARKET_DUCKDB_PATH,不经过 HTTP,也不连接 MinIO;
hybrid 会在 DuckDB 未覆盖时从 MinIO 回源并自动写入 DuckDB。
生产推荐先使用 hybrid 预热已有 MinIO 数据,确认本地库覆盖完整后再切换为 duckdb:
ASHARE_MARKET_STORAGE_BACKEND=hybrid
ASHARE_MARKET_DUCKDB_PATH=/data/ashare/ashare-market.duckdb
ASHARE_MARKET_DUCKDB_THREADS=32
ASHARE_MARKET_DUCKDB_MEMORY_LIMIT=32GB
服务端 HTTP 仍返回 JSON,数据扫描由 DuckDB 在进程内完成;主服务同机的 ashare-market ... CLI 直接复用同一 DuckDB 文件。
from ashare_market import AshareMarketClient
with AshareMarketClient() as client:
bars = client.history.daily(
["000001.SZ", "600000.SH"],
"2025-01-01",
"2025-03-31",
adjustment="qfq",
cache_policy="cache_first",
)
print(bars.dataframe)
print(bars.meta)
# 大结果直接逐批进入策略,不创建或下载文件。
for chunk in client.history.stream_daily(
["000001.SZ", "600000.SH"],
"2020-01-01",
"2025-01-01",
chunk_rows=2000,
):
strategy.consume(chunk)
# 不传 symbols 时使用本地 stock_basic 股票池读取当日截面。
daily_snapshot = client.history.snapshot("2026-07-17")
factor_snapshot = client.research.snapshot("daily_basic", "2026-07-17")
# 标准化前的 Tushare pro_bar 原始字段。
raw_bars = client.history.raw_daily(
"000001.SZ",
"2025-01-01",
"2025-01-31",
)
quotes = client.realtime.quotes(["000001.SZ", "600000.SH"])
print(quotes.dataframe)
artifact = client.history.export_daily(
"000001.SZ",
"2020-01-01",
"2025-01-01",
file_format="parquet",
)
print(artifact["download_url"])
client.download_artifact(artifact, "daily.parquet")
minute = client.history.minutes(
"000001.SZ",
"2026-07-16 09:30:00+08:00",
"2026-07-16 15:00:00+08:00",
frequency="5min",
adjustment="qfq",
)
ticks = client.history.ticks(
"000001.SZ",
"2026-07-16 09:30:00+08:00",
"2026-07-16 10:00:00+08:00",
)
indicators = client.research.query(
"fina_indicator",
symbols="000001.SZ",
start_date="2024-01-01",
end_date="2026-07-17",
)
# reference 数据集不需要日期,使用 TTL 缓存。
stocks = client.research.query("stock_basic")
远程模式
from ashare_market import AshareMarketClient
with AshareMarketClient(
base_url="http://127.0.0.1:8020",
api_key="your-api-key",
) as client:
bars = client.history.daily("000001.SZ", "2025-01-01", "2025-01-31")
index_bars = client.research.query(
"index_daily",
symbols="000300.SH",
start_date="2025-01-01",
end_date="2025-01-31",
)
# 一次生成回测窗口需要的三张完整 Parquet;不再把全市场拆成上千次 JSON 请求。
bundle = client.backtests.export(
["000001.SZ", "600000.SH"],
"2026-07-01",
"2026-07-17",
lookback_bars=120,
)
for dataset, artifact in bundle["datasets"].items():
client.download_artifact(artifact, f"{dataset}.parquet")
远程 history.daily()、history.intraday() 和 research.query() 统一通过 NDJSON 流取得完整数据并组装成
MarketFrame,不会自动创建或下载 artifact。策略需要控制内存时直接使用 stream_daily()、
stream_intraday() 或 research.stream(),每次消费一个 DataFrame 批次。只有显式调用 export_*
或 backtests.export() 时才创建文件。
SDK 主服务应该在哪里运行
生产环境推荐在一台常驻 Linux 数据服务器上运行单实例 REST 服务和 MCP 服务。Tushare、iFinD、
Insight 与 MinIO 凭证只放在服务器;研究终端、策略程序和 Agent 只安装 Python 包并使用上面的
base_url 远程模式。这样缓存、额度控制、Insight 会话和审计口径只有一份。
- REST 主服务使用单 Uvicorn worker;当前 Insight session 状态在进程内,多 worker 会产生多个互不共享的会话。
- MCP stdio 可运行在 Agent 所在机器并通过远程 Python SDK/REST 访问主服务;受信任环境也可直接在数据服务器运行 MCP。
- MinIO 开发时可以同机,生产建议独立磁盘或独立节点,并备份 catalog bucket。
- 只有单机研究或开发场景才建议本地模式;它会让每个客户端分别持有 Provider 登录和频次。
systemd 示例见 deploy/ashare-market.service.example,完整运维说明见 docs/operations.md。
缓存策略
| 策略 | 行为 |
|---|---|
cache_only |
只读 MinIO,不调用 Provider;允许返回部分覆盖 |
cache_first |
coverage commit 完整时读 MinIO,否则从 Tushare 刷新并写 MinIO |
refresh |
强制从 Tushare 获取,并发布新的不可变对象和 commit |
direct |
直接从 Tushare 获取,不读写 MinIO |
5. REST / OpenAPI
ashare-market api --host 127.0.0.1 --port 8020
- OpenAPI:
https://ashare-data.thoughtyard.com.cn/docs GET /health:只显示配置能力,不登录 Provider;GET /ready:连接 MinIO 并确保 bucket 存在;GET /v1/datasets;GET /v1/datasets/{name}/schema;GET /v1/compatibility/ashare-history-system;GET /v1/runtime:同步、紧凑化和实时状态;GET /v1/sync/status:worker/队列摘要、数据集分组、完整进度与错误列表;?include_completed=false只显示未完成项,?verbose=true返回原始诊断状态;GET/POST/PATCH/DELETE /v1/tracking/symbols:维护按数据集隔离的自动同步代码;GET /v1/artifacts/{object_name}:经 REST 同源鉴权下载真实对象;POST /v1/history/daily;POST /v1/history/daily/stream:按批流式返回完整日线;POST /v1/history/daily-raw;POST /v1/history/daily-raw/stream:按批流式返回原始日线;POST /v1/history/daily/export:提交异步 daily Parquet 导出任务,立即返回 job id;POST /v1/backtests/export:提交异步daily/daily_basic/stk_limit完整 Parquet bundle;GET /v1/exports/jobs/{job_id}:查询任务进度并在完成后取得 artifact;POST /v1/realtime/quotes;POST /v1/coverage/daily。POST /v1/coverage/daily-raw;POST /v1/history/intraday;POST /v1/history/intraday/stream:按批流式返回分钟或 tick 历史;POST /v1/coverage/intraday;POST /v1/realtime/sessions;GET /v1/realtime/sessions/{id}/events;GET /v1/realtime/sessions/{id}/stream;POST /v1/realtime/compact。GET /v1/research/datasets;POST /v1/research/query;POST /v1/research/query/stream:按批流式返回完整研究数据;POST /v1/research/coverage;POST /v1/research/sync。POST /v1/datasets/sync(通用别名)。
服务升级后的首次启动会在同步 worker 启动前使用 DuckDB 现有 OHLCV 修复缺失的
ma5/ma10/ma20/ma30/ma60/ma250 与成交量均线。修复不调用 Provider,结果可在
/v1/sync/status 的 runtime.daily_ma_repair 查看;完成后写入版本标记,后续重启不会重复全库计算。
日线示例:
curl -X POST https://ashare-data.thoughtyard.com.cn/v1/history/daily \
-H 'Content-Type: application/json' \
-H 'X-API-Key: your-api-key' \
-d '{
"symbols":["000001.SZ"],
"start_date":"2025-01-01",
"end_date":"2025-01-31",
"adjustment":"qfq",
"cache_policy":"cache_first"
}'
普通 JSON 接口仍受 ASHARE_MARKET_API_MAX_ROWS 限制,但不会隐式创建 artifact;reference 数据集(例如
trade_cal、stock_basic)的内联阈值由 ASHARE_MARKET_API_INLINE_REFERENCE_MAX_ROWS 控制。
Python SDK 使用对应 /stream 接口取得完整结果,流中先返回 meta,再按 chunk_rows 返回数据批次。
只有显式导出时才会返回文件链接。
ASHARE_MARKET_PUBLIC_BASE_URL 配置后,meta.artifact.download_url 是外部可达的 REST URL;未配置时返回
/v1/artifacts/... 相对路径,不再暴露容器内的 minio:9000。
为什么数据目录里只有 xl.meta
deploy/data 是 MinIO 的私有 XL 后端目录,不是普通文件导出目录。一个逻辑上的 .parquet S3 对象在磁盘上会表现为
同名目录和 xl.meta,小对象还可能直接内联在元数据中;因此不能对该目录直接运行 parquet-tools。应从 MinIO Console、
S3/mc 或上述 REST artifact 接口下载对象后再检查,例如:
parquet-tools inspect daily.parquet
新写 EOD 数据按“请求批次 + 交易日”合并成 symbol_bucket=all;后台还会从最近月份向历史月份逐月生成活跃紧凑快照。
旧 hash 小对象暂不物理删除,读取会在紧凑快照更新后自动跳过它们,便于回滚和后续按生命周期安全清理。
6. MCP / Agent
stdio 模式:
ashare-market mcp --transport stdio
Streamable HTTP 随 REST 服务一起启动:
ashare-market serve --host 0.0.0.0 --port 8020
客户端连接 http://<服务器>:8020/mcp。配置 ASHARE_MARKET_API_KEY 后,REST 与 MCP 都要求相同的
X-API-Key;对外暴露时仍应通过反向代理配置 TLS。
可用工具:
market_list_datasetsmarket_get_schemamarket_get_legacy_coveragemarket_get_realtime_quotesmarket_get_daily_barsmarket_get_raw_daily_barsmarket_get_raw_daily_coveragemarket_get_daily_coveragemarket_create_daily_exportmarket_create_backtest_exportmarket_get_export_jobmarket_get_minute_barsmarket_get_tick_historymarket_get_intraday_coveragemarket_create_intraday_exportmarket_start_insight_sessionmarket_get_insight_sessionmarket_get_insight_eventsmarket_stop_insight_sessionmarket_compact_realtimemarket_list_research_datasetsmarket_query_researchmarket_get_research_coveragemarket_create_research_exportmarket_sync_research_datasetmarket_sync_dataset
可用 resources:
ashare://datasets/catalogashare://datasets/{dataset}/schemaashare://research/catalogashare://compatibility/ashare-history-system
通用 stdio MCP 配置示例:
{
"mcpServers": {
"ashare-market": {
"command": "/absolute/path/to/ashare-market-sdk/.venv/bin/ashare-market-mcp",
"env": {
"ASHARE_MARKET_MINIO_ENDPOINT": "127.0.0.1:9000"
}
}
}
}
凭证应配置在服务器的 .env 或密钥系统中,不要复制到 Agent prompt 或 MCP tool 参数里。
7. CLI
ashare-market datasets
ashare-market legacy-coverage
ashare-market daily --symbols 000001.SZ --start 2025-01-01 --end 2025-01-31
ashare-market quotes --symbols 000001.SZ,600000.SH
ashare-market coverage --symbols 000001.SZ --start 2025-01-01 --end 2025-01-31
ashare-market daily --symbols 000001.SZ --start 2020-01-01 --end 2025-01-01 --export parquet
ashare-market intraday --symbols 000001.SZ \
--start '2026-07-16 09:30:00+08:00' --end '2026-07-16 15:00:00+08:00' \
--kind 5min --adjustment qfq
# 实时 session 由常驻 API 服务持有;CLI 通过 REST 操作它。
ashare-market --base-url http://127.0.0.1:8020 stream-start \
--symbols 000001.SZ,600000.SH --tick --kline
ashare-market --base-url http://127.0.0.1:8020 stream-sessions
ashare-market --base-url http://127.0.0.1:8020 stream-events SESSION_ID --after 0
ashare-market --base-url http://127.0.0.1:8020 stream-stop SESSION_ID
ashare-market compact-realtime --dataset tick --trade-date 2026-07-17
ashare-market research-list
ashare-market research fina_indicator --symbols 000001.SZ \
--start 2024-01-01 --end 2026-07-17
# 默认按 coverage 断点续跑;不传日期时使用数据集默认全量起点。
ashare-market research-sync daily_basic
ashare-market research-sync income --start 2010-01-01 --end 2026-07-17
# `sync` 是面向全部注册数据集的等价短命令。
ashare-market sync daily
ashare-market sync weekly
ashare-market sync etf_daily --symbols 510300.SH,159915.SZ
ashare-market sync index_daily --symbols 000300.SH
ashare-market sync kline_5min --symbols 000001.SZ --start 2026-01-01 --end 2026-07-17
8. 当前边界
- 股票、ETF、指数和概念/行业代码型行情要求明确代码列表;全市场日频与事件表支持按日期分块同步。
- MinIO catalog 采用不可变 JSON commit,并有 TTL 索引缓存和有界并发读取;更大规模部署仍可引入数据库或 Iceberg catalog。
- iFinD 实时快照为请求式
THS_RQ;推送式 tick/1min 由 Insight 提供。 - 当前实时 manager 状态保存在 API 进程内,API 重启后需重新创建 session;已归档数据不受影响。
- EOD 旧小对象由后台按月紧凑,无需从 Provider 重抓;物理清理旧版本仍由运维生命周期策略控制。
- 已覆盖旧系统全部 41+8 数据;基金范围目前仅包含旧系统已有的场内 ETF 日线,不扩展债券、期货、宏观和海外市场。
- MinIO 内数据的共享范围必须符合 Tushare、iFinD 和 Insight 的账户授权与再分发条款。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters