2026-05-12 18:33:41 +08:00
2026-05-12 18:33:41 +08:00
2026-05-10 00:35:59 +08:00
2026-05-10 00:35:59 +08:00
2026-05-10 12:11:49 +08:00
2026-05-10 12:11:49 +08:00
2026-05-12 00:29:52 +08:00
2026-05-10 00:35:59 +08:00

ashare-data

A股数据抓取工具,使用 BaoStock 获取数据,保存到 MySQL 数据库。

功能概览

数据类型 说明 数据来源
股票列表 沪深A股代码、名称、上市日期 BaoStock
交易日历 1990年至今的交易日列表 BaoStock
日线行情 开高低收、成交量/额、振幅、涨跌幅、换手率(前复权) BaoStock
指数日线 上证/深证/创业板等主要指数日线 BaoStock
涨跌停统计 每日主板/科创板/创业板涨跌停数量 stock_daily 汇总
季频财务指标 盈利能力、偿债能力、现金流(最近8个季度) BaoStock
分红送转 每10股送转、派息、除权除息日(最近10年) BaoStock
分时行情 5/15/30/60分钟K线(开高低收、成交量/额) BaoStock
行业+地域分类 证监会行业分类 + 省份 BaoStock + 东方财富

已知限制BaoStock 不含北交所(920xxx)股票。

快速开始

1. 环境要求

  • Python >= 3.10
  • MySQL >= 8.0

2. 安装依赖

pip install baostock pymysql sqlalchemy pyyaml pandas

3. 配置数据库

复制配置文件并修改 MySQL 连接信息:

cp config.example.yaml config.yaml

编辑 config.yaml

mysql:
  host: "localhost"
  port: 3306
  user: "root"
  password: "your_password"
  database: "ashare"
  charset: "utf8mb4"

fetch:
  delay: 0.1    # 请求间隔(秒)
  retry: 2      # 失败重试次数
  workers: 1    # 并发线程数

确保 MySQL 中已创建对应数据库:

CREATE DATABASE ashare CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

4. 运行

# 1. 先抓取股票列表(其他模块依赖此数据)
python -m src.main --stock-info

# 2. 抓取交易日历(覆盖全历史,只需执行一次;此后每年末执行一次延长至未来)
python -m src.main --trading-day --start-date 19901219 --end-date 20261231

# 3. 抓取全历史日线行情(首次,耗时较长)
python -m src.main --daily --start-date 19901201 --end-date 20260511

# 4. 日常增量更新日线(默认最近30天)
python -m src.main --daily

# 抓取指数日线
python -m src.main --index

# 抓取指数日线(指定日期范围)
python -m src.main --index --start-date 19901219 --end-date 20260511

# 汇总涨跌停统计(依赖 stock_daily 数据)
python -m src.main --market-daily

# 汇总涨跌停统计(指定日期范围)
python -m src.main --market-daily --start-date 20260101 --end-date 20260511

# 抓取财务指标(全部股票,最近8个季度)
python -m src.main --financial

# 抓取单只股票的财务数据
python -m src.main --financial --symbol 000001

# 抓取分红送转(全部股票,最近10年)
python -m src.main --dividend

# 抓取单只股票的分红
python -m src.main --dividend --symbol 000001

# 抓取分钟K线(默认5分钟)
python -m src.main --intraday --start-date 20260101

# 抓取全部频率分钟K线
python -m src.main --intraday --freq all --start-date 20260508

# 抓取行业+地域分类
python -m src.main --sector

5. 命令行参数说明

选项:
  --stock-info       抓取A股股票列表
  --trading-day      抓取交易日历
  --daily            抓取日线行情(增量,已完整自动跳过)
  --index            抓取主要指数日线
  --market-daily     汇总每日涨跌停统计(从 stock_daily 聚合)
  --financial        抓取季频财务指标
  --dividend         抓取分红送转数据
  --intraday         抓取分钟K线行情
  --freq             K线频率: 5/15/30/60/all(默认5
  --sector           抓取行业+地域分类
  --industry-only    仅抓取行业分类
  --region-only      仅抓取地域分类

日期过滤(对日线行情、交易日历、分钟K线、指数、涨跌停统计生效):
  --start-date       开始日期,格式 YYYYMMDD
  --end-date         结束日期,格式 YYYYMMDD

股票过滤(对财务指标、分红送转、分钟K线生效):
  --symbol           指定单只股票代码,如 000001,默认全部股票

数据库表结构

stock_info — 股票基本信息

字段 类型 说明
code VARCHAR(10) PK 股票代码
name VARCHAR(50) 股票名称
ipo_date DATE 上市日期

stock_daily — 日线行情(前复权)

字段 类型 说明
code VARCHAR(10) 股票代码
date DATE 交易日期
open FLOAT 开盘价
close FLOAT 收盘价
high FLOAT 最高价
low FLOAT 最低价
volume FLOAT 成交量
turnover FLOAT 成交额
amplitude FLOAT 振幅%
pct_change FLOAT 涨跌幅%
change FLOAT 涨跌额
turnover_rate FLOAT 换手率%

联合主键:(code, date)

stock_financial_income — 季频盈利能力

字段 类型 说明
code VARCHAR(10) 股票代码
report_date VARCHAR(20) 报告期
data TEXT JSON格式数据(ROE、净利率、毛利率等)

联合主键:(code, report_date)

stock_financial_balance — 季频偿债能力

字段 类型 说明
code VARCHAR(10) 股票代码
report_date VARCHAR(20) 报告期
data TEXT JSON格式数据(流动比率、资产负债率等)

联合主键:(code, report_date)

stock_financial_cashflow — 季频现金流

字段 类型 说明
code VARCHAR(10) 股票代码
report_date VARCHAR(20) 报告期
data TEXT JSON格式数据

联合主键:(code, report_date)

stock_dividend — 分红送转

字段 类型 说明
code VARCHAR(10) 股票代码
name VARCHAR(50) 股票名称
report_date VARCHAR(20) 报告期
dividend_date DATE 除权除息日
bonus_ratio FLOAT 每10股送转比例
cash_div FLOAT 每10股派息
convert_ratio FLOAT 每10股转增比例
ex_right_date DATE 除权日
dividend_yield FLOAT 股息率%

联合主键:(code, report_date)

trading_day — 交易日历

字段 类型 说明
date DATE UQ 交易日期

stock_no_data — 停牌/无数据记录

字段 类型 说明
code VARCHAR(10) 股票代码
date DATE 停牌/无数据日期

联合主键:(code, date)

stock_min5 / stock_min15 / stock_min30 / stock_min60 — 分钟K线

字段 类型 说明
code VARCHAR(10) 股票代码
datetime DATETIME 时间
open FLOAT 开盘价
high FLOAT 最高价
low FLOAT 最低价
close FLOAT 收盘价
volume FLOAT 成交量
amount FLOAT 成交额

联合主键:(code, datetime)

stock_sector — 行业+地域分类

字段 类型 说明
code VARCHAR(10) PK 股票代码
industry VARCHAR(100) 证监会行业分类
region VARCHAR(20) 省份/地域

项目结构

a股数据看板/
├── config.yaml             # MySQL连接配置(.gitignore
├── config.example.yaml     # 配置文件模板
├── pyproject.toml           # 项目元数据
├── src/
│   ├── __init__.py
│   ├── config.py            # 配置读取模块
│   ├── baostock_conn.py     # BaoStock连接管理(login/logout/线程锁)
│   ├── db.py                # 数据库模型与连接管理
│   ├── main.py              # 命令行入口
│   └── fetchers/
│       ├── __init__.py
│       ├── stock_list.py    # 股票列表
│       ├── trading_day.py   # 交易日历
│       ├── daily.py         # 日线行情
│       ├── financial.py     # 季频财务指标
│       ├── dividend.py      # 分红送转
│       ├── intraday.py      # 分钟K线(5/15/30/60
│       └── sector.py        # 行业+地域分类
└── README.md

设计说明

  • 单数据源:统一使用 BaoStock,无需 AKShare 等额外依赖
  • 线程安全:BaoStock 查询通过全局锁串行化,避免数据错乱
  • 去重写入:所有表使用 INSERT ON DUPLICATE KEY UPDATE(upsert),重复执行不会产生重复数据
  • 增量更新:日线行情支持通过 --start-date / --end-date 指定日期范围,已完整的数据自动跳过
  • 停牌标记:缺失交易日自动标记为停牌,避免重复抓取
S
Description
保存A股数据
Readme
336 KiB
Languages
Python 100%