SHA256
init
This commit is contained in:
@@ -6,12 +6,15 @@ A股数据抓取工具,使用 [AKShare](https://github.com/akfamily/akshare)
|
||||
|
||||
| 数据类型 | 说明 | 数据来源 |
|
||||
|---------|------|---------|
|
||||
| 股票列表 | A股全部股票代码和名称 | 东方财富 |
|
||||
| 日线行情 | 开盘价、收盘价、最高价、最低价、成交量、成交额、涨跌幅等(前复权) | 东方财富 |
|
||||
| 财务报表 | 利润表、资产负债表、现金流量表 | 新浪财经 |
|
||||
| 资金流向 | 主力/超大/大/中/小单净流入及占比 | 东方财富 |
|
||||
| 龙虎榜 | 上榜股票、买入卖出金额、上榜原因 | 东方财富 |
|
||||
| 分红送转 | 每10股送转、派息、股息率等 | 巨潮资讯 |
|
||||
| 股票列表 | 沪深A股代码、名称、上市日期 | BaoStock |
|
||||
| 交易日历 | 1990年至今的交易日列表 | BaoStock |
|
||||
| 日线行情 | 开高低收、成交量/额、振幅、涨跌幅、换手率(前复权) | BaoStock |
|
||||
| 季频财务指标 | 盈利能力、偿债能力、现金流(最近8个季度) | BaoStock |
|
||||
| 分红送转 | 每10股送转、派息、除权除息日(最近10年) | BaoStock |
|
||||
| 分时行情 | 5/15/30/60分钟K线(开高低收、成交量/额) | BaoStock |
|
||||
| 行业+地域分类 | 证监会行业分类 + 省份 | BaoStock + 东方财富 |
|
||||
|
||||
**已知限制**:BaoStock 不含北交所(920xxx)股票。
|
||||
|
||||
## 快速开始
|
||||
|
||||
@@ -23,11 +26,7 @@ A股数据抓取工具,使用 [AKShare](https://github.com/akfamily/akshare)
|
||||
### 2. 安装依赖
|
||||
|
||||
```bash
|
||||
python -m venv .venv
|
||||
.venv\Scripts\activate # Windows
|
||||
# source .venv/bin/activate # Linux/Mac
|
||||
|
||||
pip install -r requirements.txt
|
||||
pip install baostock pymysql sqlalchemy pyyaml pandas
|
||||
```
|
||||
|
||||
### 3. 配置数据库
|
||||
@@ -38,7 +37,7 @@ pip install -r requirements.txt
|
||||
cp config.example.yaml config.yaml
|
||||
```
|
||||
|
||||
编辑 `config.yaml`,填写你的 MySQL 连接信息:
|
||||
编辑 `config.yaml`:
|
||||
|
||||
```yaml
|
||||
mysql:
|
||||
@@ -50,8 +49,9 @@ mysql:
|
||||
charset: "utf8mb4"
|
||||
|
||||
fetch:
|
||||
delay: 0.5 # 请求间隔(秒),防止被限流
|
||||
retry: 3 # 失败重试次数
|
||||
delay: 0.1 # 请求间隔(秒)
|
||||
retry: 2 # 失败重试次数
|
||||
workers: 1 # 并发线程数
|
||||
```
|
||||
|
||||
确保 MySQL 中已创建对应数据库:
|
||||
@@ -63,60 +63,61 @@ CREATE DATABASE ashare CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
### 4. 运行
|
||||
|
||||
```bash
|
||||
# 先抓取股票列表(其他模块依赖此数据)
|
||||
python -m src.main --stock-list
|
||||
# 1. 先抓取股票列表(其他模块依赖此数据)
|
||||
python -m src.main --stock-info
|
||||
|
||||
# 抓取最近30天的日线行情
|
||||
# 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 20260430 --end-date 20260508
|
||||
python -m src.main --daily --start-date 19901201 --end-date 20260508
|
||||
|
||||
# 抓取财务报表(全部股票)
|
||||
# 抓取财务指标(全部股票,最近8个季度)
|
||||
python -m src.main --financial
|
||||
|
||||
# 抓取单只股票的财务数据
|
||||
python -m src.main --financial --symbol 000001
|
||||
|
||||
# 抓取资金流向
|
||||
python -m src.main --money-flow
|
||||
|
||||
# 抓取最近30天的龙虎榜
|
||||
python -m src.main --dragon-tiger
|
||||
|
||||
# 指定日期范围抓取龙虎榜
|
||||
python -m src.main --dragon-tiger --start-date 20260423 --end-date 20250509
|
||||
|
||||
# 抓取分红送转
|
||||
# 抓取分红送转(全部股票,最近10年)
|
||||
python -m src.main --dividend
|
||||
|
||||
# 全量抓取所有数据
|
||||
python -m src.main --all
|
||||
# 抓取单只股票的分红
|
||||
python -m src.main --dividend --symbol 000001
|
||||
|
||||
# 抓取分钟K线(默认5分钟)
|
||||
python -m src.main --intraday
|
||||
|
||||
# 抓取全部频率分钟K线
|
||||
python -m src.main --intraday --freq all --start-date 20260508
|
||||
|
||||
# 抓取行业+地域分类
|
||||
python -m src.main --sector
|
||||
```
|
||||
|
||||
### 5. 命令行参数说明
|
||||
|
||||
```
|
||||
usage: main.py [-h] [--stock-list] [--daily] [--financial] [--money-flow]
|
||||
[--dragon-tiger] [--dividend] [--all]
|
||||
[--start-date START_DATE] [--end-date END_DATE]
|
||||
[--symbol SYMBOL]
|
||||
|
||||
选项:
|
||||
--stock-list 抓取A股股票列表
|
||||
--daily 抓取日线行情
|
||||
--financial 抓取财务报表(利润表、资产负债表、现金流量表)
|
||||
--money-flow 抓取个股资金流向
|
||||
--dragon-tiger 抓取龙虎榜数据
|
||||
--dividend 抓取分红送转数据
|
||||
--all 全量抓取以上所有数据
|
||||
--stock-info 抓取A股股票列表
|
||||
--trading-day 抓取交易日历
|
||||
--daily 抓取日线行情
|
||||
--financial 抓取季频财务指标
|
||||
--dividend 抓取分红送转数据
|
||||
--intraday 抓取分钟K线行情
|
||||
--freq K线频率: 5/15/30/60/all(默认5)
|
||||
--sector 抓取行业+地域分类
|
||||
--industry-only 仅抓取行业分类
|
||||
--region-only 仅抓取地域分类
|
||||
|
||||
日期过滤(仅对日线行情和龙虎榜生效):
|
||||
--start-date 开始日期,格式 YYYYMMDD,默认30天前
|
||||
--end-date 结束日期,格式 YYYYMMDD,默认今天
|
||||
日期过滤(对日线行情、交易日历、分钟K线生效):
|
||||
--start-date 开始日期,格式 YYYYMMDD
|
||||
--end-date 结束日期,格式 YYYYMMDD
|
||||
|
||||
股票过滤(仅对财务报表和分红送转生效):
|
||||
--symbol 指定单只股票代码,如 000001,默认全部股票
|
||||
股票过滤(对财务指标、分红送转、分钟K线生效):
|
||||
--symbol 指定单只股票代码,如 000001,默认全部股票
|
||||
```
|
||||
|
||||
## 数据库表结构
|
||||
@@ -127,6 +128,7 @@ usage: main.py [-h] [--stock-list] [--daily] [--financial] [--money-flow]
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) PK | 股票代码 |
|
||||
| name | VARCHAR(50) | 股票名称 |
|
||||
| ipo_date | DATE | 上市日期 |
|
||||
|
||||
### stock_daily — 日线行情(前复权)
|
||||
|
||||
@@ -147,73 +149,36 @@ usage: main.py [-h] [--stock-list] [--daily] [--financial] [--money-flow]
|
||||
|
||||
联合主键:`(code, date)`
|
||||
|
||||
### stock_financial_income — 利润表
|
||||
### stock_financial_income — 季频盈利能力
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) | 股票代码 |
|
||||
| report_date | VARCHAR(20) | 报告期 |
|
||||
| data | TEXT | JSON格式利润表数据 |
|
||||
| data | TEXT | JSON格式数据(ROE、净利率、毛利率等) |
|
||||
|
||||
联合主键:`(code, report_date)`
|
||||
|
||||
### stock_financial_balance — 资产负债表
|
||||
### stock_financial_balance — 季频偿债能力
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) | 股票代码 |
|
||||
| report_date | VARCHAR(20) | 报告期 |
|
||||
| data | TEXT | JSON格式资产负债表数据 |
|
||||
| data | TEXT | JSON格式数据(流动比率、资产负债率等) |
|
||||
|
||||
联合主键:`(code, report_date)`
|
||||
|
||||
### stock_financial_cashflow — 现金流量表
|
||||
### stock_financial_cashflow — 季频现金流
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) | 股票代码 |
|
||||
| report_date | VARCHAR(20) | 报告期 |
|
||||
| data | TEXT | JSON格式现金流量表数据 |
|
||||
| data | TEXT | JSON格式数据 |
|
||||
|
||||
联合主键:`(code, report_date)`
|
||||
|
||||
### stock_money_flow — 个股资金流向
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) | 股票代码 |
|
||||
| date | DATE | 日期 |
|
||||
| close | FLOAT | 收盘价 |
|
||||
| pct_change | FLOAT | 涨跌幅% |
|
||||
| main_net_inflow | FLOAT | 主力净流入-净额 |
|
||||
| main_net_pct | FLOAT | 主力净流入-净占比 |
|
||||
| huge_net_inflow | FLOAT | 超大盘净流入-净额 |
|
||||
| huge_net_pct | FLOAT | 超大盘净流入-净占比 |
|
||||
| big_net_inflow | FLOAT | 大盘净流入-净额 |
|
||||
| big_net_pct | FLOAT | 大盘净流入-净占比 |
|
||||
| mid_net_inflow | FLOAT | 中盘净流入-净额 |
|
||||
| mid_net_pct | FLOAT | 中盘净流入-净占比 |
|
||||
| small_net_inflow | FLOAT | 小盘净流入-净额 |
|
||||
| small_net_pct | FLOAT | 小盘净流入-净占比 |
|
||||
|
||||
联合主键:`(code, date)`
|
||||
|
||||
### stock_dragon_tiger — 龙虎榜
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| code | VARCHAR(10) | 股票代码 |
|
||||
| name | VARCHAR(50) | 股票名称 |
|
||||
| date | DATE | 上榜日期 |
|
||||
| close | FLOAT | 收盘价 |
|
||||
| pct_change | FLOAT | 涨跌幅% |
|
||||
| reason | VARCHAR(200) | 上榜原因 |
|
||||
| buy_amount | FLOAT | 买入额 |
|
||||
| sell_amount | FLOAT | 卖出额 |
|
||||
| net_amount | FLOAT | 净额 |
|
||||
|
||||
联合主键:`(code, date)`
|
||||
|
||||
### stock_dividend — 分红送转
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
@@ -230,34 +195,73 @@ usage: main.py [-h] [--stock-list] [--daily] [--financial] [--money-flow]
|
||||
|
||||
联合主键:`(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) | 省份/地域 |
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
ashare-data/
|
||||
a股数据看板/
|
||||
├── config.yaml # MySQL连接配置(.gitignore)
|
||||
├── config.example.yaml # 配置文件模板
|
||||
├── config.yaml # 实际配置(含密码,已加入.gitignore)
|
||||
├── pyproject.toml # 项目元数据
|
||||
├── requirements.txt # Python依赖
|
||||
├── src/
|
||||
│ ├── __init__.py
|
||||
│ ├── config.py # 配置读取模块
|
||||
│ ├── baostock_conn.py # BaoStock连接管理(login/logout/线程锁)
|
||||
│ ├── db.py # 数据库模型与连接管理
|
||||
│ ├── main.py # 命令行入口
|
||||
│ └── fetchers/
|
||||
│ ├── __init__.py
|
||||
│ ├── stock_list.py # 股票列表抓取
|
||||
│ ├── daily.py # 日线行情抓取
|
||||
│ ├── financial.py # 财务报表抓取
|
||||
│ ├── money_flow.py # 资金流向抓取
|
||||
│ ├── dragon_tiger.py # 龙虎榜抓取
|
||||
│ └── dividend.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),重复执行不会产生重复数据
|
||||
- **自动重试**:网络请求失败自动重试(默认3次),单只股票失败不影响整体
|
||||
- **限速保护**:请求间自动延迟(默认0.5秒),防止被数据源限流
|
||||
- **增量更新**:日线行情和龙虎榜支持通过 `--start-date` / `--end-date` 指定日期范围
|
||||
- **懒加载导入**:各fetcher模块按需导入,未使用的模块不会加载
|
||||
- **增量更新**:日线行情支持通过 `--start-date` / `--end-date` 指定日期范围,已完整的数据自动跳过
|
||||
- **停牌标记**:缺失交易日自动标记为停牌,避免重复抓取
|
||||
|
||||
Reference in New Issue
Block a user