2026 年用 Python 获取 A 股股票数据的 3 种方式(附完整代码)
用 Python 做量化分析、选股、回测,第一步都是同一个问题:怎么拿到股票数据?
2026 年,Python 获取 A 股数据主要有三种方式:开源爬虫库、付费数据平台、专业数据 API。每种方式的适用场景不同,这篇文章全部跑一遍,代码直接能用。
方式一:开源爬虫库(akshare / efinance)
原理
akshare 和 efinance 本质上是爬虫封装——它们把东方财富、新浪财经等网站的数据接口包装成 Python 函数。免费、开源、不需要注册。
安装
pip install akshare
获取日 K 线
import akshare as ak
# 获取贵州茅台的日 K 线(前复权)
df = ak.stock_zh_a_hist(
symbol="600519",
period="daily",
start_date="20260101",
end_date="20260828",
adjust="qfq"
)
print(df.head())
输出的列名是中文(日期、开盘、收盘、最高、最低、成交量),做后续分析时需要手动重命名。
获取实时行情
# 获取全部 A 股实时行情
df_all = ak.stock_zh_a_spot_em()
print(f"共 {len(df_all)} 只股票")
print(df_all[["代码", "名称", "最新价", "涨跌幅", "成交额"]].head(10))
优点和局限
| 优点 | 局限 |
|---|---|
| 免费、开源 | 底层是爬虫,接口稳定性取决于被爬的网站 |
| 数据种类多(股票、基金、期货、宏观) | 请求频率受限,批量获取需要加time.sleep |
| 社区活跃 | 东方财富改版后接口可能失效 |
| 不需要注册 | 没有原生批量接口,只能循环获取 |
适合场景: 学习入门、一次性分析、对稳定性要求不高的场景。
方式二:数据平台 API(Tushare Pro)
原理
Tushare Pro 是一个有自己服务端的数据平台。你注册账号获得 Token,通过 API 拉取数据。数据不是爬来的,相对稳定。
安装和初始化
pip install tushare
import tushare as ts
pro = ts.pro_api("你的Token")
获取日 K 线
# 获取贵州茅台日线
df = pro.daily(ts_code="600519.SH", start_date="20260101", end_date="20260828")
# 注意:返回数据是倒序的(最新的在前面)
df = df.sort_values("trade_date")
print(df.head())
Tushare 的 daily 接口返回的是不复权数据。要前复权需要额外拉复权因子:
# 拉复权因子
adj = pro.adj_factor(ts_code="600519.SH", start_date="20260101", end_date="20260828")
adj = adj.sort_values("trade_date")
# 合并并计算前复权价
df = df.merge(adj[["trade_date", "adj_factor"]], on="trade_date")
df["close_adj"] = df["close"] * df["adj_factor"] / df["adj_factor"].iloc[-1]
获取实时行情
Tushare 的实时行情需要较高积分(≥2000),普通用户通常使用盘后日线数据。
优点和局限
| 优点 | 局限 |
|---|---|
| 正式 API,不是爬虫 | 积分/会员体系复杂,高级数据需充值 |
| 数据全面(含财务报表、分红等) | 有频率限制(免费 200 次/分钟) |
| 历史数据长 | 复权需手动计算 |
| 社区大,文档资料多 | 批量获取多只股票仍需循环 |
适合场景: 需要财务数据的深度研究、愿意付费获取全面数据的个人。
方式三:专业数据 API(AlphaFeed)
原理
AlphaFeed 是专为量化场景设计的数据 API,提供 A 股、美股、港股数据。正式 API(不是爬虫),SDK 内置批量并发、自动重试、复权参数。注册后免费版即可获取 A 股实时行情和日 K 线。
安装和初始化
pip install alphafeed
from alphafeed import AlphaFeed
af = AlphaFeed() # 自动读取配置好的 API Key
获取日 K 线
# 获取贵州茅台日 K 线(前复权,最近 60 根)
df = af.klines.get("600519.SH", period="1d", count=60,
adjust="forward", to_dataframe=True)
print(df.head())
列名是标准英文(open, high, low, close, volume, amount),返回按时间正序排列,直接可以用于计算指标。
复权是 API 参数,支持 5 种模式:
# 前复权(回测用)
df = af.klines.get("600519.SH", period="1d", count=60, adjust="forward", to_dataframe=True)
# 后复权(计算真实收益)
df = af.klines.get("600519.SH", period="1d", count=60, adjust="backward", to_dataframe=True)
# 不复权(检测涨停跌停)
df = af.klines.get("600519.SH", period="1d", count=60, adjust="none", to_dataframe=True)
获取实时行情
# 单只股票
quote = af.quotes.get(symbols=["600519.SH"], to_dataframe=True)
# 全部 A 股(一行搞定)
all_cn = af.quotes.get(universes="CN_Stock", to_dataframe=True)
print(f"共 {len(all_cn)} 只")
批量获取多只股票 K 线
symbols = ["600519.SH", "000001.SZ", "300750.SZ", "601318.SH", "002594.SZ"]
# 5 只票一次搞定,SDK 自动并发
dfs = af.klines.batch(symbols, period="1d", count=60,
adjust="forward", to_dataframe=True)
for sym, df in dfs.items():
print(f"{sym}: {len(df)} 根 K 线")
获取五档盘口
depth = af.depth.get("600519.SH")
print(f"买一: {depth.bids[0].price} × {depth.bids[0].volume}")
print(f"卖一: {depth.asks[0].price} × {depth.asks[0].volume}")
获取分钟线
# 获取日内 1 分钟 K 线
df_1m = af.klines.intraday("600519.SH", period="1m", to_dataframe=True)
print(f"今日 {len(df_1m)} 根 1 分钟 K 线")
优点和局限
| 优点 | 局限 |
|---|---|
| 正式 API,接口稳定 | 暂无财务报表数据 |
| 原生批量接口(batch),内置并发和重试 | 全市场查询需 Starter 订阅 |
| A 股 / 美股 / 港股统一接口 | 数据种类不如 akshare 广 |
| 5 种复权模式,参数直接指定 | 专注行情数据 |
| 免费版含实时行情 + 日 K 线 + 盘口 |
适合场景: 认真做量化、需要批量高效获取数据、脚本要长期自动运行。
三种方式的核心差异
| 对比 | akshare(爬虫) | Tushare Pro(平台) | AlphaFeed(API) |
|---|---|---|---|
| 数据来源 | 爬第三方网站 | 自有服务 | 自有服务 |
| 注册 | 不需要 | 需要(Token) | 需要(API Key) |
| 费用 | 免费 | 免费 + 积分制 | 免费版 + 付费版 |
| 实时行情 | ✅ 爬取 | ⚠️ 高积分 | ✅ 免费 |
| 批量获取 | ❌ 循环 + sleep | ❌ 循环 + sleep | ✅ batch |
| 复权 | 参数指定 | 手动计算 | 参数指定(5 种) |
| 稳定性 | ⚠️ 依赖第三方 | ✅ 较稳定 | ✅ 稳定 |
| 周线/月线 | ❌ 需自己合成 | ⚠️ 部分支持 | ✅ 参数直接指定 |
| 五档盘口 | ⚠️ 不稳定 | ❌ 实时盘口有限 | ✅ |
| 分钟线 | ⚠️ 爬取 | ⚠️ 需积分 | ✅ |
| 多市场 | A 股为主 | A 股为主 | A / 美 / 港 |
怎么选
刚学 Python,想先跑通代码:
→ akshare,零门槛,装上就能用
需要财务数据、基本面研究:
→ Tushare Pro,数据维度最全
做量化选股/回测,要批量拉数据、要稳定运行:
→ AlphaFeed,专为这个场景设计
三个都想试试? 花 10 分钟各跑一段上面的代码,体感最直观。
快速开始模板
不管你选哪个方式,下面是一个"获取数据 → 算均线 → 画图"的完整模板,用 AlphaFeed 实现:
from alphafeed import AlphaFeed
import pandas as pd
af = AlphaFeed()
# 获取数据
df = af.klines.get("600519.SH", period="1d", count=120,
adjust="forward", to_dataframe=True)
# 计算均线
df["ma5"] = df["close"].rolling(5).mean()
df["ma20"] = df["close"].rolling(20).mean()
df["ma60"] = df["close"].rolling(60).mean()
# 最新状态
latest = df.iloc[-1]
trend = "多头排列" if latest["ma5"] > latest["ma20"] > latest["ma60"] else "非多头"
print(f"600519.SH 最新收盘: {latest['close']:.2f}")
print(f"MA5={latest['ma5']:.2f} MA20={latest['ma20']:.2f} MA60={latest['ma60']:.2f}")
print(f"均线状态: {trend}")
pip install alphafeed
注册账号后免费即可运行以上所有代码。
- AlphaFeed 官网:https://alphafeed.org/
- AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
- akshare 文档:https://akshare.akfamily.xyz/
- Tushare 文档:https://tushare.pro/

