1. 认识 baostock
Baostock(证券宝)是一个免费、开源的证券数据平台。它通过 Python API 提供大量准确、完整的证券历史行情数据、上市公司财务数据等,能满足量化交易投资者、数量金融爱好者、计量经济从业者的数据需求。
它的数据返回格式为 pandas DataFrame 类型,这对于使用 pandas/NumPy/Matplotlib 进行数据分析和可视化非常友好。
2. 数据范围与时间
baostock 的数据覆盖范围主要包括:
baostock 是一款免费开源的 Python 证券数据平台,提供 A 股历史行情及财务数据。介绍其安装配置、登录机制及核心 API 使用方法,包括获取日/周/月及分钟级 K 线数据、查询股票列表等。内容涵盖复权类型选择、停牌数据处理、数据类型转换及超时处理等常见问题,适合量化交易初学者进行数据获取与分析。
Baostock(证券宝)是一个免费、开源的证券数据平台。它通过 Python API 提供大量准确、完整的证券历史行情数据、上市公司财务数据等,能满足量化交易投资者、数量金融爱好者、计量经济从业者的数据需求。
它的数据返回格式为 pandas DataFrame 类型,这对于使用 pandas/NumPy/Matplotlib 进行数据分析和可视化非常友好。
baostock 的数据覆盖范围主要包括:
| 数据类型 | 包含内容 | 时间范围 | 备注 |
|---|
| 股票数据 | 日、周、月 K 线数据 | 1990-12-19 至今 | |
| 5、15、30、60 分钟 K 线数据 | 1999-07-26 至今 | ||
| 指数数据 | 综合指数,规模指数,一级行业指数,二级行业指数,策略指数,成长指数,价值指数,主题指数,基金指数,债券指数 | 2006-01-01 至今 | 指数没有分钟线数据 |
| 财务数据 | 部分上市公司资产负债信息、现金流量信息、利润信息、杜邦指标信息 | 2007 年至今 | 季频 |
| 公司报告 | 上市公司业绩预告信息 | 2003 年至今 | 季频 |
| 上市公司业绩快报信息 | 2006 年至今 | 季频 |
每日最新数据更新时间需要注意:
安装 baostock 非常简单,只需在命令行中执行:
pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
注意:程序运行时,文件名、文件夹名不能是 baostock。
在开始任何数据查询前,都需要先登录系统。建立与服务器的连接无需注册即可登录。需要注意的是,登录后超过一段时间没有操作再调用 API 请求时会超时,需要重新登录才能继续下载数据。
import baostock as bs
# 登录系统
lg = bs.login()
# 显示登录返回信息
print('login respond error_code:' + lg.error_code)
print('login respond error_msg:' + lg.error_msg)
# 你的数据查询代码将在这里
# 登出系统
bs.logout()
query_history_k_data_plus() 是获取历史 A 股 K 线数据的重要接口。
方法说明:通过 API 接口获取 A 股历史交易数据,可以通过参数设置获取日 k 线、周 k 线、月 k 线,以及 5 分钟、15 分钟、30 分钟和 60 分钟 k 线数据,适合搭配均线数据进行选股和分析。
返回类型:pandas 的 DataFrame 类型。
能获取 1990-12-19 至当前时间的数据;可查询不复权、前复权、后复权数据。
主要参数:
| 参数名 | 描述 | 是否必须 | 默认值 |
|---|---|---|---|
| code | 股票代码,sh 或 sz.+6 位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。 | 是 | 无 |
| fields | 指示简称,支持多指标输入,以半角逗号分隔,填写内容作为返回类型的列。 | 是 | 无 |
| start_date | 开始日期(包含),格式'YYYY-MM-DD' | 否 | 2015-01-01 |
| end_date | 结束日期(包含),格式'YYYY-MM-DD' | 否 | 最近一个交易日 |
| frequency | 数据类型,默认为 d,日 k 线;d=日 k 线、w=周、m=月、5=5 分钟、15=15 分钟、30=30 分钟、60=60 分钟 k 线数据,不区分大小写;指数没有分钟线数据;周线每周最后一个交易日才可以获取,月线每月最后一个交易日才可以获取。 | 否 | d |
| adjustflag | 复权类型,默认不复权:3;1:后复权;2:前复权。已支持分钟线、日线、周线、月线前后复权。 | 否 |
query_all_stock() 函数可以获取指定交易日期所有股票列表。可以通过参数 day 获取某一天的数据,参数为空表示默认获取当天的数据。返回类型为 baostock 自定义的数据类型,通过 get_data() 函数可以获取 Pandas DataFrame 类型的数据。
date = "2025-08-01" # 假设的日期,请替换为实际日期
stock_df = bs.query_all_stock(date).get_data()
以下是一个获取股票分钟级 K 线数据的完整示例。
import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)
# 获取沪深 A 股历史 K 线数据
# 详细指标参数,参见'历史行情指标参数'章节;'分钟线'参数与'日线'参数不同。'分钟线'不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
rs = bs.query_history_k_data_plus("sh.600000", # 股票代码,例如:浦发银行
"date,time,code,open,high,low,close,volume,amount,adjustflag", # 指定需要的字段
start_date='2025-07-01', # 开始日期(请替换为实际需要的日期)
end_date='2025-07-31', # 结束日期(请替换为实际需要的日期)
frequency="5", # 频率:5 表示 5 分钟线
adjustflag="3") # 复权类型:3 不复权
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)
# 打印结果集
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)
# 结果集输出到 csv 文件
result.to_csv("history_A_stock_k_data.csv", index=False)
print(result.head(10)) # 打印前 10 行数据查看
# 登出系统
bs.logout()
重要提示:指数没有分钟线数据。尝试获取指数的分钟线数据可能会出错或返回空结果。
adjustflag 参数决定了数据的复权方式,这对分析至关重要:
BaoStock 使用'涨跌幅复权法'进行复权。这种方法可以计算出资金收益率,确保初始投入的资金运用率为 100%,既不会因为分红而导致投资减少,也不会因为配股导致投资增加。需要注意的是,不同系统(如同花顺、通达信等)采用的复权方式可能不一致,会导致数据差异。
股票停牌时,对于日线,开、高、低、收价都相同,且都为前一交易日的收盘价,成交量、成交额为 0,换手率为空。
在回测过程中,通常不希望停盘数据对回测造成干扰,可以将停盘数据删除:
if result.shape[0]:
result = result[(result['volume'] != '0') & (result['volume'] != '')]
返回数据格式转换:从 BaoStock 下载的数据元素类型可能均为 object(字符串)。在进行数值计算前,可能需要转换类型,例如换手率:
result["turn"] = [0 if x == "" else float(x) for x in result["turn"]]
查询所有股票代码:可以使用 query_all_stock() 函数获取指定日期的所有股票列表,并转换为 List:
stock_list = stock_df['code'].tolist()
数据准确性交叉验证:对于关键决策,建议使用其他数据源(如券商 API、Wind 等)进行交叉验证,特别是在复权数据方面,因为不同平台的复权算法可能有差异。
超时与重新登录:登录后如果长时间没有操作,连接可能会超时。如果后续请求失败,可以尝试重新调用 bs.login()。
请注意,baostock 目前的数据主要集中在 A 股,缺少港股、期货、外汇和基金等金融数据。对于更高频率(Tick 级)的交易或更广泛的品种,你可能需要考虑其他数据源。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online