gangtise-openapi-cli 0.33.0 → 0.34.0

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.
@@ -6,41 +6,54 @@
6
6
 
7
7
  **关键规则**:查"最近"K线必须显式 `--start-date`/`--end-date` 拉范围,再从 `tradeDate` 取尾部最近 N 条;不要只用 `--limit N`(会截取查询窗口开头)。
8
8
 
9
- **自动分片**(v0.12.0;v0.14.2 修正分片粒度并注入 limit=10000):`--security all` 跨日期范围 CLI 会自动按日切片并并发执行(A 股 1 天/片,美股 1 天/片,HK 2 天/片,指数 30 天/片),合并结果返回。CLI 在 `--security all` 路径会自动把 `limit` 抬到 10000(API 上限),避免默认 6000 行截断。无需手动按季度分批。
9
+ 🔴 **全市场关键字换了(2026-08-14)**:`quote day-kline` 的 `--security all` **已不再支持**,改为三个市场关键字之一——`aShares` / `hkStocks` / `usStocks`,且**必须单独传**(不能与证券代码或另一个关键字混填)。传 `all` 或混填 CLI 会直接报错并提示正确写法。三个已下线的旧命令(`day-kline-hk` / `day-kline-us` / `index-day-kline`)仍认 `all`。
10
+
11
+ **自动分片**:全市场关键字跨日期范围时 CLI 自动按日切片并并发执行,合并结果返回,无需手动分批。分片粒度按各市场单个交易日的行数规模定,保证单请求不撞 10000 行的 API 上限:
12
+
13
+ | 命令 | 全市场关键字 | 分片粒度 |
14
+ | :-- | :-- | :-- |
15
+ | `day-kline` | `aShares` | 1 天/片 |
16
+ | `day-kline` | `hkStocks` | 2 天/片 |
17
+ | `day-kline` | `usStocks` | 1 天/片 |
18
+ | `fund-flow` | `aShares` | 1 天/片 |
19
+ | `day-kline-hk` / `day-kline-us` / `index-day-kline`(旧) | `all` | 2 / 1 / 15 天/片 |
20
+
21
+ 分片路径会自动把 `limit` 抬到 10000(API 上限),避免默认 6000 行截断;按日分片自动跳过周六日。
10
22
 
11
23
  **日K线历史性**(v0.14.0 起 API 文档明确):所有日K线接口仅返回**历史数据**,不提供实时行情。盘中实时数据请改用 `quote realtime`。当日数据入库时间:A 股约 15:30、港股约 16:30、美股约 07:00(北京时间)。
12
24
 
13
25
  ---
14
26
 
15
- ## 日 K 线(A 股) `quote day-kline`
27
+ ## 日 K 线(统一,A 股 / 港股 / 美股 / 指数) `quote day-kline`
16
28
 
17
29
  ```bash
18
30
  gangtise quote day-kline [--security <code>] [--start-date <YYYY-MM-DD>] [--end-date <YYYY-MM-DD>] [--limit <n>] [--field <name>]
19
31
  ```
20
32
 
21
- - 支持 `.SH` `.SZ` `.BJ`,`--security all` 全市场
22
- - `--limit` 默认 6000,上限 10000
23
- - 常用字段:`open` `high` `low` `close` `pctChange` `volume` `amount`
24
-
25
- ## 日 K 线(港股) `quote day-kline-hk`
33
+ **2026-08-14 起这一个命令覆盖全部品种**,港股 / 美股 / 指数不用再换命令,也可以在一次请求里混着传:
26
34
 
27
- ```bash
28
- gangtise quote day-kline-hk [--security <code>] [--start-date <YYYY-MM-DD>] [--end-date <YYYY-MM-DD>] [--limit <n>] [--field <name>]
29
- ```
35
+ | 品种 | 代码格式 | 示例 |
36
+ | :-- | :-- | :-- |
37
+ | A 股 | `.SH` `.SZ` `.BJ` | `600519.SH` `835305.BJ` |
38
+ | 港股 | `.HK` | `00700.HK` |
39
+ | 美股 | `.O` 纳斯达克 / `.N` 纽交所 / `.A` AMEX | `AAPL.O` |
40
+ | 交易所指数 | `.SH` `.SZ` `.BJ` | `000001.SH` 上证指数、`399006.SZ` 创业板指 |
41
+ | 概念指数 | `.GT` | `880134.GT` 机器人 |
42
+ | 行业指数 | `.CI` 中信 / `.SWI` 申万(一二三级) | `821031.SWI` |
30
43
 
31
- - 支持 `.HK`,`--security all` 全市场
44
+ - **全市场**:`--security aShares` / `hkStocks` / `usStocks`,**必须单独传**(见文件开头)。⚠️ 指数**不支持**全市场关键字,必须逐个传代码
45
+ - 混市场查询时各证券只返回其所属交易所的交易日:春节期间 A 股休市而美股正常,则当期只有美股行;美国独立日反之
32
46
  - `--limit` 默认 6000,上限 10000
47
+ - 常用字段:`open` `high` `low` `close` `pctChange` `volume` `amount` `adjustFactor`
48
+ - `adjustFactor` 复权因子:后复权价 = 不复权价 × `adjustFactor`;前复权价 = 不复权价 × `adjustFactor` ÷ 最新交易日的 `adjustFactor`。**指数无复权因子,该字段为 `null`**
33
49
 
34
- ## 日 K 线(美股) `quote day-kline-us`
50
+ ## ⚠️ 已下线的三个旧命令(仍可调用)
35
51
 
36
- ```bash
37
- gangtise quote day-kline-us [--security <code>] [--start-date <YYYY-MM-DD>] [--end-date <YYYY-MM-DD>] [--limit <n>] [--field <name>]
38
- ```
52
+ `quote day-kline-hk` / `quote day-kline-us` / `quote index-day-kline` 的能力已并入上面的 `day-kline`,官方于 2026-08-14 把它们从菜单下线,接口仍可调用。**新代码一律用 `day-kline`**,理由不止是少记三个命令:
39
53
 
40
- - 美股代码格式:`AAPL.O`(纳斯达克 `.O`,纽交所 `.N`,AMEX `.A`),`--security all` 全市场
41
- - 数据范围:NYSE / NASDAQ / AMEX
42
- - `--limit` 默认 6000,上限 10000
43
- - 字段与 A 股/港股相同,货币单位为美元
54
+ - 旧命令**不校验证券代码**——传错代码返回 `{"total":0}` 而不是报错,与「该票该区间真无数据」无法区分;`day-kline` 会报 `120001`
55
+ - 参数与字段和 `day-kline` 完全一致(`--security` / `--start-date` / `--end-date` / `--limit` / `--field`),迁移只是换命令名
56
+ - 三者的全市场关键字仍是 `all`(不是 `aShares` 那套)
44
57
 
45
58
  ## 实时行情 `quote realtime`
46
59
 
@@ -48,8 +61,9 @@ gangtise quote day-kline-us [--security <code>] [--start-date <YYYY-MM-DD>] [--e
48
61
  gangtise quote realtime [--security <code>] [--field <name>]
49
62
  ```
50
63
 
51
- - **覆盖三大市场**:支持 A 股 / 港股 / 美股代码混合传入(如 `--security 600519.SH --security 00700.HK --security AAPL.O`)
52
- - **全市场关键字**:`--security aShares` 全部 A 股 / `--security hkStocks` 全部港股 / `--security usStocks` 全部美股;建议配合 `--field` 精简返回字段
64
+ - **覆盖三大市场 + 指数**:A 股 / 港股 / 美股个股与交易所指数(`.SH`/`.SZ`/`.BJ`)、概念指数(`.GT`)、行业指数(`.CI`/`.SWI`)可混合传入(如 `--security 600519.SH --security 00700.HK --security 000001.SH --security 880134.GT`)
65
+ - **全市场关键字**:`--security aShares` 全部 A 股 / `hkStocks` 全部港股 / `usStocks` 全部美股,**必须单独传**(不能与代码或另一个关键字混填,CLI 会本地拦截);建议配合 `--field` 精简返回字段。⚠️ 指数不支持全市场关键字
66
+ - 指数返回的是点位,无货币单位;概念 / 行业指数交易时间与 A 股一致
53
67
  - 返回**最新时刻**的行情快照(最新价/开高低/涨跌/成交量额/振幅)
54
68
  - 非交易时间返回最近一个交易日的收盘快照;停牌证券返回停牌前最后一个有效快照
55
69
  - **实测全量字段(16 个,2026-07-24)**:`securityCode` `exchange` `tradeDate` `tradeTime` `open` `high` `low` `latestPrice` `preClose` `change` `pctChange` `volume` `amount` `turnoverRate` `amplitude` `volumeRatio`
@@ -74,24 +88,29 @@ gangtise quote fund-flow [--security <code>] [--start-date <YYYY-MM-DD>] [--end-
74
88
  - 金额单位:元;占比单位:%(各分类流入占比之和 = 100)
75
89
  - 无积分消耗
76
90
 
77
- ## 指数日 K 线 `quote index-day-kline`
91
+ ## 指数日 K 线 `quote index-day-kline`(⚠️ 已下线,改用 `day-kline`)
78
92
 
79
93
  ```bash
80
94
  gangtise quote index-day-kline [--security <code>] [--start-date <YYYY-MM-DD>] [--end-date <YYYY-MM-DD>] [--limit <n>] [--field <name>]
81
95
  ```
82
96
 
83
- - 沪深京指数:如 `000001.SH` 上证综指、`399001.SZ` 深成指;`--security all` 全市场指数
97
+ - 沪深京指数:如 `000001.SH` 上证综指、`399001.SZ` 深成指;`--security all` 全市场指数(**仍是 `all`,不是 `aShares` 那套**)
84
98
  - `--limit` 默认 6000,上限 10000
85
99
  - 常用字段:`securityCode` `securityName` `tradeDate` `open` `high` `low` `close` `preClose` `change` `pctChange` `volume` `amount`
86
100
  - `securityName` 为指数名称(如 `上证指数`),v0.15.0 起返回
101
+ - **还值得用它的两个场景**(都是 `day-kline` 做不到的,实测 2026-08-13):
102
+ 1. **一次拿全部沪深京指数**(`--security all`)——`day-kline` 的指数必须逐个传代码
103
+ 2. **要指数名称**——`index-day-kline` 返回 `securityName`(如「上证指数」),`day-kline` **没有这个字段**,查指数只拿得到代码
104
+ - 反过来 `day-kline` 独有 `adjustFactor`(复权因子),但指数本来就没有复权,该字段查指数时恒为 `null`
87
105
 
88
- ## 分钟 K 线(A 股) `quote minute-kline`
106
+ ## 分钟 K 线 `quote minute-kline`
89
107
 
90
108
  ```bash
91
109
  gangtise quote minute-kline --security <code> [--start-time <datetime>] [--end-time <datetime>] [--limit <n>] [--field <name>]
92
110
  ```
93
111
 
94
- - 仅支持 A 股,**必须传 `--security`**(否则返回 `100003`,msg 为「securityCode不可为空」;2026-07-20 实测)
112
+ - 支持**沪深** A 股个股(`.SH` / `.SZ`,不含北交所)、交易所指数(`.SH` / `.SZ`)、概念指数(`.GT`)、行业指数(`.CI` / `.SWI`),2026-08-14 起扩展;**必须传 `--security`**(否则返回 `100003`,msg 为「securityCode不可为空」;2026-07-20 实测)
113
+ - **一次只能查一只**(参数是 `securityCode` 单值,不是列表),要多只就循环调用
95
114
  - `--start-time` / `--end-time`:`yyyy-MM-dd HH:mm:ss`(兼容 `yyyy-MM-dd` 自动补全)
96
115
  - `--limit` 默认 6000,上限 10000
97
116
  - 常用字段:`securityCode` `tradeTime` `open` `high` `low` `close` `change` `pctChange` `volume` `amount`
@@ -108,7 +108,7 @@ gangtise reference constant-category [--format json]
108
108
  >
109
109
  > 先记住三套码的归属,**别把行业码算到 `gangtiseIndustry` 头上**:`citicIndustry` = 30 条行业码 `1008001xx`;`swIndustry` = 31 条行业码 `104xx0000`;`gangtiseIndustry` = **只有 6 条方向码** `122000xxx`(宏观 `122000001` / 策略 `122000002` / 固收 `122000003` / 金工 `122000004` / 海外 `122000005` / 其他 `122000007`),里面**没有任何行业**,去它那里找「食品饮料」永远找不到。
110
110
  >
111
- > - **`--industry`(industryList)→ 用 `citicIndustry`(`1008001xx`)**:opinion / research / foreign-report / official-account 正确过滤。`swIndustry`(`104xx0000`)在这 4 个上**也生效,但不是等效**——两套码的行业成分不同,4 个里有 2 个结果集对不上(research / foreign-report 完全一致;**opinion 与 official-account 传两套码取回的条数相差约 2%–5%**)。所以**统一用中信码**,同一批查询里别把两套码混着传。方向码 `122000xxx` 在 `--industry` 上一律返 0。⚠️ 两个例外:`insight foreign-opinion` / `independent-opinion` 只要传 `--industry` 就拿不到数据(不报错,且 **payload 是字面 `null`、不是空 list**,详见 `insight.md`),只能不带该过滤取回后本地筛;`vault wechat-message-list` 的 `--industry` 两套码都不生效(详见 `vault.md`)。
111
+ > - **`--industry`(industryList)→ 用 `citicIndustry`(`1008001xx`)**:opinion / research / foreign-report / official-account 正确过滤。`swIndustry`(`104xx0000`)在这 4 个上**也生效,但不是等效**——两套码的行业成分不同,4 个里有 2 个结果集对不上(research / foreign-report 完全一致;**opinion 与 official-account 传两套码取回的条数相差约 2%–5%**)。所以**统一用中信码**,同一批查询里别把两套码混着传。方向码 `122000xxx` 在 `--industry` 上一律返 0。⚠️ 一个例外:`insight foreign-opinion` / `independent-opinion` 只要传 `--industry` 就拿不到数据(不报错,且 **payload 是字面 `null`、不是空 list**,详见 `insight.md`),只能不带该过滤取回后本地筛。`vault wechat-message-list` 的 `--industry` **只认中信码**,申万码会被静默忽略并返回全量(详见 `vault.md`)。
112
112
  > - **`--research-area`(researchAreaList)→ 用 `citicIndustry` 行业码 `1008001xx`,方向再叠 `gangtiseIndustry` 的 `122000xxx`**。⚠️ **申万码 `104xx0000` 只有 `summary` / `pamirs-summary` 认**,其余端点返 0(与传乱码表现一致,不报错)。逐端点实测(同一行业分别传三套码,✅ = 正常过滤,❌ = 返 0):
113
113
  >
114
114
  > | 端点 | 中信 `1008001xx` | 申万 `104xx0000` | 方向 `122000xxx` |
@@ -224,9 +224,9 @@ gangtise lookup meeting-org list # 会议/牵头机构全量(--instit
224
224
  | 银行 / 银行股 | 银行 | `104480000` | `821047.SWI` |
225
225
  | 汽车 / 新车 | 汽车 | `104280000` | `821036.SWI` |
226
226
 
227
- > ¹ 第 3 列是**申万码**(`104xx0000`),仅在 opinion / research / foreign-report / official-account 上可作 `--industry` 使用,且**与中信码不等效**(opinion / official-account 两套码结果集不同,见上方 ⭐ 权威口径);用于 `--research-area` 时只有 summary / pamirs-summary 认,其余端点返 0。`vault wechat-message-list` 的 `--industry` 与码表无关——**两套码都不生效**——通用/推荐的**中信码**(`1008001xx`)见 `references/lookup-ids.md` 中信表或 `constant-list --category citicIndustry`。
227
+ > ¹ 第 3 列是**申万码**(`104xx0000`),仅在 opinion / research / foreign-report / official-account 上可作 `--industry` 使用,且**与中信码不等效**(opinion / official-account 两套码结果集不同,见上方 ⭐ 权威口径);用于 `--research-area` 时只有 summary / pamirs-summary 认,其余端点返 0。`vault wechat-message-list` 的 `--industry` **只认中信码,申万码被静默忽略**。通用/推荐的**中信码**(`1008001xx`)见 `references/lookup-ids.md` 中信表或 `constant-list --category citicIndustry`。
228
228
 
229
- > **参数名选择**:`--industry`(industryList,用 `citicIndustry` 码 `1008001xx`)用于 opinion / research / foreign-report / official-account(`foreign-opinion` / `independent-opinion` / `vault wechat-message-list` 也有这个参数,但**当前不生效**,见上方 ⭐ 权威口径);`--research-area`(researchAreaList,行业用 `citicIndustry` 码 `1008001xx`、方向用 `gangtiseIndustry` 码 `122000xxx`)用于 opinion / summary / pamirs-summary / roadshow / site-visit / forum / my-conference;`--gts-code` 仅用于 `ai security-clue`(需申万格式 `821xxx.SWI`,不是数字 ID)。注意 strategy(线下策略会)无 `--research-area`,只按 `--institution` / `--location` 筛。
229
+ > **参数名选择**:`--industry`(industryList,用 `citicIndustry` 码 `1008001xx`)用于 opinion / research / foreign-report / official-account / `vault wechat-message-list`(后者只认中信码);`foreign-opinion` / `independent-opinion` 也有这个参数,但**当前不生效**,见上方 ⭐ 权威口径;`--research-area`(researchAreaList,行业用 `citicIndustry` 码 `1008001xx`、方向用 `gangtiseIndustry` 码 `122000xxx`)用于 opinion / summary / pamirs-summary / roadshow / site-visit / forum / my-conference;`--gts-code` 仅用于 `ai security-clue`(需申万格式 `821xxx.SWI`,不是数字 ID)。注意 strategy(线下策略会)无 `--research-area`,只按 `--institution` / `--location` 筛。
230
230
 
231
231
  > **"消费"歧义**:用户说"消费/大消费"覆盖多个子行业(食品饮料 `104340000` / 商贸零售 `104450000` / 社会服务 `104460000` / 家电 `104330000` / 纺织服饰 `104350000` / 美容护理 `104770000`),需向用户确认具体方向,或用 `--keyword 消费` 做宽泛搜索。
232
232
 
@@ -49,7 +49,8 @@ gangtise vault wechat-message-list [--keyword <text>] [--security <code>] [--wec
49
49
 
50
50
  - 数据权限:仅用户已绑定并激活群消息助理、且助理已入群的群消息
51
51
  - `--security`:按证券代码过滤(如 `000001.SZ`),可重复
52
- - `--industry`:⚠️ **本命令上该过滤当前不生效**(2026-08-08 复测:不传 / 中信码 `100800111` / 申万码 `104340000` / 乱码,四种都返回同一个 total)。中信码和申万码都不起作用,需要按行业收窄时改在本地按返回内容筛
52
+ - `--industry`:**只认中信码**(`1008001xx`,见 `reference constant-list --category citicIndustry`)。⚠️ 申万码(`104xx0000`)和任何不认识的值都会被**静默忽略、返回未过滤的全量**,不报错——所以别混用码表,拿到的条数与不加过滤一样时先核对码系。返回行里不含行业标签字段,过滤在服务端完成
53
+ - 🔴 **`--industry` 是收窄工具,不是全量召回**:行业标签由服务端标注,**同一条消息可能挂多个行业,也可能一个都没挂**。实测同一个关键词加上「本行业」过滤后,命中数掉到三到四成——**少掉的既有没打标签的,也有被标到相邻行业去的**(如半导体相关的消息在计算机 / 机械 / 通信下同样查得到)。所以「按行业筛出 N 条」不能读成「该行业只有 N 条」;要尽量全,用 `--keyword` 取回后本地判断,或把相邻行业码一起查再去重
53
54
  - `--wechat-group-id`:先用 `vault wechat-chatroom-list` 查;可重复
54
55
  - `--category`:`text` | `image` | `documents` | `url`(可重复)
55
56
  - `--tag`:`roadShow` | `research` | `strategyMeeting` | `meetingSummary` | `industryComment` | `companyComment` | `earningsReview`(可重复)
@@ -74,13 +74,13 @@
74
74
  **用户**:"比亚迪 A 股和港股最近的日 K 线"
75
75
 
76
76
  ```
77
- 1. 路由 → quote day-kline + quote day-kline-hk(跨市场需分别调用)
77
+ 1. 路由 → quote day-kline(2026-08-14 起一个命令覆盖 A/港/美股,跨市场可一次查完)
78
78
  2. 比亚迪 A 股 002594.SZ,港股 01211.HK
79
79
  "最近" → K 线默认今日往前 45 天(保证含最近 10 个交易日)
80
80
  3. Pre-flight:认证 OK
81
- 4. gangtise quote day-kline --security 002594.SZ --start-date 2026-03-19 --end-date 2026-05-03 --format json
82
- gangtise quote day-kline-hk --security 01211.HK --start-date 2026-03-19 --end-date 2026-05-03 --format json
83
- 5. 合并两次结果,按 tradeDate 取尾部最近 10 个交易日
81
+ 4. gangtise quote day-kline --security 002594.SZ --security 01211.HK --start-date 2026-03-19 --end-date 2026-05-03 --format json
82
+ 5. 按 securityCode 分组,各自按 tradeDate 取尾部最近 10 个交易日
83
+ 注意:两地交易日历不同(A 股与港股假期不重合),同一日期未必两边都有行——按 securityCode 分组后再取尾部,别按行下标对齐
84
84
  ```
85
85
 
86
86
  ## 例 6:指数最近值(务必拉范围)
@@ -88,10 +88,10 @@
88
88
  **用户**:"查上证综指最近的指数"
89
89
 
90
90
  ```
91
- 1. 路由 → quote index-day-kline
91
+ 1. 路由 → quote day-kline(指数已并入,index-day-kline 已下线)
92
92
  2. 上证综指 → 000001.SH;"最近" → 今日往前 45 天
93
93
  3. Pre-flight:认证 OK;今天若周末 end-date 仍填当天,API 返回最近交易日
94
- 4. gangtise quote index-day-kline --security 000001.SH --start-date 2026-03-19 --end-date 2026-05-03 --format json
94
+ 4. gangtise quote day-kline --security 000001.SH --start-date 2026-03-19 --end-date 2026-05-03 --format json
95
95
  5. 按 tradeDate 取尾部最近 10 个交易日。**不要用 --limit 20**(截取的是窗口开头)
96
96
  ```
97
97
 
@@ -257,7 +257,7 @@
257
257
  --date 2026-07-31 --key-by code --format json
258
258
  4. 按 security 合并两张宽表(列头即 indicatorCode,各取所需日期的值);不要把不同日期语义的指标塞进同一个 --date。
259
259
  5. 计费:search 免费;两次取数各按请求单元格数量计费,每次不足 100 单元格按 100 计。
260
- 6. 无数据(无覆盖 / 非交易日 / 未来日期)一律保留行列并给占位单元格,退出码 0——但占位值多数是 null、个别指标(如 is_dnrpnp)是 0,0 会穿过比较与聚合,别当真值(见 commands/indicator.md)。整列/整行消失现在只意味着那个 code 服务端不认识——指标码拼错,或证券后缀错(美股用 .O/.N,不是 .US),CLI 会标 partial + 退出码 3 并在 stderr 列出。空表则是「一个 code 都没认出来」或参数名写错,先核对代码后缀与 parameterList。
260
+ 6. 无数据(无覆盖 / 非交易日 / 未来日期)一律保留行列并给占位单元格,退出码 0——但占位值多数是 null、个别指标(如 is_dnrpnp)是 0,0 会穿过比较与聚合,别当真值(见 commands/indicator.md)。代码写错或参数名写错则直接报 100003 并点名是哪个(指标码拼错、证券后缀错如美股写成 .US、参数名写错、同 code 重复配置),按报错改即可。
261
261
  ```
262
262
 
263
263
  ## 例 15b:帕米尔专家纪要(新库,筛选项与踩坑都和 summary 不同)
@@ -6,9 +6,9 @@
6
6
 
7
7
  ## Quote 行情
8
8
 
9
- ### 日K线(A股 `quote day-kline` / 港股 `quote day-kline-hk` / 美股 `quote day-kline-us`)
9
+ ### 日K线 `quote day-kline`(A股 / 港股 / 美股 / 各类指数;旧的 `day-kline-hk` / `day-kline-us` 已下线,字段相同)
10
10
 
11
- 三者字段相同(货币单位随市场:A股=元、港股=港元、美股=美元):
11
+ 各市场字段相同(货币单位随市场:A股=元、港股=港元、美股=美元;**指数为点位、无货币单位,且 `adjustFactor` 恒为 `null`**):
12
12
 
13
13
  | 字段 | 含义 | 字段 | 含义 |
14
14
  |------|------|------|------|
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## 中信行业分类(--industry 参数)
8
8
 
9
- 完整列表用 `reference constant-list --category citicIndustry`(30 条)。**`--industry` 全命令通用首选用这套(`1008001xx`)**——opinion / research / foreign-report / official-account 都正确过滤(⚠️ 三个例外:`insight foreign-opinion` / `independent-opinion` 传了 `--industry` 拿不到数据、且 **payload 是字面 `null` 不是空 list**;`vault wechat-message-list` 的 `--industry` 两套码都不生效、连乱码也返全量);这套 ID 同时也是 `--research-area` **行业维度唯一全端点通吃的一套**(见下方研究方向)。
9
+ 完整列表用 `reference constant-list --category citicIndustry`(30 条)。**`--industry` 全命令通用首选用这套(`1008001xx`)**——opinion / research / foreign-report / official-account 都正确过滤,`vault wechat-message-list` 也认这一套(⚠️ 两个例外:`insight foreign-opinion` / `independent-opinion` 传了 `--industry` 拿不到数据、且 **payload 是字面 `null` 不是空 list**);这套 ID 同时也是 `--research-area` **行业维度唯一全端点通吃的一套**(见下方研究方向)。
10
10
 
11
11
  | ID | 行业 | ID | 行业 |
12
12
  |----|------|----|------|
@@ -30,7 +30,7 @@
30
30
 
31
31
  ## 申万行业(--industry 参数)
32
32
 
33
- 完整列表用 `reference constant-list --category swIndustry`(31 条)。⚠️ 申万码(`104xx0000`)只在**部分** insight list 上可作 `--industry` 使用,且**与中信码不等效**——两套码行业成分不同,实测 opinion 与 official-account 上取回的结果集就对不上(同一行业相差约 2%–5%),别混用;用于 `--research-area` 时**只有 `summary` / `pamirs-summary` 认,其余端点返 0**(不报错,与传乱码表现一致)。`vault wechat-message-list` 的 `--industry` **两套码都不生效**(连不存在的码也返全量,该过滤整个被忽略)——哪套码用于哪些命令的**权威口径见 `references/commands/reference-and-lookup.md`「行业 / 研究方向过滤——选哪套 category」**(含逐端点实测矩阵),勿在此重复枚举。拿不准就统一用上方中信码。
33
+ 完整列表用 `reference constant-list --category swIndustry`(31 条)。⚠️ 申万码(`104xx0000`)只在**部分** insight list 上可作 `--industry` 使用,且**与中信码不等效**——两套码行业成分不同,实测 opinion 与 official-account 上取回的结果集就对不上(同一行业相差约 2%–5%),别混用;用于 `--research-area` 时**只有 `summary` / `pamirs-summary` 认,其余端点返 0**(不报错,与传乱码表现一致)。`vault wechat-message-list` 的 `--industry` **只认中信码**,传申万码会被静默忽略并返回全量——哪套码用于哪些命令的**权威口径见 `references/commands/reference-and-lookup.md`「行业 / 研究方向过滤——选哪套 category」**(含逐端点实测矩阵),勿在此重复枚举。拿不准就统一用上方中信码。
34
34
 
35
35
  | ID | 行业 | ID | 行业 | ID | 行业 |
36
36
  |----|------|----|------|----|------|
@@ -4,7 +4,7 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
4
4
 
5
5
  > 例外:`indicator`(EDE)四个接口(`search` / `cross-section` / `time-series` / `screener`)成功时**双层信封**(`data` 里再裹一层 `{code, status, data}`)。内层字段名 2026-08-01 起为 `securityCodeList` / `securityNameList` / `indicatorList[{code,name,dataType}]`(screener 另带 `field`),`values` 是 2D 矩阵:**截面与 screener 为 `[证券][指标]`**(该版转置过,此前是 `[指标][证券]`)、时序仍为 `[序列][日期]`。
6
6
  >
7
- > **缺数据 vs 代码写错**(2026-08-08 实测):无数据 / 无覆盖一律保留行列并给占位单元格——**多数指标是 `null`,个别(如 `is_dnrpnp`)是 `0`,`0` 会穿过比较与聚合,详见 `commands/indicator.md`**。仍会整列 / 整行消失的只有**服务端解析不了的 code**——指标 code 拼错,或证券 code 后缀错(美股是 `.O`/`.N`,`AAPL.US` 会整行消失)。请求里没有任何可解析 code 时才是全空数组。CLI 的 `indicator` 子命令已二次解包、拍平成宽表,并在整列/整行被略过时标 `partial` + `omittedIndicators`/`omittedSecurities` + 退出码 3——**这个信号现在读作「有 code 写错了」**。**`screener` 例外**:把缺列的变量当作无法求值,按表达式的**布尔结构**判断是否还有分支能成立(`A && B` 要两边、`A || B` 只要一边)。一条都不剩 → **退出码 1 且不输出**(那些行以「通过了该条件」的名义呈现,而条件根本无法证明被执行过);仍有分支可求值、或缺的只是输出用的辅助变量 → `partial` + 退出码 3。直接 `raw call indicator.*` 只会剥外层,内层需自行处理。
7
+ > **缺数据 vs 代码写错**(2026-08-15 实测):无数据 / 无覆盖一律保留行列并给占位单元格——**多数指标是 `null`,个别(如 `is_dnrpnp`)是 `0`,`0` 会穿过比较与聚合,详见 `commands/indicator.md`**。**代码写错则直接报 `100003` 并点名**(指标 code 拼错 →「指标 xxx 不存在」;证券 code 后缀错 →「xxx 不是有效证券或者板块ID」,美股是 `.O`/`.N` 不是 `.US`),**无论同批有没有正确的 code 都会报**。CLI 的 `indicator` 子命令已二次解包、拍平成宽表;`partial` + `omittedIndicators`/`omittedSecurities` + 退出码 3 的差集检测仍保留作兜底,但当前服务端行为下基本收不到样本。**`screener` 例外**:把缺列的变量当作无法求值,按表达式的**布尔结构**判断是否还有分支能成立(`A && B` 要两边、`A || B` 只要一边)。一条都不剩 → **退出码 1 且不输出**(那些行以「通过了该条件」的名义呈现,而条件根本无法证明被执行过);仍有分支可求值、或缺的只是输出用的辅助变量 → `partial` + 退出码 3。直接 `raw call indicator.*` 只会剥外层,内层需自行处理。
8
8
 
9
9
  ## 通用模式(5 类)
10
10
 
@@ -23,7 +23,7 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
23
23
  | insight opinion list | `{list, total}` | `list[].id` / `list[].title` / `list[].publishDate` / `list[].chiefName` / `list[].securityCode` / `list[].institutionName` |
24
24
  | insight summary list | `{list, total}` | `list[].summaryId` / `list[].title` / `list[].publishTime` |
25
25
  | insight summary download | 文件路径(stdout) | — |
26
- | insight pamirs-summary list | `{list, total}` | `list[].summaryId` / `list[].title` / `list[].brief` / `list[].summaryTime`(纪要生成时间)/ `list[].publishTime`(发布时间)/ `list[].securityList[]{securityCode, securityName}` / `list[].researchAreaList[]{researchAreaId, researchAreaName}` / `list[].conceptList[]{conceptId, conceptName}` / `list[].categoryList` / `list[].marketList`。⚠️ 标签字段大面积不回填:`conceptList` **在所有查法下恒为空**(接口也没有 concept 过滤参数,拿不到);`categoryList` 与 `marketList` **只在用 `--category` 或 `--market` 任一过滤时才回填**(两者绑定,一起有或一起没有)。拉全量再本地分组会丢标签 |
26
+ | insight pamirs-summary list | `{list, total}` | `list[].summaryId` / `list[].title` / `list[].brief` / `list[].summaryTime`(纪要生成时间)/ `list[].publishTime`(发布时间)/ `list[].securityList[]{securityCode, securityName}` / `list[].researchAreaList[]{researchAreaId, researchAreaName}` / `list[].conceptList[]{conceptId, conceptName}` / `list[].categoryList` / `list[].marketList`。⚠️ `conceptList` / `categoryList` / `marketList` 三个标签字段**稀疏,且是否有值随记录和查法而变**:不带筛选时经常整条为空,用 `--category` 或 `--market` 任一过滤时回填率明显更高(这两个字段绑定,一起有或一起没有)。所以**别拉全量再本地分组**(会漏记录),也**别据此断言某条记录没有该属性**(为空只说明这次没回填)。详见 `commands/insight.md` |
27
27
  | insight pamirs-summary download | 文件路径(stdout) | — |
28
28
  | insight roadshow / site-visit / strategy / forum list | `{list, total}` | `list[].id` / `list[].title` / `list[].publishTime` / `list[].institution.institutionName` |
29
29
  | insight research list | `{list, total}` | `list[].reportId` / `list[].title` / `list[].brief`(全文摘要) / `list[].publishTime` / `list[].publisher.brokerName` / `list[].securityList[].rating` |
@@ -56,11 +56,11 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
56
56
  | reference concept-search | `{returnedCount, list}` | `list[].conceptId` / `list[].conceptName` / `list[].matchScore` |
57
57
  | reference sector-search | `{returnedCount, list}` | `list[].sectorId` / `list[].sectorName` / `list[].hierarchy`(层级路径) / `list[].matchScore` |
58
58
  | reference sector-constituents | `{total, list}` | `list[].gtsCode` / `list[].gtsName`;total=0 说明 sectorId 不对(先 sector-search 确认) |
59
- | quote day-kline / day-kline-hk / day-kline-us / index-day-kline | `{fieldList, list}` 或规范化后 `{list: [{...}]}` | `tradeDate` / `securityCode` / `open` / `close` / `pctChange` / `volume`;index 另含 `securityName`(指数名称,v0.15.0 起) |
59
+ | quote day-kline(及已下线的 day-kline-hk / day-kline-us / index-day-kline) | `{fieldList, list}` 或规范化后 `{list: [{...}]}` | `tradeDate` / `securityCode` / `open` / `close` / `pctChange` / `volume` / `adjustFactor`(指数为 `null`);`index-day-kline` 另含 `securityName`(指数名称,v0.15.0 起) |
60
60
  | quote minute-kline | `{list: [{...}]}` | `tradeTime` / `open` / `close` / `volume` |
61
61
  | quote realtime | `{fieldList, list, total}` 或规范化后 `{list: [{...}]}` | `securityCode` / `exchange` / `tradeDate` / `tradeTime` / `open` / `high` / `low` / `latestPrice` / `preClose` / `change` / `pctChange` / `volume` / `amount` / `turnoverRate` / `amplitude` / `volumeRatio`(共 16 个,**无 `close`、无市值**) |
62
62
  | quote fund-flow | `{fieldList, list, total}` 列式 → 规范化后 `{list: [{...}], total}` 宽表 | `securityCode` / `tradeDate` + 请求的字段(`mainNetInflow` / `largeInflow` / `xlargeOutflow` / …) |
63
- | fundamental income-statement / balance-sheet / cash-flow(含 quarterly / -hk / -us) | `{total, list: [{...}]}` | `fiscalYear` / `period` / `endDate` / `companyName` / `companyType` / `currency` / `unit` + 各 `--field` 字段;港股/美股另含 `timeCovered`(不规则跨度)。⚠️ **A 股累计口径的 `balance-sheet` / `cash-flow` 两个命令**,`companyType` 与 `currency` 的值是互换的(实测 2026-07-24:`companyType=人民币`、`currency=银行`/`一般企业`;A 股 `income-statement` 正确,港股/美股三表均正确);A 股 `*-quarterly` 单季表则是 `companyType` 返回未映射的数字码(如 `102119999`)、`currency` 正确。读这两列按**值**判断语义,别按列名;科目数字不受影响 |
63
+ | fundamental income-statement / balance-sheet / cash-flow(含 quarterly / -hk / -us) | `{total, list: [{...}]}` | `fiscalYear` / `period` / `endDate` / `companyName` / `companyType` / `currency` / `unit` + 各 `--field` 字段;港股/美股另含 `timeCovered`(不规则跨度)。⚠️ A 股 `*-quarterly` 单季表的 `companyType` 返回未映射的数字码(如 `102119999`),`currency` 正常;累计口径的三张表两列均正确。科目数字不受影响 |
64
64
  | fundamental main-business | `{fieldList, list}` 列式 → 规范化后 `{list: [{...}]}` | 前 3 列恒定:`periodName` / `periodEndDate` / `categoryName`(分项名,随 `--breakdown` 变)+ `opRevenue` / `opRevenueYoy` / `opRevenueRatio` / `opCost` / `opCostYoy` / `opCostRatio` / `grossProfit` / `grossProfitYoy` / `grossProfitRatio` / `grossMargin` / `grossMarginYoy` / `grossMarginRatio`(共 15 个,实测 2026-07-24)。`--field` 只能从后 12 个里选 |
65
65
  | fundamental valuation-analysis(仅 A 股) | `{fieldList, list}` 列式 → 规范化后 `{list: [{...}]}` | `tradeDate` / `value` / `percentileRank` / `average` / `median` / `upper1Std` / `lower1Std`(共 7 个,实测 2026-07-24);**无 `securityCode`**——误传会拿到一列重复的 `tradeDate` |
66
66
  | fundamental earning-forecast(仅 A 股) | `{securityCode, securityName, updateList: [...]}` | `updateList[].date` / `updateList[].fieldList[].forecastYear` + 各 consensus 指标 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gangtise-openapi-cli",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "description": "CLI for Gangtise OpenAPI",
5
5
  "license": "MIT",
6
6
  "repository": {