55de9519593cc76d40fe796508834b77179a6a0e45a3ad287709e142595db79a
ashare-data
A股数据抓取工具,使用 AKShare 获取数据,保存到 MySQL 数据库。
功能概览
| 数据类型 | 说明 | 数据来源 |
|---|---|---|
| 股票列表 | 沪深A股代码、名称、上市日期 | BaoStock |
| 交易日历 | 1990年至今的交易日列表 | BaoStock |
| 日线行情 | 开高低收、成交量/额、振幅、涨跌幅、换手率(前复权) | BaoStock |
| 季频财务指标 | 盈利能力、偿债能力、现金流(最近8个季度) | BaoStock |
| 分红送转 | 每10股送转、派息、除权除息日(最近10年) | BaoStock |
| 分时行情 | 5/15/30/60分钟K线(开高低收、成交量/额) | BaoStock |
| 行业+地域分类 | 证监会行业分类 + 省份 | BaoStock + 东方财富 |
已知限制:BaoStock 不含北交所(920xxx)股票。
快速开始
1. 环境要求
- Python >= 3.10
- MySQL >= 5.7(建议 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. 抓取最近30天的日线行情
python -m src.main --daily
# 指定日期范围抓取日线
python -m src.main --daily --start-date 19901201 --end-date 20260508
# 抓取财务指标(全部股票,最近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 抓取日线行情
--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指定日期范围,已完整的数据自动跳过 - 停牌标记:缺失交易日自动标记为停牌,避免重复抓取
Languages
Python
100%