Ashare - 深度分析报告

Ashare - 深度分析报告

技术背景与动机

行业背景

中国 A 股市场的量化交易和程序化分析在 2020-2026 年间快速增长。Python 凭借 pandas、numpy 等科学计算生态,成为量化研究的主流语言。然而,获取 A 股行情数据的门槛一直是量化入门的核心痛点:

  • Tushare(2015 年创建,14,742 Stars):专业级数据接口,但 2026 年已实行积分制,A股分钟级数据约 1,000 元/月,高精度数据需捐赠获取。
  • AKShare(2019 年创建,18,194 Stars):功能全面的财经数据接口库,覆盖股票/期货/期权/基金/外汇/债券等,但其本质是网页爬虫聚合,存在 IP 频率限制和稳定性问题。
  • BaoStock:专注于历史 K 线和财务数据,数据种类相对有限。

这些库普遍存在 API 复杂、依赖层级深、需要注册认证或积分等问题。对于只需要获取基本行情数据(开高低收量)的量化入门者和小型项目来说,使用门槛偏高。

创立动机

Ashare 由 mpquant 于 2021 年 6 月创建,核心动机是:

  1. 将 A 股数据获取简化到极致:整个库只有一个文件(Ashare.py,约 70 行代码),只有一个对外暴露的函数 get_price()。用户无需学习复杂 API,安装后 from Ashare import * 即可使用。
  2. 消除配置和认证门槛:无需 API Key、无需注册账户、无需积分。直接调用公开的新浪财经和腾讯股票数据接口,零配置即可获取数据。
  3. 双数据源确保可用性:新浪财经接口作为主力,腾讯股票接口作为备用。主力接口异常时自动降级到备用接口,无需用户手动切换。

发展历程

  • 2021-06-11:项目创建,发布初始版本,提供基于新浪 API 的基本行情数据获取
  • 2021-2024:持续维护,逐步增加腾讯数据源作为备用接口,增加分钟线支持
  • 2025-12-21:源码注释标注"2025-12-21日正常使用",确认双核心接口仍在正常工作
  • 2025-12-24:仓库最后一次 Git Push(截至 2026-04-12)
  • 2026-04-12:GitHub Stars 达到 3,348,Forks 达到 610

注:项目无正式版本号、无 Git Tag、无 GitHub Release。源码持续更新但未采用语义化版本管理。

核心原理

设计哲学

Ashare 的设计围绕三个核心理念:

  1. 极简优于全面(Simplicity over Completeness):整个库只有 70 行代码、1 个文件、1 个对外函数。不追求覆盖所有金融数据类型,只专注于最核心的行情数据(开高低收量)。这与 AKShare 的"全面覆盖"理念形成鲜明对比。

  2. 免费优于专业(Free over Professional):基于公开的财经网站 API(新浪、腾讯),无需任何认证或付费。牺牲了数据的全面性和官方保障,换取了零门槛的使用体验。

  3. 可用性优于一致性(Availability over Consistency):双数据源热备设计,新浪失败自动切换腾讯。用户无需关心底层使用的是哪个数据源,只要能拿到数据即可。

设计取舍: - 仅行情数据 vs 全金融数据:只提供 K 线行情数据(open/close/high/low/volume),不提供财务报表、公告、指数估值等基本面数据。换取了极简的代码和使用方式。[置信度:高] - 公开 API vs 私有数据源:依赖新浪/腾讯的公开 API,无 SLA 保障,接口可能随时变更。换取了完全免费和无认证。[置信度:高] - 无版本管理 vs 语义化版本:没有正式版本号,直接在源码中更新。换取了维护简便,但增加了用户追踪变更的难度。[置信度:高]

核心机制

双数据源热备机制

Ashare 的核心创新在于双数据源的自动切换设计:

用户调用 get_price(code, end_date, count, frequency)
  │
  ▼
判断 frequency 类型
  │
  ├─ 日线/周线/月线 ('1d'/'1w'/'1M')
  │    │
  │    ├─ try: get_price_sina() ← 主力(新浪财经 API)
  │    │    │
  │    │    ├─ 成功 → 返回 DataFrame
  │    │    └─ 异常 ↓
  │    │
  │    └─ except: get_price_day_tx() ← 备用(腾讯股票 API)
  │         └─ 返回 DataFrame
  │
  └─ 分钟线 ('1m'/'5m'/'15m'/'30m'/'60m')
       │
       ├─ '1m' (1分钟线) → get_price_min_tx() ← 仅腾讯支持
       │
       └─ 其他分钟线
            ├─ try: get_price_sina() ← 主力
            └─ except: get_price_min_tx() ← 备用

基于源码 Ashare.py(master 分支,2025-12-24)

新浪财经 API 调用机制

新浪接口是 Ashare 的主力数据源,用于日线和大部分分钟线数据:

# 新浪 API 请求 URL 模式
URL = f'http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol={code}&scale={ts}&ma=5&datalen={count}'

关键设计: - 频率转换:将 '1d' 转为 '240m''1w' 转为 '1200m''1M' 转为 '7200m' - 结束日期处理:通过计算 end_date 到当前日期的天数差,额外增加 count 值,再截取所需数量 - 返回 JSON 解析后转为 pandas DataFrame,统一列名为 ['open', 'high', 'low', 'close', 'volume']

腾讯股票 API 调用机制

腾讯接口作为备用数据源,同时是 1 分钟线的唯一数据源:

# 腾讯日线/周线/月线 API
URL = f'http://web.ifzq.gtimg.cn/appstock/app/fqkline/get?param={code},{unit},,{end_date},{count},qfq'

# 腾讯分钟线 API
URL = f'http://ifzq.gtimg.cn/appstock/app/kline/mkline?param={code},m{ts},,{count}'

关键设计: - unit 参数映射:'1w''week''1M''month',其他 → 'day' - 指数数据处理:指数返回字段名不含 'qfq' 前缀(如 'day' 而非 'qfqday'),代码中做了兼容处理 - 分钟线的最新收盘价通过 qt(实时行情)接口补充

基于源码 Ashare.py(master 分支,2025-12-24)

数据流/执行流程

股票代码 + 参数
  │
  ▼
get_price(code, end_date, count, frequency)
  │
  ├─ 1. 股票代码格式兼容处理
  │     '600519.XSHG' → 'sh600519'
  │     '000001.XSHE' → 'sz000001'
  │     'sh600519'    → 'sh600519'(保持不变)
  │
  ├─ 2. 根据 frequency 分派到不同获取函数
  │
  ├─ 3. HTTP GET 请求(新浪或腾讯 API)
  │     → JSON 文本响应
  │
  ├─ 4. JSON 解析 + DataFrame 构造
  │     → pd.DataFrame(columns=['time','open','close','high','low','volume'])
  │     → 数据类型转换(astype float)
  │     → 时间索引设置(pd.to_datetime)
  │
  └─ 5. 返回 DataFrame(DatetimeIndex + OHLCV 列)

基于源码 Ashare.py(master 分支,2025-12-24)

架构设计

整体架构

┌─────────────────────────────────────────────────────┐
│              用户接口层(User API Layer)              │
│   get_price(code, end_date, count, frequency)       │
├─────────────────────────────────────────────────────┤
│              代码适配层(Code Adapter Layer)          │
│   XSHG/XSHE → sh/sz 格式转换                         │
├─────────────────────────────────────────────────────┤
│              频率路由层(Frequency Router Layer)      │
│   日线/周线/月线 → get_price_sina (主) / _tx (备)     │
│   分钟线       → get_price_sina (主) / _tx (备)      │
│   1分钟线      → get_price_min_tx (仅腾讯)           │
├─────────────────────────────────────────────────────┤
│              数据源层(Data Source Layer)             │
│   新浪财经 API(money.finance.sina.com.cn)          │
│   腾讯股票 API(web.ifzq.gtimg.cn / ifzq.gtimg.cn) │
├─────────────────────────────────────────────────────┤
│              数据处理层(Data Processing Layer)       │
│   JSON 解析 → pandas DataFrame → 类型转换 → 索引设置 │
└─────────────────────────────────────────────────────┘

核心模块

  • get_price()(统一入口函数) - 唯一对外暴露的函数,负责股票代码格式兼容处理、频率路由(日线/周线/月线走新浪+腾讯备用,分钟线走新浪+腾讯备用,1分钟线仅腾讯),以及 try-except 自动降级逻辑。
  • get_price_sina()(新浪全周期获取) - 新浪财经 API 封装,支持全部周期(通过 scale 参数映射),包含 end_date 时的 count 增量计算逻辑,处理 JSON 响应并构造 DataFrame。
  • get_price_day_tx()(腾讯日/周/月线获取) - 腾讯股票日线 API 封装,处理指数和股票的不同返回格式(qfqday vs day),构造 DataFrame。
  • get_price_min_tx()(腾讯分钟线获取) - 腾讯股票分钟线 API 封装,解析 frequency 获取周期数,额外获取实时行情修正最新收盘价。

扩展机制

Ashare 不提供正式的扩展机制(无插件系统、无钩子、无中间件)。但基于其极简架构,用户可以通过以下方式定制:

  1. 直接修改 Ashare.py:由于只有 70 行代码,用户可以直接修改源码添加新的数据源或数据字段。
  2. 函数级覆盖:Python 的动态特性允许用户重新绑定 get_price 函数或其内部函数,实现自定义行为。
  3. MCP 封装:社区已有 Ashare-MCP 项目,将 Ashare 封装为 MCP(Model Context Protocol)工具,支持 AI Agent 调用。

关键概念详解

get_price() 统一接口

  • 定义: Ashare 唯一对外暴露的函数,接受股票代码、结束日期、数据条数和频率参数,返回 pandas DataFrame 格式的行情数据。
  • 作用: 将不同数据源(新浪/腾讯)、不同周期(日/周/月/分钟)的差异化逻辑完全封装,对外提供统一的调用接口。用户只需关心"我要什么股票、什么周期、多少条数据"三个参数。
  • 使用场景: 获取任意 A 股的行情数据,用于量化策略开发、技术分析、数据回测等。
  • 代码示例:
# 基于官方 README 及源码(master 分支,2025-12-24)

from Ashare import *

# 获取上证指数最近 10 日日线数据
df = get_price('sh000001', frequency='1d', count=10)
print('上证指数日线行情\n', df)

# 获取贵州茅台最近 20 日日线数据
df = get_price('sh600519', frequency='1d', count=20)
print(df)

# 获取平安银行最近 10 条 15 分钟线数据(同花顺代码格式)
df = get_price('000001.XSHE', frequency='15m', count=10)
print('平安银行分钟线\n', df)

# 获取指定结束日期的日线数据
df = get_price('sh600519', end_date='2025-12-20', count=10, frequency='1d')
print(df)

基于官方 README 及源码(master 分支,2025-12-24)

双数据源热备(Dual Data Source Hot-Standby)

  • 定义: Ashare 内置新浪财经和腾讯股票两个数据源,通过 try-except 机制实现自动故障切换。
  • 作用: 当主力数据源(新浪)请求失败时(网络异常、接口变更、频率限制等),自动降级到备用数据源(腾讯),确保数据获取的高可用性。
  • 使用场景: 在新浪财经 API 不稳定或临时不可用时,自动切换到腾讯股票 API 继续获取数据,用户无感知。
  • 代码示例:
# 源码中的热备实现逻辑(基于 Ashare.py master 分支,2025-12-24)

def get_price(code, end_date='', count=10, frequency='1d', fields=[]):
    # ... 代码格式转换 ...

    if frequency in ['1d', '1w', '1M']:  # 日线/周线/月线
        try:
            return get_price_sina(xcode, ...)      # 主力:新浪接口
        except:
            return get_price_day_tx(xcode, ...)     # 备用:腾讯接口

    if frequency in ['1m', '5m', '15m', '30m', '60m']:  # 分钟线
        if frequency in '1m':
            return get_price_min_tx(xcode, ...)     # 1分钟线仅腾讯支持
        try:
            return get_price_sina(xcode, ...)       # 主力:新浪接口
        except:
            return get_price_min_tx(xcode, ...)     # 备用:腾讯接口

基于源码 Ashare.py(master 分支,2025-12-24)

多代码格式兼容(Multi-Code Format Compatibility)

  • 定义: Ashare 支持多种常见的 A 股代码格式,内部自动转换为新浪/腾讯 API 要求的格式。
  • 作用: 降低从其他量化平台(聚宽、同花顺等)迁移代码时的改造成本。用户无需手动将 600519.XSHG 转换为 sh600519
  • 使用场景: 从聚宽、同花顺等平台迁移量化策略时,直接复用原有的股票代码格式。
  • 代码示例:
# 源码中的代码转换逻辑(基于 Ashare.py master 分支,2025-12-24)

# 以下三种格式获取同一只股票(贵州茅台)的数据
df1 = get_price('sh600519')           # 通达信格式
df2 = get_price('600519.XSHG')        # 同花顺/聚宽格式
df3 = get_price('sz000001')           # 通达信格式(深圳)
df4 = get_price('000001.XSHE')        # 同花顺/聚宽格式(深圳)

# 内部转换逻辑:
# '600519.XSHG' → 去掉后缀 → '600519' → 加上交易所前缀 → 'sh600519'
# '000001.XSHE' → 去掉后缀 → '000001' → 加上交易所前缀 → 'sz000001'

基于源码 Ashare.py(master 分支,2025-12-24)

多周期行情数据(Multi-Period Market Data)

  • 定义: Ashare 支持日线('1d')、周线('1w')、月线('1M')和分钟线('1m''5m''15m''30m''60m')共 8 种周期。
  • 作用: 覆盖量化分析中最常用的行情周期。日线用于中长期趋势分析,分钟线用于短线和日内策略。
  • 使用场景: 构建多周期量化策略、技术指标计算(如 MACD、KDJ)、K 线形态识别。
  • 代码示例:
# 基于官方 README 及源码(master 分支,2025-12-24)

from Ashare import *

# 日线数据(默认)
df_day = get_price('sh600519', frequency='1d', count=30)

# 周线数据
df_week = get_price('sh600519', frequency='1w', count=20)

# 月线数据
df_month = get_price('sh600519', frequency='1M', count=12)

# 5 分钟线数据
df_5min = get_price('sh600519', frequency='5m', count=100)

# 60 分钟线数据
df_60min = get_price('sh600519', frequency='60m', count=50)

基于官方 README 及源码(master 分支,2025-12-24)

同类技术横向对比

维度 Ashare AKShare Tushare BaoStock
核心理念 极简主义,单文件单函数 全面覆盖,多源聚合 专业级数据服务,积分制 历史数据专精,适合回测
GitHub Stars 3,348 18,194 14,742 约 1,500(估算)
GitHub Forks 610 3,032 4,420 约 600(估算)
License 未标注 MIT BSD-3-Clause MIT(估算)
代码规模 单文件约 70 行 大型库,数百个模块 中大型库,多模块 中型库
数据类型 仅 K 线行情(OHLCV) 股票/期货/期权/基金/外汇/债券/宏观等 股票/期货/基金/债券/港股/美股/宏观等 A 股历史 K 线 + 财务数据
数据周期 日线/周线/月线/分钟线(8 种) 日线/周线/月线/分钟线 + 更多 日线/周线/月线/分钟线 + 更多 日线/周线/月线/分钟线/5 分钟线
数据源 新浪 + 腾讯(双源热备) 多源爬虫聚合(新浪/东财/同花顺等) 自建数据服务 自建数据服务
认证要求 无(零配置) 无(免费) 需注册 + 积分(高级数据需付费) 需注册登录(免费)
输出格式 pandas DataFrame pandas DataFrame pandas DataFrame pandas DataFrame
对外 API 数量 1 个(get_price) 数百个 数百个 数十个
安装方式 pip install ashares pip install akshare pip install tushare pip install baostock
依赖项 pandas + requests pandas + requests + 多个 pandas + requests pandas
最近更新 2025-12-24 2026-04-12(活跃) 2024-03-13(停止更新约 2 年) 较低频更新
费用 完全免费 完全免费 基础免费,分钟数据约 1,000 元/月 完全免费
IP 限制 无明显限制 有 IP 频率限制 有频控和封禁机制 有频控机制
生产就绪度 低(无 SLA,接口可能变更) 中(爬虫本质,稳定性受限) 高(专业数据服务) 中(稳定但数据种类有限)
适用场景 快速获取行情、量化入门、小型项目 学术研究、多源数据需求 专业量化交易、有预算的团队 历史回测、基本面分析

数据获取日期:2026-04-12。Stars/Forks 数据来自 GitHub API 实时查询。BaoStock 因无明确 GitHub 仓库,Stars 和 Forks 为估算值,基于社区观察标注 [置信度:低]。Tushare 仓库最后推送日期为 2024-03-13,表明开源版已约 2 年未更新。Ashare 的 BaoStock 对比数据中 License 标注为"估算" [置信度:低]

适用场景分析

最佳场景

  1. 量化交易入门学习:Ashare 的零配置、单函数 API 是量化入门的最佳选择。学习者无需注册账户、无需处理复杂的数据清洗逻辑,只需 get_price() 即可获得标准格式的行情数据,可将精力集中在策略开发而非数据获取上。[置信度:高]

  2. 小型量化项目快速原型:需要快速验证某个交易思路或策略假设时,Ashare 可以在几分钟内搭建数据获取管道。70 行代码的极简架构意味着即使出问题也容易排查和修复。[置信度:高]

  3. 股票数据获取教学:在编程教学场景中,Ashare 是演示"如何用 Python 获取股票数据"的理想工具。代码简洁、无配置门槛、输出标准格式,适合课堂教学和在线教程。[置信度:高]

  4. MCP/AI Agent 数据集成:Ashare 的极简 API 使其成为 MCP(Model Context Protocol)封装的理想底层库。社区已有 Ashare-MCP 项目,将 get_price() 封装为 AI Agent 可调用的工具。[置信度:中]

不适用场景

  1. 专业量化交易系统:缺乏 SLA 保障、数据验证机制、频率控制和错误重试策略。专业量化系统建议使用 Tushare Pro 或自建数据服务。

  2. 需要基本面数据的项目:Ashare 仅提供 K 线行情数据,不支持财务报表、公司公告、指数估值、行业分类等基本面数据。需要基本面分析的场景建议使用 AKShare 或 Tushare。

  3. 高频率实时数据需求:基于公开 API 的实现存在延迟,不适合需要实时或近实时数据的场景(如高频交易、实时监控系统)。

优缺点深度分析

优势

  1. 极致的简洁性 - 整个库只有一个文件(70 行代码),只有一个对外函数。这是 Ashare 最大的差异化优势。相比 AKShare 的数百个函数和 Tushare 的复杂认证体系,Ashare 的学习成本几乎为零。[置信度:高]

  2. 零配置零认证 - 无需 API Key、无需注册、无需积分。安装后直接使用,没有任何配置门槛。这是量化入门者最需要的特性。[置信度:高]

  3. 双数据源热备 - 新浪 + 腾讯双源自动切换,提高了数据获取的可用性。新浪接口异常时自动降级到腾讯,用户无需手动干预。[置信度:高]

  4. 多代码格式兼容 - 支持通达信、同花顺/聚宽两种主流代码格式,降低了从其他平台迁移的改造成本。[置信度:高]

劣势

  1. 数据类型极其有限 - 仅提供 K 线行情数据(OHLCV),不支持财务报表、公告、指数、基金、期货等任何其他数据类型。功能覆盖面远小于 AKShare 和 Tushare。[置信度:高]

  2. 无版本管理 - 没有正式版本号、Git Tag 或 Release。源码直接在 master 分支更新,用户无法追踪 API 变更,也无法固定依赖版本。这对生产环境使用构成风险。[置信度:高]

  3. 无 License 声明 - 仓库中无 LICENSE 文件,法律上意味着默认适用版权法(All Rights Reserved),虽然 mpquant 大概率无意限制使用,但严格的合规场景下存在法律不确定性。[置信度:高]

  4. 维护频率较低 - 最后一次 Git Push 为 2025-12-24(距今约 3.5 个月),虽然源码注释标注接口仍正常使用,但长期维护节奏不确定。[置信度:中]

风险点

  1. 上游 API 不稳定 - 新浪和腾讯的公开 API 随时可能变更或关闭,无任何 SLA 保障。一旦上游 API 变更,Ashare 将无法正常工作,需要等待维护者更新源码。[置信度:高]

  2. 无错误处理和重试机制 - 源码中的 try-except 仅做简单的数据源切换,没有请求超时设置、重试次数控制、异常信息记录等机制。在网络不稳定时可能导致静默失败。[置信度:高]

  3. 无数据验证 - 返回的数据未经过完整性校验(如缺失值检查、日期连续性验证),用户需要自行验证数据质量。[置信度:高]

生态成熟度评估

  • 插件/扩展数量: 无。Ashare 不提供插件系统。唯一的生态扩展是社区开发的 Ashare-MCP,将 Ashare 封装为 MCP 工具供 AI Agent 使用。[置信度:高]
  • 第三方库支持: 低。Ashare 本身是底层工具,不依赖也不被其他主要库依赖。但其输出格式(pandas DataFrame)与整个 Python 数据科学生态天然兼容。[置信度:高]
  • 企业采用案例: 未发现公开的企业采用案例。项目主要面向个人开发者和量化入门者。[置信度:高]
  • 文档质量: 基础。README 提供了基本的使用示例和安装说明,但没有 API 文档、常见问题或架构说明。源码本身是自文档化的(70 行代码),可读性很高。[置信度:高]

生产环境就绪度评估

  • 稳定性: 低。依赖公开的第三方 API,无 SLA 保障。新浪/腾讯接口可能因反爬虫策略、服务器维护或接口变更而中断。双数据源热备部分缓解了单点故障,但无法根治。[置信度:高]
  • 性能表现: 基础。每次调用 get_price() 发起一个 HTTP GET 请求,无缓存机制。高频调用可能触发上游 API 的频率限制。对于单次获取少量数据的场景(如每日获取几只股票的日线),性能足够。[置信度:中]
  • 监控/可观测性: 无。不提供日志、指标或错误追踪。请求失败时静默切换数据源,不记录失败详情。[置信度:高]
  • 故障恢复: 基础。仅通过 try-except 实现数据源切换,无自动重试、指数退避或熔断机制。[置信度:高]
  • 安全合规: 需关注。无 License 声明存在法律风险。此外,通过 HTTP(非 HTTPS)访问新浪财经 API,数据传输未加密。[置信度:高]

学习曲线评估

  • 前置知识要求:
  • Python 基础(变量、函数调用、import)
  • pandas 基本操作(DataFrame 查看和简单处理)
  • A 股市场基本概念(股票代码、K 线、交易所)

  • 入门时间估计: 5-10 分钟。pip install ashares 安装后,from Ashare import * 导入,调用 get_price() 即可获取数据。无需阅读文档。

  • 精通时间估计: 1-2 小时。需要阅读源码(仅 70 行),理解双数据源切换逻辑、频率参数映射、代码格式转换等细节。由于库本身功能有限,精通更多是指理解其局限性和适用边界。

总结与建议

Ashare 是一个定位极端明确的工具:为量化入门者和快速原型开发提供最简化的 A 股行情数据获取方式。70 行代码、1 个函数、零配置的设计理念在同类工具中独树一帜。双数据源热备机制在一定程度上弥补了公开 API 的不稳定性。

推荐使用: 量化交易入门学习者、需要快速验证交易策略假设的个人开发者、Python 金融数据获取教学场景、MCP/AI Agent 的轻量级数据层。

谨慎使用: 专业量化交易系统(建议使用 Tushare Pro)、需要基本面数据的分析项目(建议使用 AKShare)、对数据稳定性和完整性有高要求的生产环境。

综合评分: 6.0/10。在其定位(极简 A 股行情数据获取)上表现出色,但功能覆盖面过于有限,缺乏版本管理、License 声明和生产级保障机制。适合作为入门工具和快速原型构建,不适合作为生产系统的核心数据层。

信息来源与版本说明