Skip to content

WangYiShion/zer0share

 
 

Repository files navigation

zer0share

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)

快速开始

1. 克隆并安装依赖

git clone https://github.com/your-username/zer0share.git
cd zer0share
uv sync

2. 配置

cp 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。

3. 首次同步

# 一键同步全部(推荐)
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)

4. 查看同步状态

uv run python main.py status

5. 启动定时调度

uv run python main.py scheduler start

本地查询 API

同步完成后,可以在研究代码中使用类似 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_typeS 停牌 / R 复牌;可选 suspend_type= 筛选)
stk_limit 查询已同步的每日涨跌停价(昨收、涨停价、跌停价)
stock_st 查询已同步的 ST 股票列表(按交易日,ts_codenametype 等)
pro_bar 查询本地 A 股日线行情,支持不复权、前复权(qfq)和后复权(hfq)
query 按接口名分发,例如 pro.query("daily", ...)

运行示例:

uv run python examples/local_query_api_smoke.py

数据存储结构

data/
├── 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                      # 同步记录 + 交易日历索引

CLI 命令

命令 说明
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 -v

项目结构

src/
├── 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

License

MIT

About

A-股本地数据管道 | Tushare + DuckDB + Parquet,支持日线/复权因子增量同步与定时调度

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 100.0%