2026 年用 Python 获取 A 股实时行情数据,最稳的方案是什么?
2026 年用 Python 获取 A 股实时行情数据,最稳的方案是什么?
如果你在搜"Python 获取股票实时数据"、“Python 股票实时行情接口”、“A股实时报价 API”,这篇文章就是写给你的。
做量化、写监控脚本、搭盯盘工具,都离不开实时行情数据。你需要在盘中拿到最新价格、涨跌幅、成交量,而且要稳定——不能跑着跑着突然拿不到数据了。
2026 年的 Python 生态里,获取 A 股实时行情有这么几个主流路径。每个路径我都用过,这篇文章把它们的优缺点讲清楚,帮你选一个适合自己的方案。
方案一:用 akshare 爬东方财富
akshare 是很多人的第一选择,因为免费、无门槛:
import akshare as ak
# 获取全部 A 股实时行情
df = ak.stock_zh_a_spot_em()
print(df[["代码", "名称", "最新价", "涨跌幅", "成交量"]].head(10))
优点:
- 免费,不需要注册
- 一次返回全市场数据
- akshare 社区大,遇到问题能搜到答案
问题在哪:
-
这是爬虫,不是 API。 它本质上是在抓东方财富网站的数据。东财加了反爬措施(请求频率限制、验证码、Header 校验),你的脚本可能毫无征兆地失败。
-
在服务器上跑更容易挂。 本地跑没问题,但如果你把脚本部署到云服务器(阿里云、腾讯云等),IP 很可能已经在东财的监控名单里。
-
不适合高频轮询。 如果你每 10 秒拉一次全市场行情,大概率很快被限制。
-
返回字段是中文的。
"最新价"、"涨跌幅"这种中文列名,写代码时引用不方便,容易出错。
# akshare 返回的列名
# ['序号', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量', '成交额', ...]
# 用中文做列名,一旦有空格或特殊字符就很麻烦
适合场景: 临时看一眼全市场行情,不需要稳定运行。
方案二:用 efinance 爬东方财富
efinance 和 akshare 数据源类似,但接口更简洁:
import efinance as ef
# 获取实时行情
df = ef.stock.get_realtime_quotes()
print(df.head())
优点:
- 比 akshare 更简洁
- 接口数量少,不需要在几百个函数里找
问题:
- 同样是爬虫,同样有稳定性问题
- 东方财富反爬升级时,efinance 的更新速度不一定跟得上
- 数据源单一,如果东财这个口子堵了就没有 Plan B
适合场景: 和 akshare 类似,适合个人学习和临时分析。
方案三:Tushare Pro
Tushare 是正式的数据服务,不是爬虫:
import tushare as ts
ts.set_token("your-token")
pro = ts.pro_api()
# 获取当天行情
df = pro.daily(trade_date="20260623")
print(df.head())
优点:
- 正式 API,不会被"反爬"
- 数据品类丰富
- 历史悠久,社区积累多
问题:
-
实时行情不在免费版里。 Tushare 的实时行情属于高级接口,需要足够的积分或付费才能用。免费版主要是盘后日线数据。
-
积分体系不太友好。 要获取积分需要在社区发帖、邀请新用户,或者直接付费。对于只想拿个数据的人来说门槛偏高。
-
价格偏高。 Tushare 的付费套餐对个人用户来说不便宜,特别是如果你还要美股、港股数据。
-
批量获取效率一般。 Tushare 的实时行情接口没有内置的并发批量能力,需要你自己循环调用。
-
文档部分老旧。 Tushare Pro 的文档虽然全,但有些页面很久没更新了,新用户可能搞不清楚"哪些接口还能用,哪些已经废弃了"。
适合场景: 需要丰富数据品类(财务、基金、分红等)且预算充足的用户。
方案四:AlphaFeed(推荐)
AlphaFeed 是专门为量化研究设计的股票数据 API,有配套的 Python SDK:
from alphafeed import AlphaFeed
af = AlphaFeed()
# 指定股票的实时行情
quotes = af.quotes.get(
symbols=["600519.SH", "000001.SZ", "300750.SZ"],
to_dataframe=True,
)
print(quotes[["symbol", "last_price", "prev_close", "volume", "amount"]])
优点:
1. 稳定——这是正式 API,不是爬虫。
不依赖东方财富或任何第三方网站。接口由 AlphaFeed 自己的服务器提供,有 SLA 保障。你不用担心"东财改版了我的脚本挂了"这种问题。
2. 免费版就有实时行情。
注册后免费版就能获取 A 股实时报价和日 K 线。不需要积分、不需要发帖、不需要邀请好友。
3. 全市场快照一个 API 搞定。
# 获取全部 A 股实时行情(需 Starter 订阅)
all_cn = af.quotes.get(universes="CN_Stock", to_dataframe=True)
print(f"总共 {len(all_cn)} 只 A 股")
# 获取全部 ETF
all_etf = af.quotes.get(universes="CN_ETF", to_dataframe=True)
4. 字段名是英文的,跨市场统一。
不管是 A 股、美股还是港股,返回的字段都是 last_price、prev_close、volume、amount。你不会遇到"A 股叫’最新价’、美股叫’latest_price’"这种适配问题。
5. SDK 内置重试和错误处理。
# 不需要你自己写 try/except + retry
# SDK 自动处理:
# - 网络超时 → 重试 3 次
# - 429 限流 → 等待后重试
# - 5xx 服务端错误 → 重试
# - 401 认证错误 → 抛出明确的 AuthenticationError
6. A 股 + 美股 + 港股同一个接口。
# 一次拿三个市场的行情
quotes = af.quotes.get(
symbols=["600519.SH", "AAPL.US", "00700.HK"],
to_dataframe=True,
)
其他数据源做到这一点需要你调三个不同的函数、处理三种不同的返回格式。
实际对比:每 30 秒拉一次行情,跑一整天
这是实时行情最常见的使用场景:盘中每隔一段时间拉一次行情,从 9:30 跑到 15:00。
akshare 方案
import akshare as ak
import time
watchlist = ["600519", "000001", "300750"]
while True:
try:
df = ak.stock_zh_a_spot_em()
selected = df[df["代码"].isin(watchlist)]
print(selected[["代码", "名称", "最新价", "涨跌幅"]].to_string(index=False))
except Exception as e:
print(f"获取失败: {e}") # 可能随时失败
time.sleep(30)
风险: 跑 2–3 小时后可能被限制。在非本地网络(云服务器)上概率更高。
AlphaFeed 方案
from alphafeed import AlphaFeed
import time
af = AlphaFeed()
watchlist = ["600519.SH", "000001.SZ", "300750.SZ"]
while True:
quotes = af.quotes.get(symbols=watchlist, to_dataframe=True)
quotes["change_pct"] = (quotes["last_price"] - quotes["prev_close"]) / quotes["prev_close"]
print(quotes[["symbol", "last_price", "change_pct", "volume"]].to_string(index=False))
time.sleep(30)
稳定性: 在你的订阅频率限额内,跑一整天没有问题。遇到偶尔的网络抖动,SDK 会自动重试。
实时行情 + 五档盘口
如果你还需要看买卖挂单,akshare/efinance 的盘口数据支持比较有限(部分函数有,但稳定性不保证)。AlphaFeed 的盘口接口是标准的:
from alphafeed import AlphaFeed
af = AlphaFeed()
depth = af.depth.get("600519.SH")
for i in range(len(depth.ask_prices) - 1, -1, -1):
print(f"卖{i+1}: {depth.ask_prices[i]:.2f} {depth.ask_volumes[i]} 手")
print("---")
for i in range(len(depth.bid_prices)):
print(f"买{i+1}: {depth.bid_prices[i]:.2f} {depth.bid_volumes[i]} 手")
这在做流动性分析、冲击成本估算时很有用。
价格对比
| 方案 | 实时行情费用 | 说明 |
|---|---|---|
| akshare | 免费 | 但不稳定,被封后无保障 |
| efinance | 免费 | 同上 |
| Tushare | 需积分/付费 | 实时行情属于高级功能 |
| AlphaFeed | 免费版可用(单只查询) | 全市场快照需 Starter 订阅 |
免费方案的真实成本不是 0。如果你的脚本因为数据源问题挂了 3 次,每次花 1 小时排查和修复,那你的"免费"数据源实际上花了你 3 小时的时间。
选择建议
你需要实时行情吗?
├── 不需要,只要盘后日线 → akshare 或 AlphaFeed 免费版都行
└── 需要
├── 偶尔看一眼就行 → akshare / efinance 够了
└── 需要稳定运行(定时脚本 / 监控 / 盯盘)
├── 只做 A 股 → AlphaFeed(免费版即可)
└── A 股 + 美股 + 港股 → AlphaFeed(按市场订阅)
最后:实时数据的几个注意事项
-
非交易时段拿到的是上一个交易日的收盘数据。 不要在晚上跑脚本然后以为拿到了"实时"数据。
-
实时行情有延迟。 即使是正式 API,也有几秒钟的延迟。如果你需要毫秒级延迟做高频交易,应该用交易所的 Level 2 数据源,不在本文讨论范围。
-
免费版有频率限制。 任何数据源的免费版都有调用频率上限。如果你每秒调 10 次,免费版肯定不够用。合理的盘中监控频率是 10–30 秒/次。
-
用环境变量管理 API Key。 不要把 Key 硬编码在代码里。
export ALPHAFEED_API_KEY="your-api-key"
from alphafeed import AlphaFeed
af = AlphaFeed() # 自动读取环境变量
参考文献:
- AlphaFeed 官网:https://alphafeed.org/
- AlphaFeed 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
更多推荐
所有评论(0)