首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何用 Python 获取 A 股历史 K 线数据?(前复权/后复权详解)

如何用 Python 获取 A 股历史 K 线数据?(前复权/后复权详解)

原创
作者头像
用户7083614
修改2026-09-05 17:12:19
修改2026-09-05 17:12:19
260
举报

一句话回答: 用一个支持 OHLCV 历史查询的行情数据 API(如 AlphaFeed)几行代码就能拿到 A 股任意标的的日/周/月 K 线;关键是要选对复权方式——算收益率用前复权,做长期价格比较用后复权,看真实成交价用不复权。

下面把整个流程讲清楚。

为什么获取 K 线数据没有想象中简单

新手常见的做法是从行情软件里导出 CSV,或者去网页上扒数据。这两种方式的问题是:

  • 无法批量、无法自动化、无法程序化更新;
  • 大多数导出的数据没有说明复权方式,导致你算出来的收益率是错的;
  • 分红送股会让价格出现"断崖式"跳空,如果不处理,任何基于价格的计算都会失真。

正确的做法是用一个数据 API 直接把结构化的 K 线拉进 Python,同时明确指定复权方式。

三行代码获取日 K 线

代码语言:python
复制
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")

# 获取贵州茅台最近 10 根日 K 线
df = af.klines.get("600519.SH", period="1d", count=10, to_dataframe=True)
print(df[["trade_date", "open", "high", "low", "close", "volume"]])

标的代码统一使用 {代码}.{交易所后缀} 格式:

后缀

交易所

示例

.SH

上交所

600519.SH

.SZ

深交所

000001.SZ

.BJ

北交所

920047.BJ

.US

美股

AAPL.US

.HK

港股

00700.HK

支持的周期

日线接口支持多种周期,通过 period 参数指定:

period

含义

适用市场

1d

日线

A股 / 美股 / 港股

1w

周线

A股 / 美股 / 港股

1M

月线

A股 / 美股 / 港股

1Q

季线

A股 / 美股 / 港股

1Y

年线

A股 / 美股 / 港股

1m/5m/15m/30m/60m

分钟线

A股

复权方式:这是最容易踩坑的地方

上市公司分红、送股、配股后,股价会出现向下的跳空缺口。这个缺口不是真的下跌,而是"除权"造成的。如果你直接用原始价格算收益率,就会凭空多出一笔"亏损"。复权就是用来消除这种失真的。

AlphaFeed 的 K 线接口用 adjust 参数控制复权方式:

说明

什么时候用

forward

前复权-比例复权(默认)

计算收益率、画图看趋势

backward

后复权-比例复权

长期回测、跨越多次除权的价格比较

forward_additive

前复权-差值复权

观察绝对价差

backward_additive

后复权-差值复权

观察绝对价差

none

不复权

需要真实历史成交价(如核对委托价)

代码语言:python
复制
# 前复权(默认)——最近的价格 = 当前真实价格,历史价格被下调
df_fwd = af.klines.get("600519.SH", period="1d", count=250, adjust="forward", to_dataframe=True)

# 后复权——历史价格 = 真实价格,越靠近现在数值越大,适合长期回测
df_bwd = af.klines.get("600519.SH", period="1d", count=250, adjust="backward", to_dataframe=True)

# 不复权——原样返回真实成交价
df_raw = af.klines.get("600519.SH", period="1d", count=250, adjust="none", to_dataframe=True)

一个实用的判断准则:

  • 你要算"过去一年涨了多少" → 用 forwardbackward,两者算出的收益率一致;
  • 你要做长周期回测、把多年前的价格和今天比 → 用 backward(前复权在遇到新的除权时会整体重算,历史值会变动,不利于回测复现);
  • 你要核对某天的真实挂单价、涨跌停价 → 用 none

比例复权用乘法因子还原价格,适合算收益率;差值复权用加减法还原,适合看绝对价差。

按时间区间获取

start_timeend_time(毫秒时间戳)指定区间:

代码语言:python
复制
import datetime
from alphafeed import AlphaFeed

af = AlphaFeed(api_key="your-api-key")

start = int(datetime.datetime(2024, 1, 1).timestamp() * 1000)
end = int(datetime.datetime(2024, 12, 31).timestamp() * 1000)

df = af.klines.get("000001.SZ", period="1d", start_time=start, end_time=end, to_dataframe=True)
print(f"2024 全年共 {len(df)} 个交易日")

也可以用 end_time + count 获取"某天之前的最近 N 根 K 线":

代码语言:python
复制
end = int(datetime.datetime(2024, 6, 30).timestamp() * 1000)
df = af.klines.get("600519.SH", period="1d", count=20, end_time=end, to_dataframe=True)

保存到本地,避免重复请求

拿到 DataFrame 后建议落盘,后续分析直接读本地文件:

代码语言:python
复制
# CSV:通用、可读
df.to_csv("600519_daily.csv", index=False)

# Parquet:体积小、读写快,适合大量标的(需先 pip install pyarrow)
df.to_parquet("600519_daily.parquet")

提示:to_parquet 需要 pyarrow(或 fastparquet)引擎,先 pip install pyarrow;不想装依赖就用 CSV。

常见问题(FAQ)

Q:返回的数据包含哪些字段?

A:日线包含 symbolnametrade_dateopenhighlowclosevolume;分钟线用 trade_time 代替 trade_date

Q:默认是什么复权方式?

A:默认 forward(前复权-比例复权)。不指定 adjust 时即为该值。

Q:一次能取多久的历史?

A:用 count 控制返回条数,或用 start_time/end_time 指定任意区间,两者可组合。

Q:需要付费吗?

A:单只标的的历史 K 线在免费额度内即可体验;批量、全市场查询需要 Starter 及以上方案。详见官网定价页。

小结

获取 A 股历史 K 线的关键不是"能不能拿到数据",而是拿到的是不是你以为的那份数据——复权方式选错,后面所有计算都会跑偏。用 AlphaFeed 这类支持显式 adjust 参数的接口,一行代码就能拿到干净、可复现的 OHLCV。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 为什么获取 K 线数据没有想象中简单
  • 三行代码获取日 K 线
  • 支持的周期
  • 复权方式:这是最容易踩坑的地方
  • 按时间区间获取
  • 保存到本地,避免重复请求
  • 常见问题(FAQ)
  • 小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档