Python License Stars
zer0share — A local data pipeline for Chinese A-share market.
Pulls data from Tushare Pro, stores as Parquet partitions,
queries via DuckDB, with incremental sync & APScheduler automation.
A-股数据本地化管道,基于 Tushare Pro 拉取股票数据,以 Parquet 分区存储,DuckDB 提供快速元数据查询,支持增量同步与定时调度。
- 核心数据同步:支持交易日历、股票基础信息、日线行情、复权因子、每日指标
daily_basic、每日停复牌信息(suspend_d)、每日涨跌停价(stk_limit)、ST 股票列表(stock_st) - 本地优先存储:Parquet 分区文件 + DuckDB 元数据,无需数据库服务
- Tushare-like 查询:本地
pro_api()直接返回 DataFrame,不消耗 Tushare 积分 - 复权行情:本地
pro_bar()支持不复权、前复权(qfq)和后复权(hfq) - 自动化运维:APScheduler 定时同步,支持企业微信失败告警
- Python 3.11+
- uv
- Tushare Pro Token(需积分 ≥ 2000)
git clone https://github.com/your-username/zer0share.git
cd zer0share
uv synccp config/settings.example.toml config/settings.toml编辑 config/settings.toml(路径、调度时间等)。Tushare Token 不要写入文件,请设置环境变量 TUSHARE_TOKEN:
PowerShell(当前会话)
$env:TUSHARE_TOKEN = "你的_token"cmd(当前窗口)
set TUSHARE_TOKEN=你的_token持久化可在「系统环境变量」里添加 TUSHARE_TOKEN,或写入你自己的启动脚本 / 任务计划(不要把 token 提交到 Git)。
可选:若需 PushPlus 推送同步告警(与企业微信独立),请设置环境变量 PUSHPLUS_TOKEN(勿写入 settings.toml)。未设置时不会调用 PushPlus。
# 一键同步全部(推荐)
uv run python main.py sync --all
# 或逐步执行(顺序不可颠倒)
uv run python main.py sync --table trade_cal # 交易日历(必须最先)
uv run python main.py sync --table stock_basic # 股票基础信息
uv run python main.py sync --table daily_kline # 日线行情(依赖交易日历)
uv run python main.py sync --table adj_factor # 复权因子(依赖交易日历)
uv run python main.py sync --table daily_basic # 每日指标(依赖交易日历,Tushare daily_basic)
uv run python main.py sync --table suspend_d # 每日停复牌(依赖交易日历,Tushare suspend_d)
uv run python main.py sync --table stk_limit # 每日涨跌停价(依赖交易日历,Tushare stk_limit)
uv run python main.py sync --table stock_st # ST 股票列表(依赖交易日历,Tushare stock_st)uv run python main.py statusuv run python main.py scheduler start同步完成后,可以在研究代码中使用类似 Tushare Pro 的本地 Python API 查询数据。查询只读取本地 Parquet 文件,通过 DuckDB 执行,不会访问 Tushare,也不会消耗积分。
from zer0share import pro_api
pro = pro_api()
stock_df = pro.stock_basic(list_status="L")
cal = pro.trade_cal(exchange="SSE", start_date="20240101", end_date="20240131")
daily = pro.daily(ts_code="000001.SZ", start_date="20240101", end_date="20240331")
adj = pro.adj_factor(ts_code="000001.SZ", start_date="20240101", end_date="20240331")
basic_daily = pro.daily_basic(ts_code="000001.SZ", start_date="20240101", end_date="20240331")
suspend = pro.suspend_d(trade_date="20240102", fields="ts_code,trade_date,suspend_timing,suspend_type")
limits = pro.stk_limit(ts_code="000001.SZ", start_date="20240101", end_date="20240331")
st_list = pro.stock_st(trade_date="20240102", fields="ts_code,name,trade_date,type,type_name")
qfq = pro.pro_bar(
ts_code="000001.SZ",
start_date="20240101",
end_date="20240331",
adj="qfq",
)支持的本地查询方法:
| 方法 | 说明 |
|---|---|
stock_basic |
查询已同步的股票基础信息 |
trade_cal |
查询已同步的交易日历 |
daily |
查询已同步的 A 股日线行情 |
adj_factor |
查询已同步的复权因子 |
daily_basic |
查询已同步的每日指标(换手、估值、市值等) |
suspend_d |
查询已同步的每日停复牌记录(suspend_type:S 停牌 / R 复牌;可选 suspend_type= 筛选) |
stk_limit |
查询已同步的每日涨跌停价(昨收、涨停价、跌停价) |
stock_st |
查询已同步的 ST 股票列表(按交易日,ts_code、name、type 等) |
pro_bar |
查询本地 A 股日线行情,支持不复权、前复权(qfq)和后复权(hfq) |
query |
按接口名分发,例如 pro.query("daily", ...) |
运行示例:
uv run python examples/local_query_api_smoke.pydata/
├── trade_cal/
│ ├── exchange=SSE/data.parquet
│ ├── exchange=SZSE/data.parquet
│ └── ... # CFFEX / SHFE / CZCE / DCE / INE
├── stock_basic/
│ └── data.parquet # 对应 Tushare stock_basic 全量镜像
├── daily_kline/
│ ├── date=20160104/data.parquet
│ ├── date=20160105/data.parquet
│ └── ...
├── adj_factor/
│ ├── date=20160104/data.parquet
│ ├── date=20160105/data.parquet
│ └── ...
├── daily_basic/ # Tushare daily_basic:每日基本面指标
│ ├── date=20160104/data.parquet
│ └── ...
├── suspend_d/ # Tushare suspend_d:每日停复牌
│ ├── date=20160104/data.parquet
│ └── ...
├── stk_limit/ # Tushare stk_limit:每日涨停价、跌停价
│ ├── date=20160104/data.parquet
│ └── ...
└── stock_st/ # Tushare stock_st:每日 ST/*ST 列表
├── date=20160104/data.parquet
└── ...
db/
└── meta.duckdb # 同步记录 + 交易日历索引
| 命令 | 说明 |
|---|---|
sync --table trade_cal |
同步交易日历(7 个交易所) |
sync --table stock_basic |
同步股票基础信息 |
sync --table daily_kline |
增量同步日线行情 |
sync --table adj_factor |
增量同步复权因子 |
sync --table daily_basic |
增量同步每日指标(Tushare daily_basic) |
sync --table suspend_d |
增量同步每日停复牌(Tushare suspend_d) |
sync --table stk_limit |
增量同步每日涨跌停价(Tushare stk_limit) |
sync --table stock_st |
增量同步 ST 股票列表(Tushare stock_st) |
sync --all |
按顺序同步全部 |
status |
查看各表最后同步时间 |
scheduler start |
启动定时调度 |
[paths]
data_dir = "data" # Parquet 存储目录
db_path = "db/meta.duckdb" # DuckDB 文件路径
log_path = "logs/pipeline.log"
[scheduler]
daily_kline_hour = 18 # 日线同步触发时间(小时)
daily_kline_minute = 0
basic_hour = 8 # 基础信息同步触发时间(小时)
adj_factor_hour = 18 # 复权因子同步触发时间(小时)
adj_factor_minute = 5
# stk_limit_hour = 18 # 可选,默认 18;每日涨跌停价
# stk_limit_minute = 10 # 可选,默认 10
# stock_st_hour = 18 # 可选,默认 18;ST 列表(官方约交易日 09:20 更新)
# stock_st_minute = 15 # 可选,默认 15
# daily_basic_hour = 18 # 可选,默认 18;每日指标(官方约交易日 15:00~17:00 更新)
# daily_basic_minute = 20 # 可选,默认 20
# suspend_d_hour = 18 # 可选,默认 18;每日停复牌(官方更新不定期)
# suspend_d_minute = 25 # 可选,默认 25
[notifier]
wecom_webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
enabled = false # 填写真实 webhook_url 后改为 true# 安装开发依赖
uv sync --dev
# 运行测试
uv run pytest
# 运行单个测试文件
uv run pytest tests/test_pipeline.py -vsrc/
├── config.py # 配置加载
├── api.py # 本地 Tushare-like 查询 API
├── fetcher.py # Tushare API 封装
├── storage.py # Parquet 读写 + DuckDB MetaStore
├── pipeline.py # 同步业务逻辑
├── scheduler.py # APScheduler 定时任务
├── notifier.py # 企业微信 Webhook + 可选 PushPlus(PUSHPLUS_TOKEN)
└── cli.py # Click CLI 入口
tests/ # pytest 测试套件
examples/ # 本地查询 API 示例
config/
└── settings.example.toml
MIT