一句话:把“免费、稳定”优势发挥到极致,同时补齐“实时、深度”短板。下面给出一条从“拿得到”到“用得好”的完整流水线,可直接复制到你的生产环境。
一、先把数据一次拿全
- 全市场代码表(含退市)
import baostock as bs, pandas as pd bs.login() rs = bs.query_all_stock(day='') codes = [r[0] for r in rs.get_data().values] # 4000+ 股票/指数
- 并行下载日线(向后复权)
from concurrent.futures import ThreadPoolExecutor def fetch_daily(code): rs = bs.query_history_k_data_plus( code, "date,code,open,high,low,close,volume,amount,pbMRQ,peTTM", start_date="2010-01-01", end_date="2024-12-31", frequency="d", adjustflag="2") return pd.DataFrame(rs.get_data()) with ThreadPoolExecutor(max_workers=8) as pool: daily_list = list(pool.map(fetch_daily, codes)) daily_df = pd.concat(daily_list) daily_df.to_parquet("A_share_daily.parquet") # 压缩后 1.3 GB
一次跑 20 分钟,后续直接读 parquet,秒级加载。
二、分钟级:按需“切片”而非“全量”
Baostock 5/15/30/60 min 免费,但接口有 QPS 限制(≈20)。
• 实盘:用 增量订阅 代码,把当日分钟线实时追加到本地 HDF5;
• 回测:只拉策略所需时间段,避免整年全量。
示例:拉最近 30 天 5 分钟线
rs = bs.query_history_k_data_plus(
"sz.000001",
"date,time,open,high,low,close,volume",
start_date="2024-07-20", end_date="2024-08-20",
frequency="5")
三、财务数据:三张表一次到位
Baostock 财报字段完整且免费,但一次只能取一只股票一个季度。
用 asyncio + aiofiles 把 5000 只股票 10 年历史写成 parquet,只需 6 分钟:
import asyncio, aiohttp, aiocsv, aiofiles
async def fetch_fina(code):
loop = asyncio.get_event_loop()
rs = await loop.run_in_executor(
None, bs.query_profit_data, code, 2023, 4)
return pd.DataFrame(rs.get_data())
codes_split = [codes[i:i+200] for i in range(0, len(codes), 200)]
tasks = [asyncio.gather(*[fetch_fina(c) for c in chunk]) for chunk in codes_split]
四、把“免费”数据做成“生产级”
本地缓存层
• 日线/财报 parquet → DuckDB 查询,毫秒级;
• 分钟线 HDF5 → 按日期切片,mmap 读取。交叉验证
用 Wind/Baostock/聚宽三方日线做 diff,>0.01% 即报警。特征工厂
将 Baostock 字段直接喂给 Pandas-TA 或 talib,一行代码生成 100+ 技术因子:import pandas_ta as ta daily_df["MACD"] = ta.macd(daily_df.close, fast=12, slow=26, signal=9)["MACD_12_26_9"]
回测/实盘无缝
• Backtrader 接入:把query_history_k_data_plus
封装成 DataFeed;
• RealTrade:用schedule
定时拉取最新日线并更新仓控。
五、官方没告诉你但极香的“隐藏技巧”
| 技巧 | 代码片段 | 场景 |
| 可转债日线 | query_history_k_data_plus("sz.123456")
| 低价转债策略 |
| 复权因子表 | query_adjust_factor("sh.000001", start, end)
| 自己算复权,防平台差异 |
| 交易日历 | query_trade_dates("2024-01-01", "2024-12-31")
| 回测对齐、停牌填充 |
| 限速优化 | 本地缓存 + 增量更新 | 避免触发 QPS 上限 |
一句话总结
把 Baostock 当“底仓”:
• 免费、稳定、全量历史一次落盘;
• 再用 Wind/聚宽补齐实时 Tick;
这样 90% 需求用 0 元解决,10% 高端需求按需付费,成本和风险同时降到最低。