ashareapi-pi 0.2.5 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,244 +1,254 @@
1
- ---
2
- name: ashareapi
3
- description: 用 ashareapi 获取 A 股数据:行情 / K线 / 财务三表 / 资金流 / 龙虎榜 / 板块 / 可转债 / 因子选股 / 宏观 / 产业链。当用户要查 A 股现价、K线走势、财报(营收净利毛利率)、主力资金、龙虎榜(机构/游资)、涨停、板块轮动、可转债条款(强赎/双低)、ETF、新股打新、指数估值、产业链上下游,或要写调用 A 股数据的代码、接 REST API / 官方 SDK(Python: pip install ashareapi · Node.js: npm install ashareapi)时使用。含 32 个端点的参数与字段语义、单位换算(volume 是手 / amount 是元 / 比率为百分数)、数据日期语义、常见错误与限流处理(匿名 5 次/分,解一次 PoW 挑战提到 60 次/分)。
4
- license: MIT
5
- metadata:
6
- version: "0.2.5"
7
- updated: "2026-10-02"
8
- homepage: "https://ashareapi.com"
9
- docs: "https://ashareapi.com/docs"
10
- endpoints: "https://ashareapi.com/endpoints"
11
- changelog: "https://ashareapi.com/changelog"
12
- ---
13
-
14
- # ashareapi — A 股数据 API
15
-
16
- **32 个 HTTP 端点**(`https://api.ashareapi.com/v1/...`),覆盖行情 / K线 / **五档盘口** / 财务 / 资金 / 龙虎榜 / 板块 / 转债 / 选股 / 宏观 / 产业链。
17
- **5 个端点无需 Key**(装上就能调),其余需要 Key(¥9.9 起)。另有**官方 SDK**:Python `pip install ashareapi` · Node.js / TypeScript `npm install ashareapi`。
18
-
19
- ---
20
-
21
- ## 一、先判断:这个任务要不要 Key
22
-
23
- | 任务 | 免费端点够不够 |
24
- |---|---|
25
- | 现价 / K线 / 热搜 / 市场总览 / 涨跌分布 | ✅ **够,无需 Key**(先试这个)|
26
- | 财报 / 资金流 / 龙虎榜 / 板块 / 转债 / 选股 / 宏观 … | ❌ 需要 Key(`Authorization: Bearer <key>`)|
27
-
28
- **免费 5 个**:`/v1/quote`(行情)· `/v1/kline`(K线)· `/v1/hot`(热搜)· `/v1/market-overview`(大盘画像)· `/v1/changedist`(涨跌分布)
29
- **工具端点**(也免 Key):`/v1/health`(健康检查)· `/v1/challenge`(PoW 提额)
30
-
31
- ## 二、免费端点:直接调(无需任何鉴权)
32
-
33
- ```bash
34
- # 行情:现价 / 开高低 / 成交量 / 换手率
35
- curl "https://api.ashareapi.com/v1/quote?code=sh600667"
36
-
37
- # K线(日/周/月)
38
- curl "https://api.ashareapi.com/v1/kline?code=sh600667&period=day&count=5"
39
-
40
- # 热搜榜
41
- curl "https://api.ashareapi.com/v1/hot?limit=10"
42
- ```
43
-
44
- Python:
45
-
46
- ```python
47
- import requests
48
-
49
- r = requests.get("https://api.ashareapi.com/v1/quote",
50
- params={"code": "sh600667"}, timeout=10)
51
- body = r.json()
52
- if not body.get("ok"):
53
- raise RuntimeError(body) # 上游取数失败(已自动换源,且不扣次数)
54
- bar = body["data"][0] # 最新一根(当日实时)
55
- print(bar["date"], bar["last"], bar["turnover"])
56
- ```
57
-
58
- ## 三、带 Key 调用
59
-
60
- ```bash
61
- curl -H "Authorization: Bearer ct-你的Key" \
62
- "https://api.ashareapi.com/v1/fund?code=sh600667"
63
- ```
64
-
65
- Key 从 https://ashareapi.com/pricing 获取。**401 = 没带 Key 调了付费端点**。
66
-
67
- ## 四、按任务找端点(决策树)
68
-
69
- | 用户想要 | 用这个端点 | 备注 |
70
- |---|---|---|
71
- | 现价 / 开高低 / 换手 | `/v1/quote` | 免费 |
72
- | **封单多少 / 买盘卖盘 / 盘口 / 挂单** | **`/v1/orderbook`** | **五档盘口**(买五卖五·秒级快照·**盘中才有意义**·量单位=手)|
73
- | **估值 / PE / PB / 市值 / 股本 / 涨停价** | **`/v1/snapshot`** | **全字段画像**(**仅A股**·付费·**要多项时比分别调更省次数**)|
74
- | 走势 / 历史 K线 | `/v1/kline` | 免费;**仅日/周/月,无分钟级**;价格口径固定**前复权**(除权除息日不跳空)——**不要再自己复权**(会二次复权)|
75
- | 什么股票热门 | `/v1/hot` | 免费 |
76
- | 大盘怎么样 / 风格轮动 / 估值分位 | `/v1/market-overview` | 免费;`type` 选 summary/trade/interval/technical/margin/valuation/rotation |
77
- | 涨跌家数 / 涨停家数 / 市场广度 | `/v1/changedist` | 免费;**当期口径**(别用 market-overview?type=updown,那是 T-1)|
78
- | 财报 / 营收 / 净利润 / 毛利率 | `/v1/finance` | 三表 |
79
- | 主力资金 / 资金流 / 龙虎榜 / 大宗 / 两融 | **`/v1/fund`** | **一个接口拿全交易面**(优先用)|
80
- | 龙虎榜分榜(机构 / 游资 / 席位)| `/v1/lhb` | `type=institution/hotmoney/activeseat` |
81
- | 技术面 / MACD / KDJ / RSI / BOLL | `/v1/technical` | |
82
- | 谁在持有 / 股东户数 / 机构持仓 | `/v1/shareholder` | |
83
- | 筹码 / 套牢盘 / 成本分布 | `/v1/chip` | |
84
- | 板块涨幅榜 / 轮动 | `/v1/sector` | |
85
- | 某板块贵不贵 / 估值分位 | `/v1/sector-valuation` | `code=pt01801780` 形式 |
86
- | 可转债 / 强赎 / 双低 / 溢价 | `/v1/bond` | `code=sh113052` 形式 |
87
- | ETF | `/v1/etf` | `code=sh510300` |
88
- | 新股 / 打新 | `/v1/ipo` | |
89
- | 分红送转 | `/v1/dividend` | |
90
- | 个股事件(42 类)/ 解禁 / 回购 | `/v1/events` | |
91
- | 个股事件日历(某日有什么事件)| `/v1/calendar` | **不是宏观日历**(宏观用 `/v1/macro`)|
92
- | 研报 / 机构观点 | `/v1/dehydrated` | `mode=list/detail` |
93
- | 宏观 / LPR / CPI / GDP | `/v1/macro` | `region=cn/us/...` |
94
- | 产业链 / 上下游 / 某公司链上位置 | `/v1/industry-chain` | `mode=list/graph/stock` |
95
- | 筛选股票 / 低估高 ROE | `/v1/screen` | `expr` 多因子交集 或 `preset`(22 个预设)|
96
- | 只知道名字,要代码 | `/v1/search` | **先搜代码再查数据** |
97
- | 公司是做什么的 | `/v1/profile` | |
98
- | 融资融券 | `/v1/margin-trade` | `code` 必填(支持批量)|
99
- | 大宗交易 | `/v1/block-trade` | |
100
- | 我的用量 / 额度 | `/v1/usage` | |
101
-
102
- **完整参数与返回字段** → 读 `references/endpoints.md`。
103
-
104
- ## 五、四个必知语义(最常踩的坑)
105
-
106
- 1. **单位不统一,先看清**
107
- - `volume` 是**手**(×100 = 股)· `amount` 是**元**(不是万元)
108
- - 比率字段是**百分数**:`instBuyRate: 20` 表示 **20%**(不是 0.2)
109
- - 金额有时以**字符串**返回(`"135160431.2"`)→ **先 `float()` 再算**,否则 `+` 会拼字符串
110
-
111
- 2. **数据日期语义**:休市日**不会**变成"今天"。看返回里的 `date` 字段判断数据属于哪个交易日(`quote` 的最新一根就是当日实时)。
112
-
113
- 3. **返回结构:`data` 是主载荷,形状有 4 种**(统一信封 `{ok, endpoint, tier, elapsed_ms, source, data}`)
114
- - `data` 可能是:**对象数组**(多数端点)/ **表列表**(`finance`)/ **多段结构**(`shareholder`·`calendar`)/ **Markdown 文本**(`bond`·`sector` 等 9 个)
115
- - ⚠️ **`structured` / `tables` 是【条件字段】—— 不是每个端点都有**:**只有 `data` 是 Markdown 时才附**
116
- ⇒ 代码里**一律写 `body.get("structured")`**;写 `body["structured"]` 在 `quote`/`kline`/`finance` 上会 **KeyError**
117
- - ⚠️ `/v1/health` · `/v1/challenge` · `/v1/usage` 信封**没有 `data`**
118
- - 四种形状怎么判别 + 通吃写法 → `references/endpoints.md` §返回形态
119
-
120
- 4. **`ok:false` 不等于"我们写错了"**:那是**上游取数失败**(我们已自动换源,**不扣调用次数**)→ 重试一次通常就好。**空结果**(如当天没大宗交易)与"失败"是两件事。
121
-
122
- ## 六、错误与限流
123
-
124
- | 现象 | 含义 | 怎么办 |
125
- |---|---|---|
126
- | **401** | 没带 Key 调了付费端点 | 拿 Key,或改用 5 个免费端点 |
127
- | **429** | 超出档位频率(匿名 5 次/分)| 降频;或**解一次 PoW 挑战提到 60 次/分**(见下);或升级档位 |
128
- | **`ok:false`** | 上游取数失败(已自动换源)| **不扣次数**,重试一次 |
129
- | **200 但 data 为空** | 当前确实没有这类数据(如当天无大宗交易)| 换条件 / 稍后再试,**不是故障** |
130
- | **5xx** | 重试耗尽 | 稍后再试 |
131
-
132
- **匿名提额(PoW)**:
133
-
134
- ```bash
135
- # 1) 拿挑战
136
- curl "https://api.ashareapi.com/v1/challenge"
137
- # → {challenge, difficulty, expires_in, how_to}
138
- # 2) 算 nonce(sha256(challenge.nonce) 前 difficulty 位为 0),然后:
139
- curl -H "X-PoW: <challenge>.<nonce>" "https://api.ashareapi.com/v1/quote?code=sh600667"
140
- ```
141
-
142
- 详细错误语义 → 读 `references/errors.md`。
143
-
144
- ## 七、要写代码?用官方 SDK(Python / Node.js)
145
-
146
- **Python**:
147
-
148
- ```bash
149
- pip install ashareapi # 基础(返回 list[dict])
150
- pip install "ashareapi[pandas]" # 加 DataFrame 支持(推荐)
151
- ```
152
-
153
- ```python
154
- from ashareapi import AShareAPI
155
-
156
- cli = AShareAPI() # 免费端点无需 Key
157
- df = cli.quote("sh600667") # → DataFrame
158
- print(df[["date", "last", "turnover"]])
159
-
160
- cli = AShareAPI("ct-你的Key") # 付费端点
161
- print(cli.fund("sh600667")) # 资金流 + 龙虎榜 + 大宗 + 两融
162
- print(cli.screen(preset="low_pe", limit=10))
163
- ```
164
-
165
- **Node.js / TypeScript**:
166
-
167
- ```bash
168
- npm install ashareapi # 零运行时依赖(原生 fetch,需 Node ≥ 18)
169
- ```
170
-
171
- ```ts
172
- import { AShareAPI } from "ashareapi";
173
-
174
- const cli = new AShareAPI(); // 免费端点无需 Key
175
- const bars = await cli.quote("sh600667"); // → 对象数组
176
- console.log(bars[0].last);
177
-
178
- const paid = new AShareAPI({ apiKey: "ct-你的Key" });
179
- console.log(await paid.screen("", "low_pe", 10, "ROETTM"));
180
- ```
181
-
182
- > 两个 SDK **同 32 个方法 / 同 5 类异常 / 同重试策略**;差异只是语言惯例:
183
- > Python 用 `snake_case` 且返回 DataFrame,Node 用 `camelCase`(也认 `snake_case` 别名)且**全部返回 Promise**。
184
-
185
- **代码格式随便写**:`sh600667` / `600667.SH` / `600667` 都认(自动归一化)。
186
- **32 个端点 = 32 个方法**(`/v1/margin-trade` → Python `margin_trade()` / Node `marginTrade()`)。
187
-
188
- 完整用法与 5 类异常 → 读 `references/sdk.md`。
189
-
190
- ## 八、详细参考(按需读取,不要一次全读)
191
-
192
- | 文件 | 什么时候读 |
193
- |---|---|
194
- | [references/endpoints.md](references/endpoints.md) | 要确认某端点的**完整参数 / 返回字段** |
195
- | [references/fields.md](references/fields.md) | 要**算数**(单位换算、字段含义、字符串数字)|
196
- | [references/errors.md](references/errors.md) | 遇到 401/429/ok:false/空结果,或要处理限流 |
197
- | [references/sdk.md](references/sdk.md) | 用户要**写 Python / Node.js 代码**或问 SDK |
198
-
199
- ---
200
-
201
- **边界(诚实)**:
202
- - K 线**只提供日/周/月**,**没有分钟级**
203
- - 新闻/公告**全文**不在 API 范围(有 `dehydrated` 研报摘要、`events` 事件标签、`calendar` 事件日历)
204
- - 数据仅供研究参考,**不构成投资建议** —— 本 skill 只讲怎么取数与计算,不给买卖建议
205
-
206
- ---
207
-
208
- ## 九、本 skill 版本
209
-
210
- **当前版本:`0.2.4`(2026-09-30)**
211
-
212
- ### 怎么知道该更新
213
-
214
- 本 skill 是**随 API 演进的快照** —— 每次新增端点/字段,`references/` 里的清单会同步但**你手上装的可能还是旧版**。判断方法:
215
-
216
- | 检查 | 说明 |
217
- |---|---|
218
- | `metadata.version` | 看本文件 frontmatter 的版本号 |
219
- | **端点总数** | 对比现实:**当前 32 个**(`endpoints.md` 标题也是这个数)|
220
- | **MCP 工具数** | 当前 **24 个**(`list_tools` 返回数量)|
221
-
222
- **任一项对不上 → 你装的是旧版。**
223
-
224
- ### 怎么更新
225
-
226
- 1. 重新下载:**https://ashareapi.com/skill**(页面有 zip 下载)
227
- 2. 解压覆盖到你的 skills 目录(`.claude/skills/` · `.agents/skills/` · `.opencode/skills/` 等)
228
- 3. 重启客户端
229
-
230
- > ⚠️ **API 本身不需要更新** —— 端点永远是最新的(服务端演进);需要更新的是**这份说明**(否则你可能不知道新端点存在)。
231
-
232
- ### 版本记录
233
-
234
- | 版本 | 日期 | 变化 |
235
- |---|---|---|
236
- | `0.2.4` | 2026-09-30 | **文档表述统一**:全文改为面向使用者的表述;**端点 / 字段 / 口径无任何变化** |
237
- | `0.2.3` | 2026-09-28 | **补 K 线价格口径**:`/v1/kline` 明确「口径**固定为前复权**(除权除息日不跳空)、**无 `adjust` 参数**、**不要再自己复权**(会二次复权)」(`SKILL.md` 速查表 + `references/endpoints.md` 同步)|
238
- | `0.2.2` | 2026-09-26 | 换手率字段统一为 **`turnover`**(%)—— 与 `/v1/snapshot` 同名同值(`references/fields.md` 字段表 · `endpoints.md` · `sdk.md` 示例同步)|
239
- | `0.2.1` | 2026-09-26 | **完善返回结构文档**:明确 `structured`/`tables` 是**条件字段**(仅 `data` 为 Markdown 时才附)· 新增「`data` 四种形状」速查表 + 通吃写法 · `snapshot` 字段数 → **35** · 补 `finance` 表列表 / `shareholder`·`calendar` 多段结构 / `fund` 扁平 dict · 补 `profile` 字段说明 |
240
- | `0.2.0` | 2026-09-23 | 新增 `/v1/snapshot`(全字段画像)· `/v1/orderbook`(五档盘口)· 端点数 30→32 · MCP 工具 22→24 · 补字段单位与"计费=次数"说明 |
241
- | `0.1.0` | 2026-09-20 | 首个版本(30 个端点 · 22 个 MCP 工具)|
242
-
243
- **完整更新日志(含字段级变更)→ https://ashareapi.com/changelog**
244
-
1
+ ---
2
+ name: ashareapi
3
+ description: 用 ashareapi 获取 A 股数据:行情 / K线 / 财务三表 / 资金流 / 龙虎榜 / 板块 / 可转债 / 因子选股 / 宏观 / 产业链。当用户要查 A 股现价、K线走势、财报(营收净利毛利率)、主力资金、龙虎榜(机构/游资)、涨停、板块轮动、可转债条款(强赎/双低)、ETF、新股打新、指数估值、产业链上下游,或要写调用 A 股数据的代码、接 REST API / 官方 SDK(Python:pip install ashareapi · Node.js:npm install ashareapi)时使用。含 33 个端点的参数与字段语义、单位换算(volume 是手 / amount 是元 / 比率为百分数)、数据日期语义、常见错误与限流处理(匿名 5 次/分、单次 250 条、每天 10 万条;解一次 PoW 挑战提到 15 次/分,每日条数不变)。
4
+ license: MIT
5
+ metadata:
6
+ version: "0.2.7"
7
+ updated: "2026-10-06"
8
+ homepage: "https://ashareapi.com"
9
+ docs: "https://ashareapi.com/docs"
10
+ endpoints: "https://ashareapi.com/endpoints"
11
+ changelog: "https://ashareapi.com/changelog"
12
+ ---
13
+
14
+ # ashareapi — A 股数据 API
15
+
16
+ **33 个 HTTP 端点**(`https://api.ashareapi.com/v1/...`),覆盖行情 / K线 / **五档盘口** / 财务 / 资金 / 龙虎榜 / 板块 / 转债 / 选股 / 宏观 / 产业链。
17
+ **5 个端点无需 Key**(装上就能调),其余需要 Key(¥9.9 起)。另有**官方 SDK**:Python `pip install ashareapi` · Node.js / TypeScript `npm install ashareapi`。
18
+
19
+ ---
20
+
21
+ ## 一、先判断:这个任务要不要 Key
22
+
23
+ | 任务 | 免费端点够不够 |
24
+ |---|---|
25
+ | 现价 / K线 / 热搜 / 市场总览 / 涨跌分布 | ✅ **够,无需 Key**(先试这个)|
26
+ | 财报 / 资金流 / 龙虎榜 / 板块 / 转债 / 选股 / 宏观 … | ❌ 需要 Key(`Authorization: Bearer <key>`)|
27
+
28
+ **免费 5 个**:`/v1/quote`(行情)· `/v1/kline`(K线)· `/v1/hot`(热搜)· `/v1/market-overview`(大盘画像)· `/v1/changedist`(涨跌分布)
29
+ **工具端点**(也免 Key):`/v1/health`(健康检查)· `/v1/challenge`(PoW 提额)
30
+
31
+ ## 二、免费端点:直接调(无需任何鉴权)
32
+
33
+ ```bash
34
+ # 行情:现价 / 开高低 / 成交量 / 换手率
35
+ curl "https://api.ashareapi.com/v1/quote?code=sh600667"
36
+
37
+ # K线(日/周/月)
38
+ curl "https://api.ashareapi.com/v1/kline?code=sh600667&period=day&count=5"
39
+
40
+ # 热搜榜
41
+ curl "https://api.ashareapi.com/v1/hot?limit=10"
42
+ ```
43
+
44
+ Python:
45
+
46
+ ```python
47
+ import requests
48
+
49
+ r = requests.get("https://api.ashareapi.com/v1/quote",
50
+ params={"code": "sh600667"}, timeout=10)
51
+ body = r.json()
52
+ if not body.get("ok"):
53
+ raise RuntimeError(body) # 上游取数失败(已自动换源,且不扣次数)
54
+ bar = body["data"][0] # 最新一根(当日实时)
55
+ print(bar["date"], bar["last"], bar["turnover"])
56
+ ```
57
+
58
+ ## 三、带 Key 调用
59
+
60
+ ```bash
61
+ curl -H "Authorization: Bearer ct-你的Key" \
62
+ "https://api.ashareapi.com/v1/fund?code=sh600667"
63
+ ```
64
+
65
+ Key 从 https://ashareapi.com/pricing 获取。**401 = 没带 Key 调了付费端点**。
66
+
67
+ ## 四、按任务找端点(决策树)
68
+
69
+ | 用户想要 | 用这个端点 | 备注 |
70
+ |---|---|---|
71
+ | 现价 / 开高低 / 换手 | `/v1/quote` | 免费 |
72
+ | **封单多少 / 买盘卖盘 / 盘口 / 挂单** | **`/v1/orderbook`** | **五档盘口**(买五卖五·秒级快照·**盘中才有意义**·量单位=手)|
73
+ | **估值 / PE / PB / 市值 / 股本 / 涨停价** | **`/v1/snapshot`** | **全字段画像**(**仅A股**·付费·**要多项时比分别调更省次数**)|
74
+ | 走势 / 历史 K线 | `/v1/kline` | 日/周/月/季/年免费;**分钟线 `m1`~`m120` 付费**(窗口近 1 个月)。复权口径由服务端固定:日线及以上前复权(除权除息日不跳空),分钟线不复权 ——**不要再自己复权**(会二次复权)|
75
+ | 分时(盘中每分钟价+累计量)| `/v1/minute` | 付费;`days` 只有 `1`(当日)和 `5`(近 5 日)两档。⚠️ 与上面「分钟 K 线」不是一回事 |
76
+ | 什么股票热门 | `/v1/hot` | 免费 |
77
+ | 大盘怎么样 / 风格轮动 / 估值分位 | `/v1/market-overview` | 免费;`type` 选 summary/trade/interval/technical/margin/valuation/rotation |
78
+ | 涨跌家数 / 涨停家数 / 市场广度 | `/v1/changedist` | 免费;**当期口径**(别用 market-overview?type=updown,那是 T-1)|
79
+ | 财报 / 营收 / 净利润 / 毛利率 | `/v1/finance` | 三表 |
80
+ | 主力资金 / 资金流 / 龙虎榜 / 大宗 / 两融 | **`/v1/fund`** | **一个接口拿全交易面**(优先用)|
81
+ | 龙虎榜分榜(机构 / 游资 / 席位)| `/v1/lhb` | `type=institution/hotmoney/activeseat` |
82
+ | 技术面 / MACD / KDJ / RSI / BOLL | `/v1/technical` | |
83
+ | 谁在持有 / 股东户数 / 机构持仓 | `/v1/shareholder` | |
84
+ | 筹码 / 套牢盘 / 成本分布 | `/v1/chip` | |
85
+ | 板块涨幅榜 / 轮动 | `/v1/sector` | |
86
+ | 某板块贵不贵 / 估值分位 | `/v1/sector-valuation` | `code=pt01801780` 形式 |
87
+ | 可转债 / 强赎 / 双低 / 溢价 | `/v1/bond` | `code=sh113052` 形式 |
88
+ | ETF | `/v1/etf` | `code=sh510300` |
89
+ | 新股 / 打新 | `/v1/ipo` | |
90
+ | 分红送转 | `/v1/dividend` | |
91
+ | 个股事件(42 类)/ 解禁 / 回购 | `/v1/events` | |
92
+ | 个股事件日历(某日有什么事件)| `/v1/calendar` | **不是宏观日历**(宏观用 `/v1/macro`)|
93
+ | 研报 / 机构观点 | `/v1/dehydrated` | `mode=list/detail` |
94
+ | 宏观 / LPR / CPI / GDP | `/v1/macro` | `region=cn/us/...` |
95
+ | 产业链 / 上下游 / 某公司链上位置 | `/v1/industry-chain` | `mode=list/graph/stock` |
96
+ | 筛选股票 / 低估高 ROE | `/v1/screen` | `expr` 多因子交集 或 `preset`(22 个预设)|
97
+ | 只知道名字,要代码 | `/v1/search` | **先搜代码再查数据** |
98
+ | 公司是做什么的 | `/v1/profile` | |
99
+ | 融资融券 | `/v1/margin-trade` | `code` 必填(支持批量)|
100
+ | 大宗交易 | `/v1/block-trade` | |
101
+ | 我的用量 / 额度 | `/v1/usage` | |
102
+
103
+ **完整参数与返回字段** → 读 `references/endpoints.md`。
104
+
105
+ ## 五、四个必知语义(最常踩的坑)
106
+
107
+ 1. **单位不统一,先看清**
108
+ - `volume` 是**手**(×100 = 股)· `amount` 是**元**(不是万元)
109
+ - 比率字段是**百分数**:`instBuyRate: 20` 表示 **20%**(不是 0.2)
110
+ - 金额有时以**字符串**返回(`"135160431.2"`)→ **先 `float()` 再算**,否则 `+` 会拼字符串
111
+
112
+ 2. **数据日期语义**:休市日**不会**变成"今天"。看返回里的 `date` 字段判断数据属于哪个交易日(`quote` 的最新一根就是当日实时)。
113
+
114
+ 3. **返回结构:`data` 是主载荷,形状有 4 种**(统一信封 `{ok, endpoint, tier, elapsed_ms, source, data}`)
115
+ - `data` 可能是:**对象数组**(多数端点)/ **表列表**(`finance`)/ **多段结构**(`shareholder`·`calendar`)/ **Markdown 文本**(`bond`·`sector` 等 9 个)
116
+ - ⚠️ **`structured` / `tables` 是【条件字段】—— 不是每个端点都有**:**只有 `data` 是 Markdown 时才附**
117
+ ⇒ 代码里**一律写 `body.get("structured")`**;写 `body["structured"]` 在 `quote`/`kline`/`finance` 上会 **KeyError**
118
+ - ⚠️ `/v1/health` · `/v1/challenge` · `/v1/usage` 信封**没有 `data`**
119
+ - 四种形状怎么判别 + 通吃写法 → `references/endpoints.md` §返回形态
120
+
121
+ 4. **`ok:false` 不等于"我们写错了"**:那是**上游取数失败**(我们已自动换源,**不扣调用次数**)→ 重试一次通常就好。**空结果**(如当天没大宗交易)与"失败"是两件事。
122
+
123
+ ## 六、错误与限流
124
+
125
+ | 现象 | 含义 | 怎么办 |
126
+ |---|---|---|
127
+ | **401** | 没带 Key 调了付费端点 | 拿 Key,或改用 5 个免费端点 |
128
+ | **429** | 超出限额(匿名:**每分钟次数** 或 **当天条数**)| 次数超 → 降频,或**解一次 PoW 挑战提到 15 次/分**(见下);**条数超 → 解 PoW 无效**,次日恢复,或用 Key |
129
+ | **`ok:false`** | 上游取数失败(已自动换源)| **不扣次数**,重试一次 |
130
+ | **200 但 data 为空** | 当前确实没有这类数据(如当天无大宗交易)| 换条件 / 稍后再试,**不是故障** |
131
+ | **5xx** | 重试耗尽 | 稍后再试 |
132
+
133
+ **匿名提额(PoW)**:
134
+
135
+ ```bash
136
+ # 1) 拿挑战
137
+ curl "https://api.ashareapi.com/v1/challenge"
138
+ # → {challenge, difficulty, expires_in, how_to}
139
+ # 2) 算 nonce(sha256(challenge.nonce) 前 difficulty 位为 0),然后:
140
+ curl -H "X-PoW: <challenge>.<nonce>" "https://api.ashareapi.com/v1/quote?code=sh600667"
141
+ ```
142
+
143
+ ⚠️ PoW 只提升**每分钟次数**,**不提升每日条数** —— 匿名每天仍最多 **10 万条**;批量补历史/回测请用 Key。
144
+
145
+ 详细错误语义 → 读 `references/errors.md`。
146
+
147
+ ## 七、要写代码?用官方 SDK(Python / Node.js)
148
+
149
+ **Python**:
150
+
151
+ ```bash
152
+ pip install ashareapi # 基础(返回 list[dict])
153
+ pip install "ashareapi[pandas]" # 加 DataFrame 支持(推荐)
154
+ ```
155
+
156
+ ```python
157
+ from ashareapi import AShareAPI
158
+
159
+ cli = AShareAPI() # 免费端点无需 Key
160
+ df = cli.quote("sh600667") # → DataFrame
161
+ print(df[["date", "last", "turnover"]])
162
+
163
+ cli = AShareAPI("ct-你的Key") # 付费端点
164
+ print(cli.fund("sh600667")) # 资金流 + 龙虎榜 + 大宗 + 两融
165
+ print(cli.screen(preset="low_pe", limit=10))
166
+ ```
167
+
168
+ **Node.js / TypeScript**:
169
+
170
+ ```bash
171
+ npm install ashareapi # 零运行时依赖(原生 fetch,需 Node ≥ 18)
172
+ ```
173
+
174
+ ```ts
175
+ import { AShareAPI } from "ashareapi";
176
+
177
+ const cli = new AShareAPI(); // 免费端点无需 Key
178
+ const bars = await cli.quote("sh600667"); // → 对象数组
179
+ console.log(bars[0].last);
180
+
181
+ const paid = new AShareAPI({ apiKey: "ct-你的Key" });
182
+ console.log(await paid.screen("", "low_pe", 10, "ROETTM"));
183
+ ```
184
+
185
+ > 两个 SDK **同 33 个方法 / 同 5 类异常 / 同重试策略**;差异只是语言惯例:
186
+ > Python 用 `snake_case` 且返回 DataFrame,Node 用 `camelCase`(也认 `snake_case` 别名)且**全部返回 Promise**。
187
+
188
+ **代码格式随便写**:`sh600667` / `600667.SH` / `600667` 都认(自动归一化)。
189
+ **33 个端点 = 33 个方法**(`/v1/margin-trade` → Python `margin_trade()` / Node `marginTrade()`)。
190
+
191
+ 完整用法与 5 类异常 → 读 `references/sdk.md`。
192
+
193
+ ## 八、详细参考(按需读取,不要一次全读)
194
+
195
+ | 文件 | 什么时候读 |
196
+ |---|---|
197
+ | [references/endpoints.md](references/endpoints.md) | 要确认某端点的**完整参数 / 返回字段** |
198
+ | [references/fields.md](references/fields.md) | 要**算数**(单位换算、字段含义、字符串数字)|
199
+ | [references/errors.md](references/errors.md) | 遇到 401/429/ok:false/空结果,或要处理限流 |
200
+ | [references/sdk.md](references/sdk.md) | 用户要**写 Python / Node.js 代码**或问 SDK |
201
+
202
+ ---
203
+
204
+ **边界(诚实)**:
205
+ - K 线**只提供日/周/月**,**没有分钟级**
206
+ - 新闻/公告**全文**不在 API 范围(有 `dehydrated` 研报摘要、`events` 事件标签、`calendar` 事件日历)
207
+ - 数据仅供研究参考,**不构成投资建议** —— 本 skill 只讲怎么取数与计算,不给买卖建议
208
+
209
+ ---
210
+
211
+ ## 九、本 skill 版本
212
+
213
+ **当前版本:`0.2.7`(2026-10-06)**
214
+
215
+ **本版更新**:
216
+ - **错误与限流**:补充匿名额度口径 —— 单次最多 **250 条**、每天最多 **10 万条**;并区分两种 429(**每分钟次数**超 → 可解一次 PoW 挑战提额;**当天条数**超 → **解 PoW 无效**,次日恢复或用 Key)。
217
+ - **修正 frontmatter 语法**:此前会导致部分客户端读不到技能描述(技能无法被自动识别),现已修正。
218
+
219
+ ### 怎么知道该更新
220
+
221
+ 本 skill 是**随 API 演进的快照** —— 每次新增端点/字段,`references/` 里的清单会同步但**你手上装的可能还是旧版**。判断方法:
222
+
223
+ | 检查 | 说明 |
224
+ |---|---|
225
+ | `metadata.version` | 看本文件 frontmatter 的版本号 |
226
+ | **端点总数** | 对比现实:**当前 33 个**(`endpoints.md` 标题也是这个数)|
227
+ | **MCP 工具数** | 当前 **25 个**(`list_tools` 返回数量)|
228
+
229
+ **任一项对不上 → 你装的是旧版。**
230
+
231
+ ### 怎么更新
232
+
233
+ 1. 重新下载:**https://ashareapi.com/skill**(页面有 zip 下载)
234
+ 2. 解压覆盖到你的 skills 目录(`.claude/skills/` · `.agents/skills/` · `.opencode/skills/` 等)
235
+ 3. 重启客户端
236
+
237
+ > ⚠️ **API 本身不需要更新** —— 端点永远是最新的(服务端演进);需要更新的是**这份说明**(否则你可能不知道新端点存在)。
238
+
239
+ ### 版本记录
240
+
241
+ | 版本 | 日期 | 变化 |
242
+ |---|---|---|
243
+ | `0.2.7` | 2026-10-06 | **新增 `/v1/minute` 分时端点**(当日 / 近 5 日盘中走势,`days` 只有 `1`/`5` 两档)· 端点数 **32 → 33** · `/v1/kline` 放开**分钟线**(`m1`~`m120`)与 `start`/`end` 日期范围(均属付费层)· MCP 工具 **24 → 25** |
244
+ | `0.2.6` | 2026-10-03 | 匿名 **429 提示口径更准确**(单次最多 250 条 / 每天最多 10 万条;区分「每分钟次数超」与「当天条数超」) |
245
+ | `0.2.5` | 2026-10-01 | 文档更新:K 线复权口径表述统一 · 明确 `days` 只有 `1`/`5` 两档 |
246
+ | `0.2.4` | 2026-09-30 | **文档表述统一**:全文改为面向使用者的表述;**端点 / 字段 / 口径无任何变化** |
247
+ | `0.2.3` | 2026-09-28 | **补 K 线价格口径**:`/v1/kline` 明确「口径**固定为前复权**(除权除息日不跳空)、**无 `adjust` 参数**、**不要再自己复权**(会二次复权)」(`SKILL.md` 速查表 + `references/endpoints.md` 同步)|
248
+ | `0.2.2` | 2026-09-26 | 换手率字段统一为 **`turnover`**(%)—— 与 `/v1/snapshot` 同名同值(`references/fields.md` 字段表 · `endpoints.md` · `sdk.md` 示例同步)|
249
+ | `0.2.1` | 2026-09-26 | **完善返回结构文档**:明确 `structured`/`tables` 是**条件字段**(仅 `data` 为 Markdown 时才附)· 新增「`data` 四种形状」速查表 + 通吃写法 · `snapshot` 字段数 → **35** · 补 `finance` 表列表 / `shareholder`·`calendar` 多段结构 / `fund` 扁平 dict · 补 `profile` 字段说明 |
250
+ | `0.2.0` | 2026-09-23 | 新增 `/v1/snapshot`(全字段画像)· `/v1/orderbook`(五档盘口)· 端点数 30→32 · MCP 工具 22→24 · 补字段单位与"计费=次数"说明 |
251
+ | `0.1.0` | 2026-09-20 | 首个版本(30 个端点 · 22 个 MCP 工具)|
252
+
253
+ **完整更新日志(含字段级变更)→ https://ashareapi.com/changelog**
254
+