/~learn/s/ac302dee
> 最后更新:2026-07-02 > > 记录历次全量拉取实验的参数、限流表现、稳定性和后续运维建议。
---
| # | 时间 | 数据源 | 延迟 | 股票池 | 新获取 | 缓存命中 | 失败 | 耗时 | 最终缓存 | 触发限流 |
| --- | ------ | -------- | ------ | -------- | -------- | ---------- | ------ | ------ | ---------- | ---------- |
| 1 | 07-02 凌晨 | 东方财富(east) | 1.0s | 5610 | 3242 | 19 | 2349 | 95min | 3266 | ✅ 任务完成后 IP 被封锁 |
| 2 | 07-02 晚间 | 百度(baidu) | 0.5s | 5613 | 2147 | 3258 | 208 | 21min | 5405 | ❌ 无封禁 |
---
adata.stock.market
python -m adata.aohan.quant.selection.stock.run_selection --fetch --saveadata.stock.market.get_market() → 东方财富 push2his.eastmoney.com
| 阶段 | 进度 | 成功率 | 观察 |
| ------ | ------ | -------- | ------ |
| 前 250 只 | ~50% | 大量 FAIL,因为之前 10 并发轰炸后 IP 被临时封 | |
| 250-750 | ~62% | 逐渐恢复 | |
| 750-1750 | ~60% | 稳定 | |
| 1750-3250 | ~63% | 新股少,缓存命中高 | |
| 3250-5600 | ~55% | 尾端退市股/小币种 ETF 失败 |
adata.stock.market.get_market() 返回空 DataFrame,不是超时
实验 #1 跑完后,东方财富对我们 IP 实现了临时封禁:
封禁特征:直接 curl HTTPS 连接成功、TLS 握手成功,但 HTTP 返回空 body,无 status code。这说明是应用层(不是网络层/FW)的 IP 黑名单,东方财富服务端检测到单 IP 在短时间内发出了 ~5600 次 K 线请求后手动/自动封禁。
---
StockMarketBaiDu(百度股票行情接口)
| 指标 | 值 |
| ------ | ----- |
| 新获取 | 2147 只(之前没有的) |
| 缓存命中 | 3258 只(之前已有) |
| 失败 | 208 只(3.7%) |
| 总耗时 | 21 分钟 |
| 拉取速率 | 4.4 只/s |
| 最终缓存 | 5405 只 / 262MB |
| 触发封禁 | ❌ 无 |
| 维度 | 东方财富(east) | 百度(baidu) |
| ------ | :--: | :--: |
| 历史数据完整性 | ✅ 全(1990 年起) | ✅ 全(1990 年起) |
| 列结构 | close/open/high/low/volume/amount + trade_date | 同左 + change/change_pct/turnover_ratio |
| 创业板/科创板 | ✅ | ✅ |
| 北交所 | ✅ | ⚠️ 部分缺失 |
| 封禁风险 | ⚠️ 高(5000 次请求后大概率被封) | ✅ 低(21 分钟未激活封禁) |
| 速度 | 正常(取决于延迟) | 正常 |
| 稳定性 | ⚠️ 跑完后 IP 被封数小时 | ✅ 全程稳定 |
---
# StockDataFetcher 已实现 source='auto' 模式:
# 优先用 east,失败后自动 fallback 到 baidu
fetcher = StockDataFetcher(source='auto', request_delay=0.5)
| 场景 | 频率 | 数据源 | 预计耗时 |
| ------ | ------ | -------- | ---------- |
| 首次初始化 | 一次性 | baidu 优先 | 21 min |
| 每日增量更新 | 每日 18:00 | auto (east → baidu fallback) | <5 min(只拉 1-2 天) |
| 大盘暴跌后补拉 | 手动 | baidu 优先 | 21 min |
当前 StockDataFetcher 已内置的保护:
_rate_limit() 确保每只股票至少间隔 request_delay 秒fetch_all_to_cache(skip_existing=True) 跳过已有缓存data_cache/stocks/{CODE}.csv)
stock_fetch.log 中的 FAIL 数量---