关于 baostock
BaoStock 是面向中国 A 股证券数据的免费开源平台,通过统一的 Python API 提供数据。适用于需要市场、公司、财务和宏观数据的分析师与开发者,结果可整理为 pandas DataFrame。
主要功能
- 01日、周、月及分钟历史行情
- 02股票、指数与行业信息
- 03分红和复权因子数据
- 04季度财务指标与报告
- 05利率和货币供应数据
适用场景
- 01构建 A 股历史价格数据集
- 02比较公司财务指标
- 03查看指数成分与行业分类
- 04结合市场数据分析宏观序列
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ atompilot/ baostock-skill --skill baostock安装后在 Claude Code 中输入/baostock确认已加载。
详细介绍
BaoStock
概述
BaoStock 是一个面向中国 A 股的免费开源证券数据平台。它通过统一的 Python API 提供历史行情、财务指标、宏观经济数据和行业分类,并返回 pandas DataFrame。
主要优势:免费、稳定、历史数据跨度长(自 1990 年起),无速率限制,也无需额度。
快速入门
安装
pip install baostock
基本用法模式
import baostock as bs
import pandas as pd
# 1. Login (required)
lg = bs.login()
# 2. Query data
rs = bs.query_history_k_data_plus(
"sh.600000",
"date,code,open,high,low,close,volume,amount",
start_date="2024-01-01",
end_date="2024-12-31",
frequency="d",
adjustflag="3",
)
# 3. Collect results (pandas 2.0+ compatible)
rows = []
while (rs.error_code == "0") and rs.next():
rows.append(rs.get_row_data())
df = pd.DataFrame(rows, columns=rs.fields)
# 4. Logout
bs.logout()
股票代码格式
BaoStock 使用 exchange.code 格式(注意中间的点号分隔符):
| 交易所 | 前缀 | 示例 |
|---|---|---|
| 上海证券交易所(SSE) | sh. | sh.600000(浦发银行) |
| 深圳证券交易所(SZSE) | sz. | sz.000001(平安银行) |
参数约定
- 日期:
YYYY-MM-DD(例如,2024-12-31) - 股票代码:
sh.600000、sz.000001 - 返回格式:通过
rs.next()+rs.get_row_data()迭代,并组装为 DataFrame - 所有返回值均为字符串:数值列必须手动使用
pd.to_numeric()转换
完整 API 参考
I. 行情数据
1. 历史 K 线:query_history_k_data_plus()
最重要的 API——支持日线、周线、月线和分钟线,并支持复权。
rs = bs.query_history_k_data_plus(
code="sh.600000", # Stock code
fields="date,code,...", # Return fields (comma-separated)
start_date="2024-01-01",# Start date, default 2015-01-01
end_date="2024-12-31", # End date, default latest trading day
frequency="d", # Frequency
adjustflag="3", # Adjustment type
)
frequency 取值:
| 值 | 频率 | 备注 |
|---|---|---|
"d" | 日线 | 默认值 |
"w" | 周线 | |
"m" | 月线 | |
"5" | 5 分钟线 | 指数不支持分钟线 |
"15" | 15 分钟线 | |
"30" | 30 分钟线 | |
"60" | 60 分钟线 |
adjustflag 取值:
| 值 | 含义 | 方法 |
|---|---|---|
"3" | 不复权 | 默认值 |
"1" | 后复权 | 涨跌幅复权法 |
"2" | 前复权 | 涨跌幅复权法 |
注意:BaoStock 使用“涨跌幅复权法”,这与其他平台(例如通达信)不同。
日线、周线和月线字段:
| 字段 | 描述 | 类型 |
|---|---|---|
date | 交易日期 | str |
code | 股票代码 | str |
open | 开盘价 | str→float |
high | 最高价 | str→float |
low | 最低价 | str→float |
close | 收盘价 | str→float |
preclose | 前收盘价 | str→float |
volume | 成交量(股) | str→float |
amount | 成交额(人民币) | str→float |
adjustflag | 复权标志 | str |
turn | 换手率(%) | str→float,停牌时为空字符串 |
tradestatus | 交易状态 | str,"1"=正常,"0"=停牌 |
pctChg | 涨跌幅(%) | str→float |
peTTM | 市盈率(TTM) | str→float |
pbMRQ | 市净率(MRQ) | str→float |
psTTM | 市销率(TTM) | str→float |
pcfNcfTTM | 市现率(TTM) | str→float |
isST | 是否为 ST 股票 | str,"1"=是,"0"=否 |
分钟线字段:
| 字段 | 描述 |
|---|---|
date | 日期 |
time | 时间(格式为 YYYYMMDDHHmmssSSS) |
code | 股票代码 |
open | 开盘价 |
high | 最高价 |
low | 最低价 |
close | 收盘价 |
volume | 成交量 |
amount | 成交额 |
adjustflag | 复权标志 |
分钟线不包含指数数据或估值指标(peTTM 等)。
2. 指数 K 线
使用相同的 query_history_k_data_plus() API 和指数代码:
| 指数 | 代码 |
|---|---|
| 上证综合指数 | sh.000001 |
| 深证成份指数 | sz.399001 |
| 沪深 300 | sh.000300 |
| 中证 500 | sh.000905 |
| 创业板指数 | sz.399006 |
指数不支持分钟线,仅支持日线、周线和月线。
3. 指定日期的全部证券:query_all_stock()
rs = bs.query_all_stock(day="2024-12-31")
# Returns: code, tradeStatus columns
II. 基本信息
4. 股票基本信息:query_stock_basic()
rs = bs.query_stock_basic(code="sh.600000") # Single stock
rs = bs.query_stock_basic() # All stocks
返回:code、code_name、ipoDate、outDate、type(1=股票,2=指数,3=其他,4=可转债,5=ETF)、status(1=上市,0=退市)
5. 行业分类:query_stock_industry()
rs = bs.query_stock_industry(date="2024-12-31") # Specific date
rs = bs.query_stock_industry() # Latest
返回:updateDate、code、code_name、industry、industryClassification
使用证监会行业分类标准。
6. 上证 50 成分股:query_sz50_stocks()
rs = bs.query_sz50_stocks(date="2024-12-31")
返回:updateDate、code、code_name
7. 沪深 300 成分股:query_hs300_stocks()
rs = bs.query_hs300_stocks(date="2024-12-31")
8. 中证 500 成分股:query_zz500_stocks()
rs = bs.query_zz500_stocks(date="2024-12-31")
III. 分红与复权
9. 分红信息:query_dividend_data()
rs = bs.query_dividend_data(
code="sh.600000",
year="2024",
yearType="report", # "report"=announcement year, "operate"=ex-dividend year
)
返回:
| 字段 | 说明 |
|---|---|
dividPreNoticeDate | 预告日期 |
dividAgmPumDate | 股东大会公告日期 |
dividPlanAnnounceDate | 方案公告日期 |
dividPlanDate | 实施公告日期 |
dividRegistDate | 股权登记日 |
dividOperateDate | 除权除息日 |
dividPayDate | 派息日 |
dividStockMarketDate | 股票上市日 |
dividCashPsBeforeTax | 每股税前现金股利 |
dividCashPsAfterTax | 每股税后现金股利 |
dividStocksPs | 每股股票股利 |
dividCashStock | 分红与转增信息 |
dividReserveToStockPs | 每股公积金转增股本 |
10. 复权因子:query_adjust_factor()
rs = bs.query_adjust_factor(
code="sh.600000",
start_date="2015-01-01",
end_date="2024-12-31",
)
返回:code、dividOperateDate、foreAdjustFactor、backAdjustFactor、adjustFactor
IV. 季度财务数据
所有季度 API 使用相同的参数:
rs = bs.query_xxx_data(code="sh.600000", year=2024, quarter=2)
code:股票代码year:财年(int)quarter:季度(1/2/3/4)
11. 盈利能力:query_profit_data()
返回:
| 字段 | 说明 |
|---|---|
code | 股票代码 |
pubDate | 发布日期 |
statDate | 统计截止日期 |
roeAvg | ROE(平均值,%) |
npMargin | 净利率(%) |
gpMargin | 毛利率(%) |
netProfit | 净利润(CNY) |
epsTTM | 每股收益 |
MBRevenue | 主营业务收入(CNY) |
totalShare | 总股本 |
liqaShare | 流通股 |
12. 运营效率:query_operation_data()
返回:NRTurnRatio(应收账款周转率)、NRTurnDays、INVTurnRatio(存货周转率)、INVTurnDays、CATurnRatio(流动资产周转率)、AssetTurnRatio(总资产周转率)
13. 成长能力:query_growth_data()
返回:YOYEquity(股东权益同比增长)、YOYAsset(资产同比增长)、YOYNI(净利润同比增长)、YOYEPSBasic(基本每股收益同比增长)、YOYPNI(归属于母公司股东的净利润同比增长)
14. 偿债能力:query_balance_data()
返回:currentRatio、quickRatio、cashRatio、YOYLiability、liabilityToAsset、assetToEquity
15. 现金流:query_cash_flow_data()
返回:CAToAsset、NCAToAsset、tangibleAssetToAsset、ebitToInterest、CFOToOR、CFOToNP、CFOToGr
16. 杜邦分析:query_dupont_data()
返回:dupontROE、dupontAssetSto498(权益乘数)、dupontAssetTurn、dupontPnitoni、dupontNitogr、dupontTaxBurden、dupontIntburden、dupontEbittogr
17. 业绩快报:query_performance_express_report()
返回:performanceExpPubDate、performanceExpStatDate、performanceExpRevenue、performanceExpDeductedNP、performanceExpNetProfit、performanceExpEPSChgPct、performanceExpROEChgPct 等。
18. 业绩预告:query_forecast_report()
返回:profitForcastExpPubDate、profitForcastExpStatDate、profitForcastType(增长/下降/扭亏/首亏/续盈/续亏/略增/略减/不确定)、profitForcastAbstract、profitForcastChgPctUp、profitForcastChgPctDwn
V. 宏观经济数据
19. 存款利率:query_deposit_rate_data()
rs = bs.query_deposit_rate_data(start_date="2020-01-01", end_date="2024-12-31")
返回:pubDate、depositType、depositRate
20. 贷款利率:query_loan_rate_data()
rs = bs.query_loan_rate_data(start_date="2020-01-01", end_date="2024-12-31")
返回:pubDate、loanType、loanRate
21. 存款准备金率:query_required_reserve_ratio_data()
rs = bs.query_required_reserve_ratio_data(start_date="2020-01-01", end_date="2024-12-31")
返回:pubDate、effectiveDate、deposit(大型机构)、smallDeposit(小型机构)
22. 货币供应量(月度):query_money_supply_data_month()
rs = bs.query_money_supply_data_month(start_date="2020-01", end_date="2024-12")
返回:statYear、statMonth、m0Month、m0YOY、m0ChainRelative、m1Month、m1YOY、m1ChainRelative、m2Month、m2YOY、m2ChainRelative
23. 货币供应量(年度):query_money_supply_data_year()
rs = bs.query_money_supply_data_year(start_date="2020", end_date="2024")
返回:statYear、m0、m1、m2
常见问题
1. 所有返回值都是字符串
BaoStock 返回的所有字段都是字符串。必须手动转换:
df["close"] = pd.to_numeric(df["close"], errors="coerce")
2. 停牌时换手率为空字符串
停牌日的换手率返回 ""。直接转换为 float() 会失败:
df["turn"] = pd.to_numeric(df["turn"], errors="coerce") # "" → NaN
3. 兼容 pandas 2.0+
BaoStock 内部使用了 DataFrame.append(),该方法已在 pandas 2.0+ 中移除。必须手动收集数据:
# BAD: rs.get_data() crashes on pandas 2.0+
df = rs.get_data()
# GOOD: Manual collection
rows = []
while (rs.error_code == "0") and rs.next():
rows.append(rs.get_row_data())
df = pd.DataFrame(rows, columns=rs.fields)
4. login/logout 会向 stdout 输出内容
BaoStock 的 login() 和 logout() 会向 stdout 输出消息。可使用以下方式抑制:
import os, contextlib
with open(os.devnull, "w") as devnull:
with contextlib.redirect_stdout(devnull):
bs.login()
5. 分钟线的时间字段格式
分钟线中的 time 字段为 YYYYMMDDHHmmssSSS(17 位字符串):
# "20240102093500000" → "2024-01-02 09:35:00"
t = "20240102093500000"
dt = f"{t[:4]}-{t[4:6]}-{t[6:8]} {t[8:10]}:{t[10:12]}:{t[12:14]}"
6. 复权方式与其他平台不同
BaoStock 使用百分比变动复权法,与通达信的定点复权法相比,得到的绝对价格略有不同。
7. 连接断开后需要重新登录
网络中断或长时间闲置后,BaoStock 连接可能会过期。请添加重试和重新登录逻辑:
try:
rs = bs.query_history_k_data_plus(...)
except Exception:
bs.logout()
bs.login()
rs = bs.query_history_k_data_plus(...) # Retry
8. 指数不支持分钟线
指数代码(例如 sh.000001)在分钟频率下会返回空数据,且不会报错。
9. ETF 支持有限
BaoStock 的 ETF 数据覆盖有限。可考虑使用 pytdx 或 tushare 获取 ETF 报价。
官方资源
- 网站:https://www.baostock.com
- API 文档:https://www.baostock.com/mainContent?file=pythonAPI.md
- GitHub:https://github.com/baostock/baostock
- PyPI:
pip install baostock