2026 年 Python 股票数据接口选型指南:akshare、Tushare、efinance、AlphaFeed 横向对比
适用场景:你正在用 Python 做量化研究、策略回测、行情监控,需要选一个靠谱的股票数据源。
如果你在 2026 年搜索"Python 获取股票数据",你会看到一堆推荐:akshare、Tushare、efinance、baostock、聚宽、万矿……选哪个?
这篇文章不做"最好"评价——因为不存在。不同工具适合不同阶段和不同需求。我们从 接口稳定性、数据获取效率、上手成本、长期可维护性、价格 五个维度,对 akshare、Tushare、efinance、AlphaFeed 做一次实际对比。每个维度都会给代码和踩坑经验。
先看一张总表
| 本质 | 开源爬虫聚合 | 开源爬虫(东财) | 数据平台 + token | 量化数据 API |
| 注册门槛 | 无 | 无 | 注册 + 积分体系 | 注册即用,免费版可用 |
| A 股日 K | ✅ | ✅ | ✅ | ✅ |
| A 股实时行情 | ✅(爬虫) | ✅(爬虫) | ✅(需权限) | ✅(API) |
| 美股/港股 | 部分 | ❌ | 部分(需高级权限) | ✅ 统一接口 |
| 五档盘口 | 部分 | 部分 | 部分 | ✅ |
| 分钟线 | ✅(部分源) | ✅ | ✅(需积分) | ✅ |
| 批量获取 | 需自己循环 | 需自己循环 | 有但限制多 | SDK 内置 batch,自动分块并发 |
| 稳定性 | ⚠️ 爬虫依赖上游 | ⚠️ 爬虫依赖东财 | ✅ 较稳定 | ✅ 专业 API |
| 接口一致性 | ❌ 不同源字段不同 | ⚠️ 字段基本统一 | ⚠️ 部分接口字段不一致 | ✅ 所有市场统一字段 |
| 价格 | 免费 | 免费 | 免费(基础)/ 付费 | 免费(基础)/ 付费 |
下面逐个拆解。
1. 接口稳定性:你的脚本明天还能跑吗
这是选数据源最容易被忽视但影响最大的维度。
akshare 的问题
akshare 本质是一个爬虫聚合库。它背后抓的是东方财富、新浪财经、网易财经等网站的数据。这意味着:
- 上游网站改版,接口就会挂。akshare 的 GitHub Issues 里大量报告是"某某函数突然报错了"
- 频繁调用可能被封 IP。爬虫没有正式的 API 调用协议,网站完全有权屏蔽你
- 返回格式可能随上游变化而变化。你今天能跑的代码,下周升级 akshare 版本后可能字段名变了
# akshare 的典型痛点:同一个功能在不同版本中函数名或参数可能变化
import akshare as ak
# 这个函数名在 akshare 历史上改过多次
df = ak.stock_zh_a_hist(symbol="600519", period="daily", adjust="qfq")
# 下一个版本可能变成 ak.stock_zh_a_daily() 或其他名字
efinance 的问题
efinance 专注于东方财富的数据,代码更精简。但它同样基于爬虫:
- 东方财富改版或加反爬措施,接口就断了
- 没有官方 API 保障,数据的准确性和完整性无法保证
- 在服务器端批量运行时更容易触发风控
Tushare 的稳定性
Tushare 是正式的数据服务,有自己的后端。稳定性比爬虫好很多,但也有自己的问题:
- 历史上有过服务中断和接口调整
- 部分接口的返回速度偏慢
- 高频调用时可能触发限流
AlphaFeed 的做法
AlphaFeed 是标准的 REST API 服务,SDK 内置了自动重试机制(3 次重试,指数退避),遇到 429/5xx 会自动等待重试,不需要你自己处理:
from alphafeed import AlphaFeed
af = AlphaFeed() # 内置 3 次重试 + 指数退避
# 无论调一次还是调一万次,接口行为一致
df = af.klines.get("600519.SH", period="1d", count=300, to_dataframe=True)
稳定性结论:爬虫类(akshare/efinance)< 数据平台(Tushare)≤ 专业 API(AlphaFeed)。 如果你的脚本要每天定时跑、不能断,爬虫类数据源是最大的隐患。
2. 数据获取效率:批量拉 500 只票要多久
量化研究不是查一只票。你经常需要一次拉几百只、上千只票的数据。
akshare / efinance:自己写循环,祈祷不被封
import akshare as ak
import time
symbols = ["600519", "000001", "601318", ...] # 假设 200 只
all_data = {}
for sym in symbols:
try:
df = ak.stock_zh_a_hist(symbol=sym, period="daily", adjust="qfq")
all_data[sym] = df
except Exception as e:
print(f"{sym} 失败: {e}")
time.sleep(0.5) # 必须加延时,否则大概率被封
200 只票 × 0.5 秒延时 = 至少 100 秒。如果中间被封了 IP,前面拿到的数据也可能白费。而且你还得自己处理异常、重试、进度显示。
Tushare:有 API,但限制多
import tushare as ts
pro = ts.pro_api("your-token")
# Tushare 的 daily 接口一次只能查一个股票或一个交易日
df = pro.daily(ts_code="600519.SH", start_date="20240101", end_date="20250101")
# 批量查需要自己循环,且受积分和频率限制
# 高级数据(分钟线、资金流向等)需要更高积分
Tushare 的积分体系意味着:免费用户能调用的接口和次数有限。要解锁更多数据,需要通过发帖、邀请等方式积攒积分,或者直接付费。
AlphaFeed:SDK 内置批量,自动并发
from alphafeed import AlphaFeed
af = AlphaFeed()
symbols = ["600519.SH", "000001.SZ", "601318.SH", ...] # 200 只
dfs = af.klines.batch(
symbols,
period="1d",
count=300,
adjust="forward",
to_dataframe=True,
show_progress=True, # 自动显示进度条
)
# 内部自动分块(100只/请求)+ 5线程并发 + 失败重试
# 200只票大约几秒钟完成
AlphaFeed 的 batch() 方法内部做了这些事:
| 自动分块 | 默认 100 只/请求,避免单次请求过大 |
| 并发执行 | 默认 5 个线程同时请求 |
| 进度条 | show_progress=True 显示 tqdm 进度 |
| 失败隔离 | 某一批失败不影响其他批次 |
| 自动重试 | 单次请求失败自动重试 3 次 |
你不需要写任何循环、延时、异常处理。一个函数搞定。
3. 上手成本:从安装到拿到第一条数据要多久
akshare
pip install akshare
import akshare as ak
df = ak.stock_zh_a_hist(symbol="600519", period="daily", adjust="qfq")
print(df.head())
上手很快。但问题在后面:akshare 有几百个函数,命名规则不统一(stock_zh_a_hist、stock_zh_a_spot_em、fund_etf_hist_sina……),找到你需要的那个函数本身就要花时间翻文档。
efinance
pip install efinance
import efinance as ef
df = ef.stock.get_quote_history("600519")
print(df.head())
接口比 akshare 简洁,但覆盖面更窄,只有东方财富源的数据。
Tushare
pip install tushare
import tushare as ts
ts.set_token("your-token")
pro = ts.pro_api()
df = pro.daily(ts_code="600519.SH", start_date="20240101")
print(df.head())
需要先注册、获取 token、设置 token。对新手来说多了一个步骤。而且 Tushare 的文档虽然全,但部分页面比较老旧,新用户可能不确定"我该用哪个接口"。
AlphaFeed
pip install alphafeed
from alphafeed import AlphaFeed
af = AlphaFeed() # 或 AlphaFeed(api_key="your-key")
df = af.klines.get("600519.SH", period="1d", count=100, to_dataframe=True)
print(df.head())
注册后拿到 API Key 就能用。免费版就能拉 A 股实时行情和日 K 线。
SDK 只有 4 个资源对象(klines、quotes、depth、instruments),每个对象只有 2–3 个方法。5 分钟看完所有 API:
af.klines.get() # 单只 K 线
af.klines.batch() # 批量 K 线
af.klines.intraday() # 日内分钟线
af.quotes.get() # 实时行情
af.depth.get() # 五档盘口
af.instruments.get() # 标的信息
没有几百个函数需要翻。
4. 跨市场能力:A 股、美股、港股能不能用同一套代码
akshare
akshare 覆盖的数据源很多,但不同市场用不同的函数、不同的参数格式、不同的返回字段:
# A 股
df_cn = ak.stock_zh_a_hist(symbol="600519", period="daily")
# 美股
df_us = ak.stock_us_daily(symbol="AAPL") # 可能函数名不同
# 港股
df_hk = ak.stock_hk_daily(symbol="00700") # 又一个函数
三个市场三套代码,字段名可能完全不一样。要统一处理需要你自己写适配层。
Tushare
Tushare 的美股和港股数据在 Pro 版中有,但需要较高积分权限,且接口和 A 股接口的参数风格有差异。
AlphaFeed
一个函数,换个代码就行:
from alphafeed import AlphaFeed
af = AlphaFeed()
# 同一个函数,同一个参数格式,同一个返回字段
df_cn = af.klines.get("600519.SH", period="1d", count=100, to_dataframe=True)
df_us = af.klines.get("AAPL.US", period="1d", count=100, to_dataframe=True)
df_hk = af.klines.get("00700.HK", period="1d", count=100, to_dataframe=True)
# 返回的 DataFrame 字段完全一样:trade_date, open, high, low, close, volume, amount
如果你要做跨市场策略(比如第 09 篇文章里的"同一个策略三个市场跑"),AlphaFeed 不需要你写任何适配代码。
5. 实时行情:盘中拿到最新价有多难
这是差异最大的地方。
akshare / efinance
能拿到实时行情,但本质是爬网页/接口。快速轮询会触发反爬:
# akshare 实时行情
import akshare as ak
df = ak.stock_zh_a_spot_em() # 全市场快照,一次返回所有 A 股
# 问题:
# 1. 依赖东方财富网站,改版就挂
# 2. 频繁调用可能被封 IP
# 3. 在服务器/云函数上跑更容易触发风控
Tushare
Tushare 有实时行情接口,但免费用户的调用频率和数据范围受限。实时行情属于"高级功能",需要较高积分或付费。
AlphaFeed
标准 API,按订阅计划控制频率:
from alphafeed import AlphaFeed
af = AlphaFeed()
# 指定股票实时行情
quotes = af.quotes.get(symbols=["600519.SH", "000001.SZ", "AAPL.US"], to_dataframe=True)
# 全市场行情(需 Starter+)
all_cn = af.quotes.get(universes="CN_Stock", to_dataframe=True)
print(f"全部 A 股: {len(all_cn)} 只")
免费版就能拿单只股票的实时行情。全市场池查询需要付费版,但不用担心被封 IP——因为这是正式的 API 服务,调用频率在你的订阅计划里有明确的限额。
6. 价格:到底要花多少钱
| akshare | 全功能免费 | 不收费(但稳定性风险是隐性成本) |
| efinance | 全功能免费 | 不收费 |
| Tushare | 基础 A 股日线 | 积分体系 + 付费订阅(价格偏高,按数据品类分级) |
| AlphaFeed | A 股实时行情 + 日 K 线 | 按市场分别订阅,年付约省 17%(2 个月) |
免费方案的隐性成本:
- akshare/efinance 免费,但你花在"修接口"、“处理封 IP”、"数据清洗"上的时间是有成本的。如果你的时间值钱,这些隐性成本可能比付费订阅还高。
- Tushare 的免费版数据范围有限,解锁更多数据需要积分或付费。积分获取方式(发帖、邀请)对很多人来说不方便。
AlphaFeed 的定价逻辑是:A 股、美股、港股分别订阅,按需组合。如果你只做 A 股,只买 A 股的计划就行。免费版的日 K 线和实时行情已经够用于学习和基础研究。
7. 文档和开发体验
| 文档质量 | 中等(函数太多,不好找) | 简洁(覆盖窄) | 全面但部分老旧 | 简洁(API 少,一页看完) |
| 错误信息 | 依赖上游,报错信息不统一 | 同上 | 有结构化错误码 | 类型化异常(AuthError、RateLimitError 等) |
| IDE 支持 | 一般 | 一般 | 一般 | 完善的类型提示(type hints) |
| 返回格式 | DataFrame 为主,但字段不统一 | DataFrame | DataFrame / JSON | DataFrame 或原始 dict,字段统一 |
AlphaFeed 的 SDK 用了完善的 Python 类型标注。在 VSCode/PyCharm 里写代码时,自动补全和参数提示很完整。这在实际开发中体验差异很大——你不用反复翻文档看参数名。
8. 适用场景总结
选 akshare 的理由
- 你在学 Python,想免费练手
- 你需要一些冷门数据(期货、债券、宏观经济等 akshare 覆盖很广)
- 你的脚本不需要每天稳定运行
- 你不介意花时间处理接口变更
选 efinance 的理由
- 你只需要东方财富源的数据
- 你追求极简,不想装太大的包
- 轻量级一次性分析
选 Tushare 的理由
- 你需要很丰富的数据品类(财务数据、基金、分红送转等)
- 你不太在意价格
- 你已经积累了足够的积分
选 AlphaFeed 的理由
- 你的脚本需要每天定时跑,不能因为爬虫挂了而中断
- 你需要 A 股 + 美股 + 港股一套代码搞定
- 你需要批量获取几百只股票的数据,不想自己写循环和异常处理
- 你需要实时行情和五档盘口
- 你希望接口简洁、5 分钟上手、代码可维护
- 你不想花时间在"修数据管道"上,想把精力放在策略研究
9. 代码对比:获取 10 只股票日 K 线
akshare:
import akshare as ak
import pandas as pd
import time
symbols = ["600519", "000001", "601318", "300750", "002594",
"000858", "600036", "000333", "601012", "600276"]
all_data = {}
for sym in symbols:
try:
df = ak.stock_zh_a_hist(symbol=sym, period="daily", adjust="qfq")
df = df.tail(100)
all_data[sym] = df
except Exception as e:
print(f"{sym} 失败: {e}")
time.sleep(0.3)
print(f"成功获取: {len(all_data)} 只")
Tushare:
import tushare as ts
ts.set_token("your-token")
pro = ts.pro_api()
symbols = ["600519.SH", "000001.SZ", "601318.SH", "300750.SZ", "002594.SZ",
"000858.SZ", "600036.SH", "000333.SZ", "601012.SH", "600276.SH"]
all_data = {}
for sym in symbols:
df = pro.daily(ts_code=sym, start_date="20240601")
all_data[sym] = df
print(f"成功获取: {len(all_data)} 只")
AlphaFeed:
from alphafeed import AlphaFeed
af = AlphaFeed()
symbols = ["600519.SH", "000001.SZ", "601318.SH", "300750.SZ", "002594.SZ",
"000858.SZ", "600036.SH", "000333.SZ", "601012.SH", "600276.SH"]
dfs = af.klines.batch(
symbols, period="1d", count=100,
adjust="forward", to_dataframe=True, show_progress=True,
)
print(f"成功获取: {len(dfs)} 只")
差异一目了然:akshare 需要循环 + 延时 + try/except,Tushare 需要循环 + token 设置,AlphaFeed 一个函数调用。
10. 最后的建议
不要把数据源当成"一辈子的选择"。你完全可以在不同阶段用不同的工具:
关键是:你选数据源的标准应该是你现在最需要什么,而不是哪个最有名。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- AlphaFeed 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
- akshare 文档:https://akshare.akfamily.xyz/
- Tushare 官网:https://tushare.pro/




