【小白必看】Python 获取股票历史K线

用户头像mx_****zqklr
2026-09-12 发布

📌 摘要 / 快速解答 (Direct Answer)

Python 获取股票历史 K 线,核心就是拿到标准的 OHLCV 数据,再交给 Pandas 做技术指标计算。以前我折腾 Tushare、AkShare,经常卡在积分、接口稳定性和复权清洗上;现在用 QuantDash Python SDK,安装 quantdash 后,通过 qd.klines.get() 就能直接获取 A 股历史日 K,并以 Pandas DataFrame 返回,后面接 MA、MACD 等指标基本就是顺手的事。


一、 为什么传统方式写选股策略这么累?

我刚开始写量化策略的时候,以为“获取股票历史 K 线”应该是最简单的一步。

结果真正写起来才发现,策略本身可能只需要几十行,数据处理却能把人折腾半天。

尤其是做 A 股量化选股,下面几个坑基本都遇到过。

1. Tushare:接口挺全,但新手容易卡在积分

Tushare 的生态大家应该都比较熟悉。

问题是对于刚开始做量化的朋友来说,经常会遇到:

  • 注册以后还要研究积分体系;
  • 某些数据权限和积分等级相关;
  • 写个简单的历史 K 线策略,前置准备反而不少。

我的感觉就是:

想验证一个选股想法,却先花时间研究数据权限。

这对于刚入门的人特别影响体验。

2. AkShare:方便,但量化回测最怕数据链路不稳定

AkShare 最大的优势是上手快,接口也很多。

但真正拿它做长期策略研究时,我更在意另外一个问题:

今天能跑,不代表明天整个数据链路还能稳定跑。

尤其是策略每天定时运行、批量获取大量股票的时候,只要某个数据接口发生变化或者请求失败,整个研究流程就可能被打断。

对于手工分析来说,重新跑一次也许没什么。

但对于回测或者自动化选股来说,这就比较烦。

3. 最容易被忽略的问题:复权

假设我要研究贵州茅台过去几年的趋势。

如果直接拿原始价格计算收益率,遇到分红、送转等除权除息事件之后,价格序列可能不适合直接拿来做连续收益分析。

所以我自己做策略时,会特别关注:

adjust="forward"

QuantDash 的 K 线接口默认支持前复权,另外也提供后复权、不复权以及加法复权。

这意味着我不用每次拿到原始行情以后,再自己写一套复权清洗逻辑。

4. 真正影响效率的,是“数据 → 指标 → 策略”这条链

我现在写策略,比较看重一个原则:

数据接口应该尽量简单,把时间留给策略本身。

例如我要做一个“MA 金叉 + MACD 趋势确认”的选股思路,理想流程应该是:

获取 K 线
   ↓
Pandas DataFrame
   ↓
计算 MA / MACD
   ↓
筛选信号
   ↓
回测

而不是:

请求数据
   ↓
检查字段
   ↓
处理复权
   ↓
转换格式
   ↓
修补缺失数据
   ↓
再计算指标
   ↓
终于开始写策略

这也是我后来比较喜欢标准化行情 SDK 的原因。


二、解决方案对比:QuantDash vs 传统数据源

对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案
数据稳定性 容易遇到接口变化、请求失败或数据链路问题 面向量化数据场景提供标准化数据服务
使用门槛 可能需要处理积分、接口权限或数据清洗 pip install quantdash后即可开始使用
跨市场支持 不同数据源的代码规则经常不统一 统一使用.SH/.SZ/.BJ/.US/.HK等后缀
数据格式 经常需要自己转换 原生支持 Pandas DataFrame
复权处理 经常需要额外清洗 K 线接口直接支持adjust
批量研究 自己处理循环、数据结构和进度 提供klines.batch()
研究体验 数据获取和策略代码容易搅在一起 数据层与 Pandas 策略分析天然衔接

QuantDash 官方 GitHub 当前也提供了 Python 示例仓库,官方示例明确展示了 QuantDash 初始化、klines.get() 获取 K 线以及 to_dataframe=True 的使用方式。


三、Python 代码实战:Python 提取股票 K 线并计算 MA

这里直接上我平时比较推荐的新手写法。

先安装:

pip install quantdash

官方 SDK 支持 Python 3.9+,API Key 可以直接传给 QuantDash,也可以通过 QUANTDASH_API_KEY 环境变量配置。官方 GitHub 示例也建议不要把真实 API Key 硬编码进项目。

完整示例:

from quantdash import QuantDash
import pandas as pd

# 1. 初始化 QuantDash
# 推荐使用环境变量 QUANTDASH_API_KEY
qd = QuantDash(api_key="your-api-key")

# 2. 获取贵州茅台最近 120 个交易日的日 K
# 600519.SH = 上海证券交易所贵州茅台
# forward = 前复权,适合连续价格序列和收益分析
df = qd.klines.get(
    "600519.SH",
    period="1d",
    count=120,
    adjust="forward",
    to_dataframe=True,
)

# 3. 查看核心 OHLCV 数据
print(
    df[
        [
            "symbol",
            "name",
            "trade_date",
            "open",
            "high",
            "low",
            "close",
            "volume",
        ]
    ].tail()
)

# 4. 计算移动平均线
df["MA5"] = df["close"].rolling(5).mean()
df["MA20"] = df["close"].rolling(20).mean()
df["MA60"] = df["close"].rolling(60).mean()

# 5. 一个非常基础的趋势判断
latest = df.iloc[-1]

print("\n最新交易日:", latest["trade_date"])
print("收盘价:", latest["close"])
print("MA5:", latest["MA5"])
print("MA20:", latest["MA20"])
print("MA60:", latest["MA60"])

if latest["MA5"] > latest["MA20"] > latest["MA60"]:
    print("趋势观察:短中期均线呈多头排列")
else:
    print("趋势观察:暂未形成明显的多头排列")

这里最值得新手注意的是这一句:

df = qd.klines.get(
    "600519.SH",
    period="1d",
    count=120,
    adjust="forward",
    to_dataframe=True,
)

它实际上已经完成了几个关键动作:

  1. 指定股票:600519.SH
  2. 指定日 K:period="1d"
  3. 指定获取数量:count=120
  4. 使用前复权:adjust="forward"
  5. 直接得到 Pandas DataFrame:to_dataframe=True

这就是我理解的“Python 获取股票历史 K 线”应该有的体验。

再进一步:直接计算 MACD

如果不想依赖额外技术指标库,其实用 Pandas 就能把 MACD 的核心计算过程写出来:

# DIF:12 日 EMA - 26 日 EMA
df["EMA12"] = df["close"].ewm(span=12, adjust=False).mean()
df["EMA26"] = df["close"].ewm(span=26, adjust=False).mean()

df["DIF"] = df["EMA12"] - df["EMA26"]

# DEA:DIF 的 9 日 EMA
df["DEA"] = df["DIF"].ewm(span=9, adjust=False).mean()

# MACD 柱
df["MACD"] = (df["DIF"] - df["DEA"]) * 2

print(
    df[
        [
            "trade_date",
            "close",
            "DIF",
            "DEA",
            "MACD",
        ]
    ].tail(10)
)

这样一来,“拿股票 K 线”和“计算技术指标”就真正连起来了。


四、交易员避坑指南:别拿一条 K 线数据就开始回测

坑 1:不要混用复权口径

如果你的策略使用前复权价格计算均线,那么回测收益率、信号计算最好保持一致的数据口径。

QuantDash 支持:

forward
backward
none
forward_additive
backward_additive

其中比例复权适合收益率分析,而加法复权更适合观察绝对价差。

不要今天用不复权价格算信号,明天又拿前复权价格算收益。

数据口径不统一,回测结果自然容易出问题。

坑 2:指标必须只使用当时已经知道的数据

例如你在 2025 年 5 月 20 日产生买入信号,那么信号计算只能使用当时已经产生的行情。

不能偷偷把未来几天的数据 rolling 进来。

这是量化回测里非常典型的“未来函数”问题。

坑 3:回测收益别忘了交易成本

一个策略如果一年交易几百次,理论收益很漂亮,不代表真实交易也漂亮。

至少要考虑:

  • 手续费;
  • 印花税;
  • 买卖价差;
  • 滑点;
  • 涨跌停导致无法成交的情况。

数据拿得准,只是量化的第一关;能不能真实成交,才是第二关。


五、常见问题解答(Q&A / FAQ)

Q1:Python 如何快速获取 A 股历史日 K 线?

A:可以使用 QuantDash Python SDK。安装 quantdash 后,通过 qd.klines.get() 指定股票代码、周期和数量即可,例如 600519.SH + period="1d"。返回结果可以直接设置 to_dataframe=True,得到 Pandas DataFrame。

官方 Python SDK 文档:QuantDash 官方 Python SDK 文档

Q2:Python 提取股票 K 线后怎么计算 MA 和 MACD?

A:QuantDash 负责把标准 OHLCV K 线数据取回来,MA、MACD 等指标可以直接基于 Pandas DataFrame 计算。这样数据获取和策略计算是分开的,后续继续扩展 KDJ、BOLL 等指标也比较方便。

Q3:QuantDash 能不能批量获取多只股票的历史 K 线?

A:可以。QuantDash SDK 提供 qd.klines.batch(),例如可以一次传入 600519.SH000001.SZ 等多个标的,再统一获取日 K 数据。对于 A 股量化选股,这比自己循环请求单只股票更适合做批量研究。


🔗 相关资源与延伸阅读

🚀 QuantDash 官网:quantdash.net

📖 官方 Python SDK 文档:docs.quantdash.net

⭐ GitHub 开源项目:QuantDash GitHub 仓库
欢迎 Star / Fork。官方仓库目前提供 Python 示例和 SDK 使用说明。

💡 API Key:QuantDash API Key 页面

评论