gangtise-openapi-cli 0.29.0 → 0.30.1
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.
- package/README.md +49 -197
- package/dist/src/cli.js +45 -8
- package/dist/src/core/args.js +85 -15
- package/dist/src/core/client.js +7 -5
- package/dist/src/core/commandBodies.js +52 -6
- package/dist/src/core/endpoints.js +9 -0
- package/dist/src/core/errors.js +8 -4
- package/dist/src/core/indicatorMatrix.js +106 -27
- package/dist/src/core/transport.js +6 -5
- package/dist/src/version.js +1 -1
- package/gangtise-openapi/SKILL.md +10 -8
- package/gangtise-openapi/references/commands/indicator.md +109 -40
- package/gangtise-openapi/references/examples.md +2 -2
- package/gangtise-openapi/references/response-schema.md +4 -3
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Indicator 命令详细参数(数据指标 EDE:证券级指标截面 /
|
|
1
|
+
# Indicator 命令详细参数(数据指标 EDE:证券级指标截面 / 时序 / 条件选股)
|
|
2
2
|
|
|
3
|
-
> 本组覆盖 `/application/open-indicator
|
|
3
|
+
> 本组覆盖 `/application/open-indicator/*`:证券级**数据指标**的检索与取数,主要用于多证券批量取已实现财务 / 估值指标。即使能搜到收盘价、成交量等行情指标,常规行情与 K 线仍走免费的 `quote`。
|
|
4
4
|
> 与 `alternative edb-*`(EDB 行业/宏观指标,无证券维度)是两套接口,别混。
|
|
5
5
|
>
|
|
6
|
-
> **取数前先 `indicator search` 拿 `indicatorCode
|
|
6
|
+
> **取数前先 `indicator search` 拿 `indicatorCode` 和 `parameterList`**,绝不猜测指标编码或参数名——服务端调过参数名(`adjustmentType` → `adjustType`),传错名是**静默失效**不是报错。
|
|
7
7
|
|
|
8
8
|
## EDE 与专用接口的优先级
|
|
9
9
|
|
|
@@ -27,8 +27,10 @@ gangtise indicator search --keyword <text> [--limit <n>]
|
|
|
27
27
|
- `--keyword`(**必选**):按指标名称模糊匹配。用具体词,如 `营业收入` / `基本每股收益` / `市盈率` / `总市值`,**不能用整句白话**("我想查一批公司的财务估值" ✗)
|
|
28
28
|
- `--limit`:返回条数上限,默认 50,最大 100
|
|
29
29
|
- 默认 `--format table` 只适合浏览名称;正式路由 / 取数前必须加 `--format json`,才能完成语义、`scopeList`、`parameterList` 三项校验
|
|
30
|
-
- 返回字段:`indicatorCode` / `indicatorName` / `description`(算法与口径)/ `scopeList`(该指标适用的市场 +
|
|
31
|
-
- **市场范围按指标判断**:`scopeList`
|
|
30
|
+
- 返回字段:`indicatorCode` / `indicatorName` / `description`(算法与口径)/ `scopeList`(该指标适用的市场 + 证券类型 + `usageRestriction`)/ `parameterList`(可传的 `--indicator-param` 参数名及枚举)/ `score`
|
|
31
|
+
- **市场范围按指标判断**:`scopeList` 会返回实际覆盖范围,且指标之间不同;不能笼统写成每个指标都覆盖 A / 港 / 美股。实测 `finc_pe_ttm` / `finc_pb_mrq` 仅 A 股,`is_op_rev_ttm` / `is_shnp_ttm` 覆盖 A 股 + 港股(2026-08-01 新增港股,实测有数)。目标列表含任一 scope 外证券时,本批 EDE 校验不通过,应回退专用接口
|
|
32
|
+
- **`scopeList[].usageRestriction`**:该指标在具体接口上的限制,`null` = 无限制。如「不支持指标时间序列接口」意味着只能用 `cross-section` / `screener`
|
|
33
|
+
- ⚠️ **`scopeList` 是声明不是保证**:`qte_mkt_cptl`/`shr_tot` 声称覆盖港股+美股,实测港股与美股均**无数据**(2026-08-02 复测)。而且无数据是**整列消失**不是返 `null`,批量前抽查一行——CLI 会在 stderr 提示哪些指标/证券被整个略过
|
|
32
34
|
- 美股代码用交易所后缀 `.O`(NASDAQ) / `.N`(NYSE),**不是 `.US`**——实测 `AAPL.US` 查不到数据,须用 `AAPL.O`(官方示例里的 `AAPL.US` 是笔误)
|
|
33
35
|
|
|
34
36
|
```bash
|
|
@@ -44,13 +46,16 @@ gangtise indicator cross-section --indicator <code> [--indicator <code2>] \
|
|
|
44
46
|
```
|
|
45
47
|
|
|
46
48
|
- `--indicator`(**至少 1 个**):指标编码,来自 `search`,可重复传多个
|
|
47
|
-
- `--security`(**至少 1 个**):证券代码,如 `600519.SH`(A股)/ `09992.HK`(港股)/ `AAPL.O`(美股,用 `.O`/`.N` 后缀,非 `.US
|
|
48
|
-
- `--date`(**必选**):数据日期 `yyyy-MM-dd
|
|
49
|
-
-
|
|
49
|
+
- `--security`(**至少 1 个**):证券代码,如 `600519.SH`(A股)/ `09992.HK`(港股)/ `AAPL.O`(美股,用 `.O`/`.N` 后缀,非 `.US`),可重复传多个。**也接受板块 ID**(`reference sector-search` 返回的 10 位 `sectorId`,如 `1000000287` 中信白酒 → 19 只成分股),代码与板块可混传,服务端取并集去重。⚠️ 中信行业码那类 9 位 ID(`100800109`)**不是** `sectorId`,传进去返 0 只
|
|
50
|
+
- `--date`(**必选**):数据日期 `yyyy-MM-dd`。**CLI 把它下发为每个指标各自的 `tradeDate`**(2026-08-01 起服务端取消了根级 date)。日期语义按指标分三类——财务报表指标=报告期末(可为非交易日,实测 `2024-03-31` 可取数)、`finc_pe_ttm` 等日频估值=交易日、`finc_pb_mrq`(MRQ) 等=最近报告期末(交易日取 `null`,详见下方「日期路由」)
|
|
51
|
+
- ⚠️ **吃 `reportDate` 的指标必须显式传**:`--indicator-param "code:reportDate=2024-12-31"`。这类指标收到 `tradeDate` 会**静默返回空结果**(不报错,实测 `is_op_rev_mom`)。CLI 检测到你已为某指标传了 `tradeDate` 或 `reportDate` 就不再注入 `--date`
|
|
52
|
+
- `sDate`(区间起始日)**不算**替代日期:它和 `tradeDate` 共存(`tradeDate` 是区间终点且 required),传了 `sDate` 后 `--date` 照常下发
|
|
53
|
+
- `--currency`:币种 `DFT`(原始,默认)/`CNY`/`HKD`/`USD`/`EUR`/`GBP`/`JPY`/`TWD`/`MOP`/`AUD`(**大写**,2026-08-01 起服务端枚举已统一大写)
|
|
50
54
|
- `--scale`:量纲 `0`(个,默认)/`3`(千)/`4`(万)/`6`(百万)/`8`(亿)/`9`(十亿)
|
|
55
|
+
- ⚠️ **根级 `--scale` 会污染不支持 scale 的指标**:`qte_close` 的 `parameterList` 里没有 `scale`,但根级 `--scale 8` 会把收盘价 1350.6 缩成 `0`(实测 2026-08-01,与文档「根级参数仅对支持的指标生效」不符)。价格类和金额类指标混查时,别用根级 `--scale`,改用 `--indicator-param "code:scale=8"` 只作用于该指标
|
|
51
56
|
- **支持多指标 × 多证券**(单日横截面)
|
|
52
|
-
- **输出(宽表)**:每行一只证券,列为 `
|
|
53
|
-
- **`--key-by name|code`**(默认 `name`):指标列头用显示名还是 `indicatorCode`。**批量按 code 回填必用 `--key-by code`**——指标名会碰撞(多个指标同显示名,如 `cf_finc_exp`/`_qtr`
|
|
57
|
+
- **输出(宽表)**:每行一只证券,列为 `security / name / <各指标名>…`。**没有 `date` 列**——查询日期现在挂在每个指标自己的参数上,各列可以是不同日期
|
|
58
|
+
- **`--key-by name|code`**(默认 `name`):指标列头用显示名还是 `indicatorCode`。**批量按 code 回填必用 `--key-by code`**——指标名会碰撞(多个指标同显示名,如 `cf_finc_exp`/`_qtr` 都叫「财务费用」)、服务端还会重排返回列序(实测请求 `qte_close,qte_vol` 回来是 `qte_vol,qte_close`),唯有 code 唯一且与顺序无关(行轴 `security` 本就是 code,`code` 模式整表可按 code 寻址,免去 raw API 手工回填)
|
|
54
59
|
|
|
55
60
|
```bash
|
|
56
61
|
# 多证券 × 同一报告期的已实现财务指标
|
|
@@ -58,8 +63,8 @@ gangtise indicator cross-section \
|
|
|
58
63
|
--indicator is_op_rev --indicator is_eps_bas \
|
|
59
64
|
--security 600519.SH --security 000858.SZ --security 300750.SZ \
|
|
60
65
|
--date 2025-12-31 --format table
|
|
61
|
-
# 列:
|
|
62
|
-
# 省略 reportType 即取合并口径(茅台2025=1688
|
|
66
|
+
# 列:security / name / 营业收入(利润表,累计) / 基本每股收益(利润表,累计)
|
|
67
|
+
# 省略 reportType 即取合并口径(茅台2025=1688亿);口径映射见下方「reportType 口径」
|
|
63
68
|
```
|
|
64
69
|
|
|
65
70
|
## 指标时间序列 `indicator time-series`
|
|
@@ -70,12 +75,13 @@ gangtise indicator time-series --indicator <code> [--indicator <code2>] \
|
|
|
70
75
|
[--calendar-type <ND|TD|WD>] [--currency <c>] [--scale <s>] [--indicator-param <spec>] [--key-by name|code]
|
|
71
76
|
```
|
|
72
77
|
|
|
73
|
-
- `--indicator` / `--security`:同上,但**只允许「多指标 × 单证券」或「单指标 × 多证券」**,不能两边都多个(要多 × 多用 `cross-section`,否则报 `
|
|
74
|
-
- `--start-date` / `--end-date`(**均必选**):区间端点 `yyyy-MM-dd`
|
|
75
|
-
- `--calendar-type`:日期类型 `ND`(自然日)/`TD`(交易日,默认)/`WD`(工作日)
|
|
76
|
-
- `--currency` / `--scale`:同 `cross-section`
|
|
78
|
+
- `--indicator` / `--security`:同上,但**只允许「多指标 × 单证券」或「单指标 × 多证券」**,不能两边都多个(要多 × 多用 `cross-section`,否则报 `100003`「仅支持多指标单证券或单指标多证券」)。**单指标时 `--security` 才能传板块 ID**;多指标时只能传一个证券代码、不得传板块 ID
|
|
79
|
+
- `--start-date` / `--end-date`(**均必选**):区间端点 `yyyy-MM-dd`。时序的时间范围由这两个参数统管,**不要**再用 `--indicator-param` 传 `tradeDate` 这类单日期参数
|
|
80
|
+
- `--calendar-type`:日期类型 `ND`(自然日)/`TD`(交易日,默认)/`WD`(工作日)。`TD` 且跨市场时,`date` 列是各市场交易日的**并集**
|
|
81
|
+
- `--currency` / `--scale`:同 `cross-section`(含根级 `--scale` 的污染坑)
|
|
77
82
|
- **输出(宽表)**:每行一个日期,列为 `date / <各序列名>…`;序列在「单证券」时是各**指标**,在「多证券」时是各**证券**
|
|
78
83
|
- **`--key-by name|code`**(默认 `name`):同 `cross-section`;`code` 模式下单证券列=各 `indicatorCode`、多证券列=各 `securityCode`,批量按 code 回填用它
|
|
84
|
+
- ⚠️ 部分指标标注**不支持时序接口**:`search` 返回的 `scopeList[].usageRestriction` 会写明(如「不支持指标时间序列接口」),`null` 表示无限制。**但它不是硬约束**——实测 `qte_vol_intvl` 带着该标注调时序照样返回数据,服务端不拦。把它当"口径可能不对、结果别当真"的提示,而不是"会报错"的保证
|
|
79
85
|
|
|
80
86
|
```bash
|
|
81
87
|
# 单个已实现估值指标 × 多证券:列 = 证券
|
|
@@ -85,48 +91,110 @@ gangtise indicator time-series --indicator finc_pe_ttm \
|
|
|
85
91
|
# date 贵州茅台 五粮液 宁德时代
|
|
86
92
|
```
|
|
87
93
|
|
|
94
|
+
## 条件选股 `indicator screener`
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
gangtise indicator screener --indicator <F1:code> [--indicator <F2:code2>] \
|
|
98
|
+
--security <code|sectorId> [--security <code2>] --expression <expr> \
|
|
99
|
+
--date <yyyy-MM-dd> [--indicator-param <F1:key=value>] [--key-by name|code]
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
按指标条件从一个证券范围里筛出符合条件的股票,一次调用完成「取数 + 过滤」,比 `cross-section` 拉全量再本地筛更省事。
|
|
103
|
+
|
|
104
|
+
- `--indicator`(**至少 1 个**):把变量绑定到指标,格式 `F1:指标code`。变量必须是 `F` + 正整数、同一次请求内不重复;建议从 `F1` 开始连续编号
|
|
105
|
+
- `--security`(**至少 1 个**):同 `cross-section`,证券代码与板块 ID 可混传取并集
|
|
106
|
+
- `--expression`(**必选**):筛选表达式,引用上面绑定的变量
|
|
107
|
+
- 比较:`==` `>` `<` `>=` `<=` `!=`
|
|
108
|
+
- 文本:`contains` / `notcontains`(不区分大小写,**仅对 `dataType: string` 的指标有效**)
|
|
109
|
+
- 逻辑:`&&` `||`,分组 `(` `)`
|
|
110
|
+
- `--date`(**必选**):下发为**每个**指标的 `tradeDate`(已带 `tradeDate`/`reportDate` 的不覆盖)。之所以必填且无条件下发:**screener 会丢弃任何 `parameters` 为空数组的指标**——`pty_op_scope` 这种无参指标按官方格式传 `[]` 时永远 0 命中,随便挂个(对它无意义的)`tradeDate` 就正常返回。CLI 已自动处理,你只要记得传 `--date`
|
|
111
|
+
- `--indicator-param`:格式是 **`F1:key=value`(按变量,不是按 code)**。引用了没绑定的变量会直接报错,不会静默丢弃
|
|
112
|
+
- `--expression` 里引用未绑定的变量,CLI **本地就拦**(不发请求、不计费);服务端也会报 `100003`
|
|
113
|
+
- **输出(宽表)**:同 `cross-section`,每行一只**命中**的证券,列为 `security / name / <各指标名>…`;无命中返回空表
|
|
114
|
+
- **积分**:与 `cross-section` 同价(按单元格计),但计费基数是**筛选前**的范围 × 指标数,别拿全市场板块随手试
|
|
115
|
+
|
|
116
|
+
### 已知服务端缺陷(2026-08-02 实测,已报后台)
|
|
117
|
+
|
|
118
|
+
| 现象 | 影响 | 现在怎么办 |
|
|
119
|
+
| :--- | :--- | :--- |
|
|
120
|
+
| **同一 `indicatorCode` 绑到两个变量** → 返回空结果 | 「同一指标比两个日期」这类用法暂时不可用 | CLI 会在 stderr 警告。拆成两次 `cross-section` 再本地比 |
|
|
121
|
+
| **`contains` / `notcontains` 需要指标带参数才生效** | 官方文档的招牌示例 `F3 contains '酒'`(`parameters: []`)0 命中 | CLI 已通过必填 `--date` 自动绕过,正常可用 |
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# 文本筛选:白酒板块里经营范围含「酒」的公司
|
|
125
|
+
gangtise indicator screener --indicator F1:pty_op_scope \
|
|
126
|
+
--security 1000000287 --expression "F1 contains '酒'" \
|
|
127
|
+
--date 2026-07-31 --format table # 19 只全部命中
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# 中信白酒板块里,市值≥500亿 且 PE(TTM)≤30
|
|
132
|
+
gangtise indicator screener \
|
|
133
|
+
--indicator F1:qte_mkt_cptl --indicator F2:finc_pe_ttm \
|
|
134
|
+
--indicator-param "F1:scale=8" \
|
|
135
|
+
--security 1000000287 \
|
|
136
|
+
--expression "F1 >= 500 && F2 <= 30" \
|
|
137
|
+
--date 2026-07-31 --format table
|
|
138
|
+
# security / name / 总市值 / 市盈率(TTM) —— 19 只成分股筛出 5 只
|
|
139
|
+
```
|
|
140
|
+
|
|
88
141
|
## 复权 / 指标专属参数 `--indicator-param`
|
|
89
142
|
|
|
90
|
-
通用的币种/量纲用 `--currency` / `--scale`;指标**专属**参数用 `--indicator-param`,格式 `指标code:参数key
|
|
143
|
+
通用的币种/量纲用 `--currency` / `--scale`;指标**专属**参数用 `--indicator-param`,格式 `指标code:参数key=值`,可重复(screener 例外,按变量索引:`F1:key=值`)。下面的行情复权仅演示底层参数语法;常规行情 / K 线仍优先 `quote`,不要照此例改走 EDE:
|
|
91
144
|
|
|
92
145
|
```bash
|
|
93
|
-
# 茅台收盘价后复权(
|
|
146
|
+
# 茅台收盘价后复权(adjustType=3)
|
|
94
147
|
gangtise indicator cross-section --indicator qte_close --security 600519.SH \
|
|
95
|
-
--date
|
|
96
|
-
# 不复权
|
|
148
|
+
--date 2024-01-02 --indicator-param "qte_close:adjustType=3"
|
|
149
|
+
# 不复权 1685.01 → 前复权 1531.225 → 后复权 13609.6168
|
|
97
150
|
```
|
|
98
151
|
|
|
99
|
-
- `
|
|
152
|
+
- `adjustType`(复权方式):`1`=不复权(默认) `2`=前复权 `3`=后复权 `4`=定点复权(配 `baseDate` 基期)
|
|
153
|
+
- ⚠️ **参数名是 `adjustType`,不是 `adjustmentType`**(官方文档示例写的 `adjustmentType` 是错的)。传错名服务端**静默忽略并退回不复权**——实测 `adjustmentType=3` 返回 1685.01(= 不复权),看着正常其实是错数据
|
|
154
|
+
- 前复权以最新交易日为基准,所以在**最新交易日上前复权价 == 不复权价**;验证复权是否生效要用历史日期
|
|
100
155
|
- 同一指标多个参数 → 重复 `--indicator-param "code:k1=v1" --indicator-param "code:k2=v2"`
|
|
101
|
-
-
|
|
156
|
+
- **参数名与取值一律以 `indicator search --format json` 的 `parameterList` 为准**,不要照抄本文档或官方文档的示例名——服务端会调整参数名(`adjustmentType` → `adjustType` 就是一例),且传错名是静默失效而非报错。币种枚举 2026-08-01 起**统一大写**(`DFT`/`CNY`/`HKD`…),历史文档里的小写 `dft`/`cny` 已过时
|
|
102
157
|
- `--indicator-param` 与根级 `--currency`/`--scale` 冲突时,以 `--indicator-param` 为准
|
|
103
158
|
|
|
104
159
|
## 必填参数与错误码(取数前必读)
|
|
105
160
|
|
|
106
|
-
|
|
161
|
+
**缺数据的三种形态(2026-08-02 实测,务必分清)**:
|
|
162
|
+
|
|
163
|
+
| 缺的范围 | 服务端怎么返 | 后果 |
|
|
164
|
+
| :--- | :--- | :--- |
|
|
165
|
+
| **部分**缺(某证券的某指标) | 该单元格 `null`,行列都在 | 安全,一眼可见 |
|
|
166
|
+
| 某指标对 universe 内**所有**证券都无数据 | 该指标**整列**从 `indicatorList` 消失 | 🔴 `--key-by code` 回填时 key 根本不存在 |
|
|
167
|
+
| 某证券对**所有**指标都无数据 | 该证券**整行**从 `securityCodeList` 消失 | 🔴 跨市场批量静默少行,退出码仍 0 |
|
|
168
|
+
| 整个查询无数据 | `securityCodeList`/`values` 皆 `[]`(`Total: 0`),不再报 `999999` | 🔴 **参数写错也长这样** |
|
|
169
|
+
|
|
170
|
+
实测:3 个指标查港股 `09992.HK` 只回 1 个指标(市值/股本整列消失);`qte_mkt_cptl` 查 `600519.SH`+`09992.HK` 只回 1 行。**CLI 会在 stderr 打印被整个略过的指标 / 证券**(`--format json` 下 stdout 仍是干净 JSON),看到警告就去核对 `scopeList` 和日期语义。
|
|
171
|
+
|
|
172
|
+
取数报错主要是这几个码:
|
|
107
173
|
|
|
108
174
|
| 错误码 | 实际含义 | 怎么办 |
|
|
109
175
|
| :--- | :--- | :--- |
|
|
110
|
-
| `
|
|
111
|
-
|
|
|
112
|
-
| `
|
|
176
|
+
| `100001` | **缺少必填参数**:如 `universe` 没传 | 补齐 `--indicator`/`--security` |
|
|
177
|
+
| `100003`@400 | 入参/表达式错误:`time-series` 传了「多指标 × 多证券」、`expression` 引用未声明变量、`indicatorParamList` 的 code 不在 `indicatorCodeList` 里 | 按 msg 改;多 × 多改用 `cross-section`。CLI 已在本地拦截「表达式引用未绑定变量」,不会白发一次请求 |
|
|
178
|
+
| `140002`@500 | **终态参数错**:指标必填参数缺失、枚举越界(如「参数 adjustType 的值 99 不在有效范围内 [1,2,3,4]」)、表达式语法错误 | **不重试**(CLI 已把 140002 列为终态码)。读 `search --format json` 的 `parameterList` 改参数名/取值 |
|
|
179
|
+
| `999999` | 系统故障。2026-08-01 起「无数据」已改为返回空数组,所以这个码基本只剩真故障(2026-07-26 曾出现 EDE 取数端全线 999999,08-01 已恢复) | CLI 对 indicator 端点**不重试此码**(v0.27.0);确认参数无误仍报错就是服务端问题 |
|
|
113
180
|
| `130001`(旧 `410004`) | 数据未找到,或**该指标无权限**(内层信封失败会带具体 msg,如"指标无权限";此码被服务端复用) | 检查查询条件与指标权限;换证券/日期仍失败多为无权限,联系管理员开通 |
|
|
114
181
|
|
|
115
|
-
### 必填参数(`
|
|
182
|
+
### 必填参数(`140002` 的根因)
|
|
116
183
|
|
|
117
|
-
|
|
184
|
+
相当一部分指标缺必填参数时会报 `140002`。**先完成语义 + `scopeList` + `parameterList` 三项校验;其中凡 `required:true` 的参数都用 `--indicator-param "指标code:参数=值"` 补上。** 三类高频必填参数:
|
|
118
185
|
|
|
119
186
|
| 参数 | 适用指标 | 示例 |
|
|
120
187
|
| :--- | :--- | :--- |
|
|
121
188
|
| `periodNum` | N 期统计(N 期均值/最值,如 `finc_roe_avg_avg` 平均ROE N期均值) | `--indicator-param "finc_roe_avg_avg:periodNum=4"`;部分还需配**年报日期**才出数(实测 `finc_roe_avg_avg`@`2026-03-31` 空、@`2025-12-31` 有) |
|
|
122
|
-
| `
|
|
189
|
+
| `sDate` | 区间类的**起始日**(如 `qte_vol_intvl` 区间成交量、`qte_avg_vol` 区间日均成交量),格式 `yyyy-MM-dd` | `--indicator-param "qte_vol_intvl:sDate=2024-01-02"`。⚠️ **`sDate` 不能替代 `tradeDate`**——它是区间起点,`tradeDate`(=区间终点)仍是 required,`--date` 会照常下发。历史文档写的 `startDate=YYYYMMDD` 已不存在,传它是静默失效(茅台实测:错名 296 万 vs 正确 4673 万)。另:`qte_amp_mo`(月振幅)等周期变体现在只吃 `tradeDate`,没有起始日参数 |
|
|
123
190
|
| `fiscalYear` | 年度/报告期类(如 `div_cash_yr` 年度现金分红) | `--indicator-param "div_cash_yr:fiscalYear=2025"` |
|
|
124
191
|
|
|
125
192
|
> `paramValue` 一律按**字符串**约定传(`periodNum=4` 内部即 `"4"`,CLI 已处理)。
|
|
126
193
|
|
|
127
194
|
## 取数最佳实践
|
|
128
195
|
|
|
129
|
-
- **先 search 做三项校验**:看 `indicatorName` + `description` 确认语义和口径,看 `scopeList` 确认覆盖全部目标市场 /
|
|
196
|
+
- **先 search 做三项校验**:看 `indicatorName` + `description` 确认语义和口径,看 `scopeList` 确认覆盖全部目标市场 / 证券类型(并看 `usageRestriction` 有无接口限制),再看 `parameterList` 补齐必填参数(required)并核对专属参数**名称**与枚举(`adjustType`/`scale`/`currency` 等);任一不符就回退专用接口。**参数名以 search 返回为准,不要照抄文档示例**——服务端调过参数名,传错名是静默失效不是报错。
|
|
197
|
+
- **`scopeList` 声称覆盖 ≠ 真有数**:`qte_mkt_cptl`/`shr_tot` 的 `scopeList` 写着 A股+港股+美股,但实测港股(`09992.HK`/`00700.HK`)返回 `null`(2026-08-01)。同一次调用里 A 股正常、港股行情类(`qte_close`/`qte_vol`)也正常,说明是这两个指标的港股数据没到位。跨市场批量取数后**逐市场抽查一行**,别默认 scopeList 就是事实。
|
|
130
198
|
- **公司类型决定有没有这个科目**:财务科目分公司类型——银行有「存放同业」、券商有「客户资金存款」、保险有「预收保费」,一般企业没有。某指标对茅台返回 `null`(无此科目),换到对应类型证券(招行/中信/平安)就有数。
|
|
131
199
|
- **日期路由**:
|
|
132
200
|
- 财务报表类(`bs_`/`is_`/`cf_`/`div_`/`shr_`,以及 description 明确按报告期统计的 `finc_`)→ 用**报告期末**(Q1 `2026-03-31`、年报 `2025-12-31`,无需是交易日)
|
|
@@ -134,27 +202,28 @@ gangtise indicator cross-section --indicator qte_close --security 600519.SH \
|
|
|
134
202
|
- 现金流量表附注/间接法科目(多数 `cf_`)→ **只在年报/半年报披露**,季报日期取不到,改用年报日期 `2025-12-31`
|
|
135
203
|
- 行情类(`qte_` 等)→ 用**交易日**,但常规行情仍应改走 `quote`
|
|
136
204
|
- **混合日期语义要拆查询**:同时要“某报告期营收 / EPS”和“估值 PE / PB”时,按各自有效日期分别调用 `cross-section` 再按 `security` 合并(财务=报告期末、PE=最新交易日、PB(MRQ)=最近报告期末);不要把不同日期语义的指标塞进同一个 `--date`
|
|
137
|
-
-
|
|
205
|
+
- **探索性取数**:只有**部分**缺值才返回 `null` 且保留行列;整指标 / 整证券无数据是**整列 / 整行消失**,整个查询无数据是**空表**(不再报 `999999`)。看趋势用 `time-series` + 覆盖报告期的区间,但不能把缺值当成通过语义 / scope 校验。
|
|
138
206
|
- **名称反查 code 要核对,别取首条**:存在同显示名的兄弟指标——单季 `cf_finc_exp_qtr` 与累计 `cf_finc_exp` 都叫「财务费用」,`bs_fmt`/`cf_fmt`/`is_fmt` 都叫「报表格式」。`search` 按名称模糊匹配,目标 code 高概率在 top1 但不绝对,要看 `indicatorCode` 确认。
|
|
139
|
-
-
|
|
140
|
-
-
|
|
141
|
-
-
|
|
207
|
+
- **批量查询做失败拆分**:某指标**缺必填参数**或入参错误时会整批报 `140002`,逐指标单查能定位是哪个指标缺参/不可查。留意 stderr 的「整列/整行被略过」警告——那不是报错,但同样是这批数据不完整的信号。
|
|
208
|
+
- **市值量纲(复测 2026-08-01)**:`qte_mkt_cptl`(总市值)**实测仅 A 股有数**——`scopeList` 已声称覆盖港/美股,但港股实测仍返 `null`(`shr_tot` 总股本同样);**默认返原始「元」**(茅台 ≈ `1.7e12`,即 1.7 万亿),别误当天文数字。用 `scale` 数字码缩放(`0`元 / `3`千 / `4`万 / `6`百万 / `8`亿 / `9`十亿——`scale=8` → `16883` 亿元)、`currency` 换币种(**大写** `DFT`本币 / `CNY` / `HKD` / `USD` …)。**跨证券比市值前先统一 `scale`+`currency`**。
|
|
209
|
+
- **币种与汇率(复测 2026-08-01,已修复)**:`DFT`(原始币种)识别正确——A股=CNY、港股行情=HKD、美股=USD;汇率换算自洽(互逆且三角一致,误差 <0.003%)。⚠️ 但**同一只港股,行情类的原始币种是 HKD、财务类可能是 CNY**(如泡泡玛特财报以人民币计),跨市场比财务数据时显式传 `--currency CNY` 别依赖 `DFT`。另:财务类指标的汇率按**报告期**折算、行情类按查询日折算,两者隐含汇率会有细微差异,属正常口径差别。
|
|
210
|
+
- **EDE 财务指标的 `reportType`(2026-08-01 裁决完毕,悬案关闭)**:服务端 enum label 已改正,现在 **label 与实际取数一致**,直接按 label 传即可:
|
|
142
211
|
|
|
143
|
-
| value |
|
|
212
|
+
| value | 口径 | 说明 |
|
|
144
213
|
|-------|---------|------|
|
|
145
214
|
| `1`(默认,省略即此值) | **合并报表** | 绝大多数场景要的就是这个 |
|
|
146
215
|
| `2` | **合并报表(调整)** | 该报告期无重述数时为空 |
|
|
147
216
|
| `3` | **母公司报表** | |
|
|
148
217
|
| `4` | **母公司报表(调整)** | 该报告期无重述数时为空 |
|
|
149
218
|
|
|
150
|
-
|
|
219
|
+
实测闭环(`is_tot_op_rev` + 中信证券 `600030.SH` FY2024 营业总收入,2026-08-01):`1`→637.8922亿、`2`→581.19亿、`3`→321.924亿、`4`→321.924亿;与 `fundamental income-statement --security-code 600030.SH --fiscal-year 2024 --period annual` 返回的「合并报表」`totalOpRev = 63,789,215,688.23`(637.892亿)在 `1` 上完全吻合。取数值与 2026-07-24 的历史实测一致——**变的只是服务端 label,取数从未变过**。历史文档里「label 与 value 错位、按 label 传会取反」的警告已作废。
|
|
151
220
|
|
|
152
|
-
`2`/`4` 返回空值**不是枚举失效**,是该报告期尚无调整表(如最新年报 FY2025:`1`/`3` 有数、`2`/`4` 无值,与 `fundamental --report-type consolidatedRestated`
|
|
221
|
+
`2`/`4` 返回空值**不是枚举失效**,是该报告期尚无调整表(如最新年报 FY2025:`1`/`3` 有数、`2`/`4` 无值,与 `fundamental --report-type consolidatedRestated` 同期无数据一致)。港股默认口径同样是合并。
|
|
153
222
|
|
|
154
223
|
## 通用说明
|
|
155
224
|
|
|
156
|
-
- **发现流程**:`indicator search --format json` → 核对 `indicatorName` + `description`、`scopeList
|
|
157
|
-
- **积分**:`search` 免费;`cross-section` / `time-series` 按请求单元格数量计费,标价为每 100 单元格 A 股 0.05 / 港股 0.1 / 美股 0.2 积分,每次查询不足 100 单元格按 100 计
|
|
158
|
-
-
|
|
225
|
+
- **发现流程**:`indicator search --format json` → 核对 `indicatorName` + `description`、`scopeList`(含 `usageRestriction`)、`parameterList`(**参数名以此为准**)→ 三项都通过才用 `cross-section` / `time-series` / `screener`
|
|
226
|
+
- **积分**:`search` 免费;`cross-section` / `time-series` / `screener` 按请求单元格数量计费,标价为每 100 单元格 A 股 0.05 / 港股 0.1 / 美股 0.2 积分,每次查询不足 100 单元格按 100 计
|
|
227
|
+
- **空结果排查顺序**:整查询无数据现在返回空表而非报错,所以空表既可能是真无数据、也可能是参数写错。按序排查:① 参数名对不对(`indicator search` 的 `parameterList`)② 日期语义对不对(`tradeDate` vs `reportDate`)③ `scopeList` 覆不覆盖该市场 ④ 才考虑确实没数据
|
|
159
228
|
- **数据权限**:试用账号默认可取近 3 年;正式账号按服务等级
|
|
160
229
|
- 所有格式(table/json/jsonl/csv/markdown)均可用;导出宽表给 Excel 直接用 `--format csv --output xxx.csv`
|
|
@@ -241,7 +241,7 @@
|
|
|
241
241
|
- scopeList:覆盖全部三只 A 股;缺失/null/空也视为不通过
|
|
242
242
|
- parameterList:补 required 参数并核对枚举
|
|
243
243
|
任一不符 → 回退相应专用接口。
|
|
244
|
-
3. 三类指标日期语义不同 → 拆三次截面,均加 `--key-by code`(列头用 indicatorCode,跨三张表按 code 稳定合并、免受同名/服务端重排干扰;省略 reportType
|
|
244
|
+
3. 三类指标日期语义不同 → 拆三次截面,均加 `--key-by code`(列头用 indicatorCode,跨三张表按 code 稳定合并、免受同名/服务端重排干扰;省略 reportType 即取合并口径,label 与取数已一致:1=合并 2=合并(调整) 3=母公司 4=母公司(调整)):
|
|
245
245
|
a) 财务(营收/EPS)用报告期末 2025-12-31:
|
|
246
246
|
gangtise indicator cross-section \
|
|
247
247
|
--indicator is_op_rev --indicator is_eps_bas \
|
|
@@ -257,7 +257,7 @@
|
|
|
257
257
|
--date 2026-03-31 --key-by code --format json
|
|
258
258
|
4. 按 security 合并三张宽表(列头即 indicatorCode,各取所需日期的值);不要把不同日期语义的指标塞进同一个 --date。
|
|
259
259
|
5. 计费:search 免费;三次取数各按请求单元格数量计费,每次不足 100 单元格按 100 计。
|
|
260
|
-
6. 无数据:单元格缺值返回 null
|
|
260
|
+
6. 无数据:单元格缺值返回 null 且不丢证券行;整个查询无数据返回空表(不再报 999999)——空表也可能是参数名/日期语义写错,先核对 parameterList、日期语义、scopeList 和公司类型。
|
|
261
261
|
```
|
|
262
262
|
|
|
263
263
|
## 例 16:A 股资金流向(个股 vs 全市场按日分片)
|
|
@@ -82,7 +82,8 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
|
|
|
82
82
|
| alternative edb-data | 列表,每行 `{date, <indicatorId>: value, ...}` 宽表 | `date` + 每个 `--indicator-id` 一列(该日指标值) |
|
|
83
83
|
| alternative concept-info | `{conceptId, conceptName, ...}`(单对象,**非列表**) | `conceptName` / `definition` / `investmentLogic` / `industrySpace` / `competitiveLandscape` / `keyEvents[].date` / `keyEvents[].content`;文本字段未配置为 `null` |
|
|
84
84
|
| alternative concept-securities | `{conceptId, conceptName, securityCount, securityDetail}`(单对象,分组) | `securityCount` / `securityDetail[].groupName` / `securityDetail[].securityList[].securityCode` / `.securityName` / `.isKey` / `.inclusionReason`;无成分股时 `securityDetail` 为 `null` |
|
|
85
|
-
| indicator search | `[{indicatorCode, indicatorName, ...}]`(列表) | `indicatorCode` / `indicatorName` / `description` / `scopeList[].market` / `scopeList[].securityType` / `parameterList[].paramKey
|
|
86
|
-
| indicator cross-section | CLI 拍平为宽表 `{list, total}` | `list[].
|
|
87
|
-
| indicator time-series | CLI 拍平为宽表 `{list, total}` | `list[].date` +
|
|
85
|
+
| indicator search | `[{indicatorCode, indicatorName, ...}]`(列表) | `indicatorCode` / `indicatorName` / `description` / `scopeList[].market` / `scopeList[].securityType` / `scopeList[].usageRestriction`(接口限制,`null`=无限制) / `parameterList[].paramKey`(**参数名以此为准**) / `.enumList[].value` / `score` |
|
|
86
|
+
| indicator cross-section | CLI 拍平为宽表 `{list, total}` | `list[].security` / `list[].name` + 每个指标名一列;**单日多指标 × 多证券**,每行一只证券。**v0.30.0 起没有 `date` 列**(查询日期改挂在每个指标的参数上,各列可为不同日期);原始响应的 `values` 为 `[证券][指标]`(2026-08-01 转置) |
|
|
87
|
+
| indicator time-series | CLI 拍平为宽表 `{list, total}` | `list[].date` + 序列列:单证券时列=各指标、多证券时列=各证券;每行一个日期。原始响应 `values` 仍为 `[序列][日期]` |
|
|
88
|
+
| indicator screener | CLI 拍平为宽表 `{list, total}` | 同 `cross-section`:`list[].security` / `list[].name` + 每个指标名一列,每行一只**命中**的证券;无命中返回空表。原始响应的 `indicatorList[]` 多一个 `field`(F1/F2…),CLI 用它给同 code 的重复列去重 |
|
|
88
89
|
| lookup broker-org / meeting-org list | `[...]` | `[].id` / `[].name` |
|