一句话:把“免费、稳定”优势发挥到极致,同时补齐“实时、深度”短板。下面给出一条从“拿得到”到“用得好”的完整流水线,可直接复制到你的生产环境。

一、先把数据一次拿全

  1. 全市场代码表(含退市)
    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+ 股票/指数
    
  2. 并行下载日线(向后复权)
    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]

四、把“免费”数据做成“生产级”

  1. 本地缓存层
    • 日线/财报 parquet → DuckDB 查询,毫秒级;
    • 分钟线 HDF5 → 按日期切片,mmap 读取。

  2. 交叉验证
    用 Wind/Baostock/聚宽三方日线做 diff,>0.01% 即报警。

  3. 特征工厂
    将 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"]
    
  4. 回测/实盘无缝
    • 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% 高端需求按需付费,成本和风险同时降到最低。