2026年用Python获取 A 股股票数据的 3 种方式

用户头像sh_*2176oo
2026-08-28 发布

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

注册账号后免费即可运行以上所有代码。


评论