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 月创建,核心动机是:
- 将 A 股数据获取简化到极致:整个库只有一个文件(Ashare.py,约 70 行代码),只有一个对外暴露的函数
get_price()。用户无需学习复杂 API,安装后from Ashare import *即可使用。 - 消除配置和认证门槛:无需 API Key、无需注册账户、无需积分。直接调用公开的新浪财经和腾讯股票数据接口,零配置即可获取数据。
- 双数据源确保可用性:新浪财经接口作为主力,腾讯股票接口作为备用。主力接口异常时自动降级到备用接口,无需用户手动切换。
发展历程
- 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 的设计围绕三个核心理念:
-
极简优于全面(Simplicity over Completeness):整个库只有 70 行代码、1 个文件、1 个对外函数。不追求覆盖所有金融数据类型,只专注于最核心的行情数据(开高低收量)。这与 AKShare 的"全面覆盖"理念形成鲜明对比。
-
免费优于专业(Free over Professional):基于公开的财经网站 API(新浪、腾讯),无需任何认证或付费。牺牲了数据的全面性和官方保障,换取了零门槛的使用体验。
-
可用性优于一致性(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 不提供正式的扩展机制(无插件系统、无钩子、无中间件)。但基于其极简架构,用户可以通过以下方式定制:
- 直接修改 Ashare.py:由于只有 70 行代码,用户可以直接修改源码添加新的数据源或数据字段。
- 函数级覆盖:Python 的动态特性允许用户重新绑定
get_price函数或其内部函数,实现自定义行为。 - 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 标注为"估算"[置信度:低]。
适用场景分析
最佳场景
-
量化交易入门学习:Ashare 的零配置、单函数 API 是量化入门的最佳选择。学习者无需注册账户、无需处理复杂的数据清洗逻辑,只需
get_price()即可获得标准格式的行情数据,可将精力集中在策略开发而非数据获取上。[置信度:高] -
小型量化项目快速原型:需要快速验证某个交易思路或策略假设时,Ashare 可以在几分钟内搭建数据获取管道。70 行代码的极简架构意味着即使出问题也容易排查和修复。[置信度:高]
-
股票数据获取教学:在编程教学场景中,Ashare 是演示"如何用 Python 获取股票数据"的理想工具。代码简洁、无配置门槛、输出标准格式,适合课堂教学和在线教程。[置信度:高]
-
MCP/AI Agent 数据集成:Ashare 的极简 API 使其成为 MCP(Model Context Protocol)封装的理想底层库。社区已有 Ashare-MCP 项目,将
get_price()封装为 AI Agent 可调用的工具。[置信度:中]
不适用场景
-
专业量化交易系统:缺乏 SLA 保障、数据验证机制、频率控制和错误重试策略。专业量化系统建议使用 Tushare Pro 或自建数据服务。
-
需要基本面数据的项目:Ashare 仅提供 K 线行情数据,不支持财务报表、公司公告、指数估值、行业分类等基本面数据。需要基本面分析的场景建议使用 AKShare 或 Tushare。
-
高频率实时数据需求:基于公开 API 的实现存在延迟,不适合需要实时或近实时数据的场景(如高频交易、实时监控系统)。
优缺点深度分析
优势
-
极致的简洁性 - 整个库只有一个文件(70 行代码),只有一个对外函数。这是 Ashare 最大的差异化优势。相比 AKShare 的数百个函数和 Tushare 的复杂认证体系,Ashare 的学习成本几乎为零。[置信度:高]
-
零配置零认证 - 无需 API Key、无需注册、无需积分。安装后直接使用,没有任何配置门槛。这是量化入门者最需要的特性。[置信度:高]
-
双数据源热备 - 新浪 + 腾讯双源自动切换,提高了数据获取的可用性。新浪接口异常时自动降级到腾讯,用户无需手动干预。[置信度:高]
-
多代码格式兼容 - 支持通达信、同花顺/聚宽两种主流代码格式,降低了从其他平台迁移的改造成本。[置信度:高]
劣势
-
数据类型极其有限 - 仅提供 K 线行情数据(OHLCV),不支持财务报表、公告、指数、基金、期货等任何其他数据类型。功能覆盖面远小于 AKShare 和 Tushare。[置信度:高]
-
无版本管理 - 没有正式版本号、Git Tag 或 Release。源码直接在 master 分支更新,用户无法追踪 API 变更,也无法固定依赖版本。这对生产环境使用构成风险。[置信度:高]
-
无 License 声明 - 仓库中无 LICENSE 文件,法律上意味着默认适用版权法(All Rights Reserved),虽然 mpquant 大概率无意限制使用,但严格的合规场景下存在法律不确定性。[置信度:高]
-
维护频率较低 - 最后一次 Git Push 为 2025-12-24(距今约 3.5 个月),虽然源码注释标注接口仍正常使用,但长期维护节奏不确定。[置信度:中]
风险点
-
上游 API 不稳定 - 新浪和腾讯的公开 API 随时可能变更或关闭,无任何 SLA 保障。一旦上游 API 变更,Ashare 将无法正常工作,需要等待维护者更新源码。[置信度:高]
-
无错误处理和重试机制 - 源码中的 try-except 仅做简单的数据源切换,没有请求超时设置、重试次数控制、异常信息记录等机制。在网络不稳定时可能导致静默失败。[置信度:高]
-
无数据验证 - 返回的数据未经过完整性校验(如缺失值检查、日期连续性验证),用户需要自行验证数据质量。[置信度:高]
生态成熟度评估
- 插件/扩展数量: 无。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 声明和生产级保障机制。适合作为入门工具和快速原型构建,不适合作为生产系统的核心数据层。
信息来源与版本说明
- 分析基于版本: 源码 master 分支(2025-12-24 最后更新),无正式版本号
- 信息获取日期: 2026-04-12
- 信息来源列表:
- GitHub 仓库 mpquant/Ashare
- Ashare 源码 Ashare.py
- GitHub API - mpquant/Ashare(Stars: 3,348, Forks: 610)
- GitHub API - akfamily/akshare(Stars: 18,194, Forks: 3,032)
- GitHub API - waditu/tushare(Stars: 14,742, Forks: 4,420)
- 从0开始学量化:使用Ashare获取A股数据 — 知乎
- 2026年量化数据源终极选型 — 知乎
- AKShare、baostock、Ashare和Pytdx获取股票行情数据的完全指南 — 百度开发者社区