mcpField
B
baostock

baostock

github.com/atompilot数据与数据库1957 次安装33 周前更新
代码仓库

关于 baostock

BaoStock 是面向中国 A 股证券数据的免费开源平台,通过统一的 Python API 提供数据。适用于需要市场、公司、财务和宏观数据的分析师与开发者,结果可整理为 pandas DataFrame。

主要功能

  1. 01日、周、月及分钟历史行情
  2. 02股票、指数与行业信息
  3. 03分红和复权因子数据
  4. 04季度财务指标与报告
  5. 05利率和货币供应数据

适用场景

  1. 01构建 A 股历史价格数据集
  2. 02比较公司财务指标
  3. 03查看指数成分与行业分类
  4. 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
沪深 300sh.000300
中证 500sh.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统计截止日期
roeAvgROE(平均值,%)
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 报价。

官方资源

评论

支持 Markdown