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 社区大,遇到问题能搜到答案

问题在哪:

  1. 这是爬虫,不是 API。 它本质上是在抓东方财富网站的数据。东财加了反爬措施(请求频率限制、验证码、Header 校验),你的脚本可能毫无征兆地失败。

  2. 在服务器上跑更容易挂。 本地跑没问题,但如果你把脚本部署到云服务器(阿里云、腾讯云等),IP 很可能已经在东财的监控名单里。

  3. 不适合高频轮询。 如果你每 10 秒拉一次全市场行情,大概率很快被限制。

  4. 返回字段是中文的。 "最新价""涨跌幅" 这种中文列名,写代码时引用不方便,容易出错。

# 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,不会被"反爬"
  • 数据品类丰富
  • 历史悠久,社区积累多

问题:

  1. 实时行情不在免费版里。 Tushare 的实时行情属于高级接口,需要足够的积分或付费才能用。免费版主要是盘后日线数据。

  2. 积分体系不太友好。 要获取积分需要在社区发帖、邀请新用户,或者直接付费。对于只想拿个数据的人来说门槛偏高。

  3. 价格偏高。 Tushare 的付费套餐对个人用户来说不便宜,特别是如果你还要美股、港股数据。

  4. 批量获取效率一般。 Tushare 的实时行情接口没有内置的并发批量能力,需要你自己循环调用。

  5. 文档部分老旧。 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_priceprev_closevolumeamount。你不会遇到"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(按市场订阅)

最后:实时数据的几个注意事项

  1. 非交易时段拿到的是上一个交易日的收盘数据。 不要在晚上跑脚本然后以为拿到了"实时"数据。

  2. 实时行情有延迟。 即使是正式 API,也有几秒钟的延迟。如果你需要毫秒级延迟做高频交易,应该用交易所的 Level 2 数据源,不在本文讨论范围。

  3. 免费版有频率限制。 任何数据源的免费版都有调用频率上限。如果你每秒调 10 次,免费版肯定不够用。合理的盘中监控频率是 10–30 秒/次。

  4. 用环境变量管理 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

更多推荐