news 2026/10/3 13:54:24

七天量化回测入门(二)用 Baostock 拉取沪深300ETF 数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
七天量化回测入门(二)用 Baostock 拉取沪深300ETF 数据

1. 引言

在量化投资与数据分析中,获取准确的行情数据是第一步。Baostock 是一个免费、无需注册的 Python 证券数据接口库,覆盖股票、指数、ETF 等历史数据,非常适合个人投资者和研究者使用。本文将带你从零开始,用 Baostock 拉取沪深300ETF 的日线数据,并完成简单的可视化。

2. 环境准备

2.1 安装 Baostock

在上一篇文章中有详细讲解。七天量化回测入门(一)Windows 64 位系统下安装 Conda 虚拟环境完整教程

2.2 导入依赖

进入虚拟环境quant_env。

importbaostockasbsimportpandasaspdimportmatplotlib.pyplotasplt

3. 登录与获取数据

3.1 登录 Baostock

# 登录 Baostocklg=bs.login()print('login respond error_code:'+lg.error_code)print('login respond error_msg:'+lg.error_msg)

3.2 拉取沪深300ETF 日线数据

沪深300ETF 的证券代码为sh.510300。以下代码拉取 2026 年 1 月 1 日至 2026 年 9 月 30 日的日线数据:

# 获取沪深300ETF 日线数据rs=bs.query_history_k_data_plus("sh.510300","date,code,open,high,low,close,volume,amount",start_date='2026-01-01',end_date='2026-09-30',frequency="d",adjustflag="2"# 前复权)print('query respond error_code:'+rs.error_code)print('query respond error_msg:'+rs.error_msg)# 将结果转为 DataFramedata_list=[]while(rs.error_code=='0')&rs.next():data_list.append(rs.get_row_data())df=pd.DataFrame(data_list,columns=rs.fields)print(df.head())

3.3 数据清洗

Baostock 返回的数据中,缺失值以空字符串表示,需要转换为 NaN 并处理:

# 将空字符串转为 NaN,并转换数据类型df=df.replace('',pd.NA)df['date']=pd.to_datetime(df['date'])df['close']=pd.to_numeric(df['close'])df['volume']=pd.to_numeric(df['volume'])# 按日期排序df=df.sort_values('date').reset_index(drop=True)print(df.tail())

4. 数据可视化

拉取数据后,我们可以绘制收盘价走势图:

# 设置中文字体 (Windows常用'SimHei'黑体, macOS常用'Arial Unicode MS'或'PingFang HK')plt.rcParams['font.sans-serif']=['SimHei']# 解决负号'-'显示为方块的问题plt.rcParams['axes.unicode_minus']=Falseplt.figure(figsize=(12,6))plt.plot(df['date'],df['close'],label='沪深300ETF 收盘价',color='steelblue')plt.title('沪深300ETF 日线收盘价(2026年)')plt.xlabel('日期')plt.ylabel('收盘价(元)')plt.legend()plt.grid(True)plt.show()

5. 登出

使用完毕后,记得登出以释放连接:

bs.logout()

6. 完整示例代码

将以上步骤整合,得到完整可运行的脚本:

importbaostockasbsimportpandasaspdimportmatplotlib.pyplotasplt# 登录print(">>>1.准备登录",flush=True)lg=bs.login()print(f">>>2.登录返回:{lg.error_code}{lg.error_msg}",flush=True)# 拉取数据print(">>>3.开始查询",flush=True)rs=bs.query_history_k_data_plus("sz.002471","date,code,open,high,low,close,volume,amount",start_date='2026-01-01',end_date='2026-09-30',frequency="d",adjustflag="2")print(">>>4.查询返回",flush=True)# 转 DataFramedata_list=[]while(rs.error_code=='0')&rs.next():data_list.append(rs.get_row_data())print(f">>>5.拿到{len(data_list)}",flush=True)df=pd.DataFrame(data_list,columns=rs.fields)# 清洗# 将空字符串转为 NaN,并转换数据类型df=df.replace('',pd.NA)df['date']=pd.to_datetime(df['date'])df['close']=pd.to_numeric(df['close'])df['volume']=pd.to_numeric(df['volume'])# 按日期排序df=df.sort_values('date').reset_index(drop=True)print(df.tail())# 绘图# 设置中文字体 (Windows常用'SimHei'黑体, macOS常用'Arial Unicode MS'或'PingFang HK')plt.rcParams['font.sans-serif']=['SimHei']# 解决负号'-'显示为方块的问题plt.rcParams['axes.unicode_minus']=Falseplt.figure(figsize=(12,6))plt.plot(df['date'],df['close'],label='沪深300ETF 收盘价',color='steelblue')plt.title('沪深300ETF 日线收盘价(2026年)')plt.xlabel('日期')plt.ylabel('收盘价(元)')plt.legend()plt.grid(True)plt.show()# 登出bs.logout()

7. 输出结果

8. 常见问题

8.1 数据为空怎么办?

  • 检查证券代码是否正确,沪深300ETF 为sh.510300。
  • 确认起止日期是否在交易日范围内。
  • 检查adjustflag参数:1后复权、2前复权、3不复权。

8.2 如何获取实时行情?

Baostock 主要提供历史数据,实时行情建议使用其他接口(如 Tushare Pro 或券商 API)。

9. 总结

本文演示了使用 Baostock 拉取沪深300ETF 日线数据的完整流程,包括登录、查询、清洗和可视化。Baostock 免费且无需注册,是入门量化分析的理想选择。你可以在此基础上扩展均线计算、收益率分析等更多功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 13:53:38

Python实现轴承RUL预测与故障诊断联合建模

简介:本资源是一套面向工业智能运维领域的Python剩余使用寿命(RUL)预测与故障诊断代码框架,主要服务于机械/电子设备状态监测方向的工程师、研究生及科研人员,解决预测性维护中模型开发效率低、实验复现难、中间计算冗…

作者头像 李华
网站建设 2026/10/3 13:50:36

QML 自定义 TabBar:宽度形变

目录 先选方案 拆开讲讲 宽度是算出来的 文字宽度从 0 弹出来 三处动画收尾有先有后 几个可以调的参数 什么时候用 小结 完整代码 工程下载 本文介绍 QML 自定义的宽度形变组件。如图所示: M3 Expressive 风格:平时只露小图标,选中项弹性展开成图标加文字,整排标签跟着弹簧…

作者头像 李华
网站建设 2026/10/3 13:46:06

代码改了文档没改?用 Codex 做一次全仓库文档漂移审计

代码改了文档没改?用 Codex 做一次全仓库文档漂移审计 [!NOTE] 文档漂移审计不是“让 Codex 重写所有 README”,而是以固定提交为边界,比较源码、测试、OpenAPI、示例、发布说明与现有文档,先列证据,再只更新受影响页面。 OpenAI 官方用例强调保留现有结构与术语、排除未公…

作者头像 李华