gangtise-openapi-cli 0.43.0 → 0.44.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.
Files changed (42) hide show
  1. package/README.md +93 -19
  2. package/dist/src/cli.js +29 -18
  3. package/dist/src/commands/ai.js +20 -29
  4. package/dist/src/commands/auth.js +5 -4
  5. package/dist/src/commands/bond.js +5 -4
  6. package/dist/src/commands/fund.js +100 -0
  7. package/dist/src/commands/fundamental.js +2 -0
  8. package/dist/src/commands/groups.js +14 -0
  9. package/dist/src/commands/indicator.js +5 -5
  10. package/dist/src/commands/insight.js +3 -4
  11. package/dist/src/commands/raw.js +4 -3
  12. package/dist/src/commands/shared.js +35 -6
  13. package/dist/src/commands/tool.js +2 -2
  14. package/dist/src/commands/vault.js +30 -30
  15. package/dist/src/core/args.js +23 -7
  16. package/dist/src/core/asyncContent.js +1 -1
  17. package/dist/src/core/auth.js +2 -10
  18. package/dist/src/core/client.js +96 -35
  19. package/dist/src/core/commandBodies.js +1 -27
  20. package/dist/src/core/config.js +9 -5
  21. package/dist/src/core/download.js +47 -10
  22. package/dist/src/core/endpoints.js +198 -3
  23. package/dist/src/core/errors.js +1 -1
  24. package/dist/src/core/opinionDetail.js +16 -6
  25. package/dist/src/core/output.js +103 -72
  26. package/dist/src/core/printer.js +10 -5
  27. package/dist/src/core/quoteSharding.js +28 -4
  28. package/dist/src/core/rowSink.js +24 -10
  29. package/dist/src/core/titleCache.js +2 -10
  30. package/dist/src/core/transport.js +25 -7
  31. package/dist/src/core/updateCheck.js +3 -9
  32. package/gangtise-openapi/SKILL.md +53 -17
  33. package/gangtise-openapi/references/commands/fund.md +192 -0
  34. package/gangtise-openapi/references/commands/fundamental.md +2 -2
  35. package/gangtise-openapi/references/commands/indicator.md +7 -7
  36. package/gangtise-openapi/references/commands/insight.md +3 -3
  37. package/gangtise-openapi/references/commands/quote.md +1 -1
  38. package/gangtise-openapi/references/commands/tool.md +1 -1
  39. package/gangtise-openapi/references/commands/vault.md +1 -1
  40. package/gangtise-openapi/references/errors.md +5 -5
  41. package/gangtise-openapi/references/response-schema.md +10 -0
  42. package/package.json +1 -1
@@ -0,0 +1,192 @@
1
+ # Fund 命令详细参数
2
+
3
+ **全部按次计费,0.4 积分/次**(与返回行数、基金只数无关);空结果与报错不扣。
4
+
5
+ `--security` 收**基金交易代码**,后缀大写:场外 `005827.OF`;场内 `159967.SZ` / `510300.SH`。可重复,也接受逗号分隔;重复代码服务端自动去重。
6
+
7
+ - 🔴 **代码不存在、不带后缀(`005827`)、后缀小写(`.of`)、传成股票代码,都返回空结果、不报错**——拿到空先核对代码与后缀
8
+ - LOF / ETF 的场内代码(`161005.SZ`)与场外代码(`161005.OF`)都能查,返回的 `fundCode` 与 `fundName` 跟随传入的代码(场内简称 / 场外简称不同);同一只基金别两种代码混着传,会重复
9
+ - A / C 等份额各有代码,要合并到同一只基金用 `basic-info` 的 `mainFundCode`
10
+ - 多只基金的结果**按 `fundCode` 字段对应**,别按请求顺序对位
11
+
12
+ ⚠️ **超时 / 5xx 不自动重放**(避免重复扣费)。偶发 `999999` 系统错误,同参数重跑即可。
13
+
14
+ ---
15
+
16
+ ## 通用规则
17
+
18
+ **不分页**:一次返回全部行,**单次上限 10000 行**。超出时整批报 `100006`「查询/下载数量超出限制」、不返回部分结果——减少基金只数或缩短日期区间分批查。
19
+
20
+ **日期**:`--start-date` / `--end-date` 收年在前日期(`YYYY-MM-DD`,`YYYY/MM/DD` / `YYYYMMDD` 也收,CLI 统一成 `YYYY-MM-DD` 发出)。持仓 / 规模 / 持有人类命令筛的是**报告期**(季末日 `2026-06-30`),`nav` 与 `etf-share-change` 筛的是**交易日**。
21
+
22
+ | 命令 | 可回溯 |
23
+ |------|--------|
24
+ | `nav` / `asset-size` / `holder-structure` / `top10-holders` / `asset-allocation` / 持仓与分布六个 / `etf-share-change` | 正式账号前溯 **5 年**、试用账号 **3 年**;实际窗口随账号服务等级而定,以返回为准 |
25
+ | `basic-info` / `fee-rate` / `manager-info` / `manager-history` / `etf-pcf-header` / `etf-pcf-components` | 不限(返回当前资料或全部任职记录) |
26
+
27
+ - **两端都不传 = 取账号窗口内的全部**,不是只取最新一期。只要最新一期就把起止都设成那个报告期
28
+ - 只传 `--start-date` = 从该日到最新;只传 `--end-date` = 从账号窗口下界到该日
29
+ - 🔴 **`--start-date` 早于可回溯下界时整批返回 `110003`「超出时间范围限制」**,即使 `--end-date` 在窗口内也不会只返回窗口内那一段。把起点移进窗口再查
30
+ - 起 > 止报 `110002`;区间内没有报告期(如 `2026-05-01`~`2026-05-31`)返回空结果
31
+
32
+ **枚举参数**(`--position-type` / `--industry-standard` / `--fee-type` / `--asset-level`)写错时报 `100003` 并指明参数与取值,不会按默认值静默取数。
33
+
34
+ **单位各命令不同**,入库前逐列核对:`nav` 与 `asset-allocation` 的金额是**元**;`asset-size` 是**万份 / 万元**;`holder-structure` 与 `top10-holders` 的份额是**份**;`stock-portfolio` 是**万股 / 万元**;`bond-portfolio` 是**万张 / 万元**;`fund-portfolio` 是**万元**;`etf-share-change` 是**万份 / 万元**;`manager-info` 的在管规模是**亿元**。百分比字段都已是百分数(`5.72` = 5.72%)。
35
+
36
+ ---
37
+
38
+ ## `basic-info` 基金基本信息
39
+
40
+ ```bash
41
+ gangtise fund basic-info --security <code> [--security <code>...] [--field <name>...]
42
+ ```
43
+
44
+ 分类(一级 / 二级)、管理人与托管人、成立与存续、运行状态与运作方式、申赎规则、业绩比较基准、风险等级、投资范围、跟踪指数。当前资料,**不提供历史快照**。
45
+
46
+ - `--field` 可重复,不传返回全部;**`fundCode` 始终返回**。字段名写错**整批报 `100003`** 并指名,不会静默丢列
47
+ - `mainFundCode`:A / C 等份额共用的主代码,做份额合并时按它分组
48
+ - `investTypeCodeLevel1` / `investTypeCodeLevel2`:与 `reference constant-list --category fundType` 的常量 ID 一致(FOF 类一级分类的 ID 不是整百,如 `149051404` 混合型 FOF,按常量表的 `level` 判层级,别按 ID 尾数猜)
49
+ - `exchange`:场内基金为交易所名称(如 `上海证券交易所` / `深圳证券交易所`),场外基金为 `null`
50
+ - `isIndexFund` 是布尔值;非指数型基金的 `trackIndexCode` / `trackIndexName` 为 `null`
51
+ - `maturityDate` 为 `null` 表示无固定存续期;`largePurchaseLimit` 为 `null` 表示不限
52
+ - `investScope` 是长文本,批量导出时用 `--field` 去掉可显著缩小体积
53
+
54
+ ## `nav` 基金净值
55
+
56
+ ```bash
57
+ gangtise fund nav --security <code>... [--start-date <d>] [--end-date <d>]
58
+ ```
59
+
60
+ 逐交易日一行:`navUnit` 单位净值、`navAccumulated` 累计净值、`adjustFactor` 复权因子、`navAdjusted` 复权净值(元)。**算区间收益用 `navAdjusted`**,单位净值在分红 / 拆分时会跳变。货币基金另有 `mmfAnnualizedYield`(7 日年化,%)与 `mmfUnitYield`(每万份收益,元),其 `adjustFactor` 为 `null`;非货币基金这两列为 `null`。结果按日期倒序。
61
+
62
+ 多只基金 × 长区间容易撞 10000 行上限(每只每年约 240~250 行),按只数分批。
63
+
64
+ ## `fee-rate` 基金费率
65
+
66
+ ```bash
67
+ gangtise fund fee-rate --security <code>... [--fee-type <type>...]
68
+ ```
69
+
70
+ - `--fee-type`:`purchaseFee` 申购 / `redemptionFee` 赎回 / `managementFee` 管理 / `custodianFee` 托管 / `saleFee` 销售服务。可重复,不传返回全部
71
+ - 一只基金一个费率类型可能多行——申购费按金额分档、赎回费按持有期限分档,每档一行,`feeCondition` 是条件区间(如 `持有期限<7日`);无分档的为 `null`
72
+ - `feeRate` 是**字符串**(`"1.5%"` / `"0%"`),大额固定收费时是金额描述(`"每笔1000元"`),**不能直接当数字用**
73
+
74
+ ## `manager-info` 基金经理基本信息
75
+
76
+ ```bash
77
+ gangtise fund manager-info --manager <name> [--manager <name>...]
78
+ ```
79
+
80
+ 🔴 **查的是人名,不是基金代码**。按姓名**精确匹配**,查不到返回空结果;同名经理**全部返回**(常见名可能一次返回多位),用 `currentCompany` 区分(可能为 `null`)。返回学历、从业日期与年限、在管规模(亿元)与只数、历任基金数与公司数、简介。
81
+
82
+ - ⚠️ `workingYears`(从业年限)与由 `careerStartDate` 推算出的年限、简介里写的从业年数**可能对不上**,`currentCompanyYears` 同理。需要准确的从业年限时按 `careerStartDate` 自行计算
83
+ - `birthYear` 未披露时为 `null`
84
+
85
+ ## `manager-history` 基金历任基金经理
86
+
87
+ ```bash
88
+ gangtise fund manager-history --security <code>...
89
+ ```
90
+
91
+ 每位经理的每段任职各一行;同期共同管理的多位经理各占一行。`endDate` 为 `null` 的是**现任**。`managedDays` 任职天数,`managedReturn` 任职期间业绩表现(%)。
92
+
93
+ ## `asset-size` 资产规模
94
+
95
+ ```bash
96
+ gangtise fund asset-size --security <code>... [--start-date <d>] [--end-date <d>]
97
+ ```
98
+
99
+ 每个报告期一行:期初份额、期间申购 / 赎回 / 净申购份额(赎回大于申购时为负)、期末份额(**万份**),基金资产净值(**万元**)。
100
+
101
+ ## `holder-structure` 持有人结构
102
+
103
+ ```bash
104
+ gangtise fund holder-structure --security <code>... [--start-date <d>] [--end-date <d>]
105
+ ```
106
+
107
+ 持有人户数、户均份额,机构 / 个人 / 员工持有份额(份)与占比(%)。只有半年报与年报披露,季报期没有行。
108
+
109
+ - 🔴 **`holderCount` 是带千分位逗号的字符串**(如 `"2,219,140"`),不是数字。做数值计算或排序前先去掉逗号再转数字,否则按字符串比较会排错
110
+ - 占比字段可能为 `null`
111
+
112
+ ## `top10-holders` 前十大持有人
113
+
114
+ ```bash
115
+ gangtise fund top10-holders --security <code>... [--start-date <d>] [--end-date <d>]
116
+ ```
117
+
118
+ **仅上市基金**(LOF / ETF 等)。每个报告期按 `serialNumber` 排名各一行:持有人名称、持有份额(份)、占上市总份额比例(%)。半年报与年报披露。
119
+
120
+ - ETF 在前十名之外可能多一行 `serialNumber = 11`,是该 ETF 的**联接基金**(定期报告单列披露),它的占比可能高于前十中的多位。只要前十名就按 `serialNumber <= 10` 过滤
121
+ - 最新一期的更新可能晚于其他持仓类命令。按最新报告期查不到时,先不带日期查一次,看已有哪些报告期
122
+
123
+ ## `asset-allocation` 资产配置
124
+
125
+ ```bash
126
+ gangtise fund asset-allocation --security <code>... [--start-date <d>] [--end-date <d>] [--asset-level level1|level2]
127
+ ```
128
+
129
+ 「报告期末基金资产组合情况」口径,一只基金一个报告期按资产类型多行:`assetType`(代码)+ `assetTypeName`(中文)、`holdingValue`(**元**)、`pctToTotalAsset`(**占基金资产总值**,不是占净值)。
130
+
131
+ - `--asset-level`:`level1` 一级 / `level2` 二级,可重复,不传两级都返回。**一二级混在同一结果里时别直接加总**,二级是一级的拆分
132
+ - 一级 `assetType`:`equityInv` 权益 / `fundInv` 基金 / `fixedIncomeInv` 固定收益 / `preciousMetals` 贵金属 / `deriv` 金融衍生品 / `reverseRepo` 买入返售 / `moneyMarket` 货币市场工具 / `cash` 银行存款和结算备付金 / `otherAssets` 其他
133
+ - 二级 `assetType`:`stock` 股票 / `prefShares` 优先股 / `dr` 存托凭证 / `reits`(属权益);`bond` / `abs`(属固定收益);`forward` / `futures` / `option` / `warrant`(属衍生品);`outrightReverseRepo`(属买入返售)
134
+ - 基金没有持有的资产类型可能不出现在结果里(而不是给一行 0),按「缺行 = 0」处理
135
+
136
+ ## 持仓与分布(六个命令)
137
+
138
+ ```bash
139
+ gangtise fund stock-portfolio --security <code>... [--start-date <d>] [--end-date <d>] [--position-type top|all]
140
+ gangtise fund industry-allocation --security <code>... [--start-date <d>] [--end-date <d>] [--industry-standard swIndustry|citicIndustry] [--position-type top|all]
141
+ gangtise fund bond-portfolio --security <code>... [--start-date <d>] [--end-date <d>]
142
+ gangtise fund bond-type-allocation --security <code>... [--start-date <d>] [--end-date <d>]
143
+ gangtise fund fund-portfolio --security <code>... [--start-date <d>] [--end-date <d>]
144
+ gangtise fund fund-type-allocation --security <code>... [--start-date <d>] [--end-date <d>]
145
+ ```
146
+
147
+ **`--position-type`**(`stock-portfolio` / `industry-allocation`):`top` 重仓股票,各季度都披露(不传时的默认);`all` 全部持股,**仅半年报与年报披露**——用 `all` 查一季度 / 三季度得到空结果,不是故障。`all` 的行数通常远多于 `top`(重仓只有前十只)。
148
+
149
+ - **`stock-portfolio`**:持股数量(万股)、占流通股比例、持仓市值(万元)、占净值比,以及 `pctToNavChg`(较上一报告期的占净值比变化)。🔴 **只返回股票简称 `stockName`,不返回代码**——要代码用 `reference securities-search --keyword <简称>` 换,注意 A / H 同名与改名
150
+ - **`industry-allocation`**:`--industry-standard` 选 `swIndustry` 申万一级(不传时的默认)/ `citicIndustry` 中信一级。`industryCode` 与 `reference constant-list --category swIndustry` / `citicIndustry` 的常量 ID 一致。两套分类划分不同,跨基金比较时统一用一套。占比为 0 的行业也可能出现
151
+ - **`bond-portfolio`**:债券简称 `bondName`(**无代码**)、持仓量(万张)、持仓市值(万元)、占净值比
152
+ - **`bond-type-allocation`**:按券种汇总的占净值比。`bondTypeCode` 与 `reference constant-list --category fundBondType` 一致。**`金融债券` 与 `政策性金融债券` 是两行、前者包含后者**,按券种加总会重复计算
153
+ - **`fund-portfolio`**(FOF):持仓基金简称 `holdingFundName`(**无代码**)、持仓市值(万元)、占净值比
154
+ - **`fund-type-allocation`**(FOF):持仓基金按基金分类(一级)汇总的占净值比,`investTypeCodeLevel1` 与 `fundType` 常量一致。**没有 `--position-type` 参数**,口径随报告期而定、看返回的 `positionType` 列:季报期为 `top`(只含重仓基金),半年报 / 年报为 `all`(全部持基)——同一只基金不同报告期的合计口径不同,做时序对比前先按 `positionType` 分开
155
+
156
+ ## ETF 申赎与份额(三个命令)
157
+
158
+ ```bash
159
+ gangtise fund etf-pcf-header --security <code>...
160
+ gangtise fund etf-pcf-components --security <code>...
161
+ gangtise fund etf-share-change --security <code>... [--start-date <d>] [--end-date <d>]
162
+ ```
163
+
164
+ - **`etf-pcf-header` / `etf-pcf-components` 只返回最新一份申购赎回清单**,无日期参数,查不了历史清单。`tradeDate` 是清单对应的交易日(清单盘前发布,可能就是当天)
165
+ - **`etf-pcf-header`**:申赎允许情况(`允许申购·允许赎回` 这种 `·` 分隔的组合)、最小申赎单位(份)及其净值(元)、单日申购 / 赎回上限(份,无上限为 `null`)、现金差额与预估现金(元,可为负)、现金替代比例上限(%)、`componentCount` 成分记录数
166
+ - **`etf-pcf-components`**:每个成分一行,按 `serialNumber` 排序:成分代码 `componentCode` 与名称、收盘价、涨跌幅、市值占比(%)、申购数量(股)、`cashSubstituteFlag`(`允许` / `必须`,中文)、申购 / 赎回现金替代溢价比例(%)、固定替代金额与申购 / 赎回替代金额(元)。宽基 ETF 动辄数百行,多只一起查注意 10000 行上限。`componentCode` **不带市场后缀**(如 `600519`),要接着查行情先补上后缀
167
+ - **`etf-share-change`**:逐交易日一行,份额(万份)、规模(万元)及较上期变动,`sharesChangeRate` 为份额变化率(%)。按日期倒序
168
+
169
+ ---
170
+
171
+ ## 常见任务
172
+
173
+ ```bash
174
+ # 基金画像:基本信息 + 现任经理 + 费率
175
+ gangtise fund basic-info --security 005827.OF --field fundName --field investTypeNameLevel2 --field mgrComp --field setupDate --field riskLevel
176
+ gangtise fund manager-history --security 005827.OF
177
+ gangtise fund fee-rate --security 005827.OF --fee-type managementFee --fee-type custodianFee
178
+
179
+ # 最新一期重仓股(季报)/ 全部持股(中报、年报)
180
+ gangtise fund stock-portfolio --security 005827.OF --start-date 2026-06-30 --end-date 2026-06-30
181
+ gangtise fund stock-portfolio --security 005827.OF --start-date 2026-06-30 --end-date 2026-06-30 --position-type all --format csv --output ./005827-2026H1.csv
182
+
183
+ # 近一年复权净值,算区间收益
184
+ gangtise fund nav --security 005827.OF --security 159967.SZ --start-date 2025-09-30 --end-date 2026-09-29 --format jsonl --output ./nav.jsonl
185
+
186
+ # ETF 申赎清单与份额变动
187
+ gangtise fund etf-pcf-components --security 510300.SH --format csv --output ./510300-pcf.csv
188
+ gangtise fund etf-share-change --security 510300.SH --start-date 2026-09-01 --end-date 2026-09-30
189
+
190
+ # 基金经理(按姓名)
191
+ gangtise fund manager-info --manager 张坤
192
+ ```
@@ -100,7 +100,7 @@ gangtise fundamental valuation-analysis --security-code <code> --indicator <name
100
100
  ## A股盈利预测 `fundamental earning-forecast`
101
101
 
102
102
  ```bash
103
- gangtise fundamental earning-forecast --security-code <code> [--start-date <date>] [--end-date <date>] [--consensus <name>]
103
+ gangtise fundamental earning-forecast --security-code <code> [--start-date <date>] [--end-date <date>] [--consensus <name>] [--yes]
104
104
  ```
105
105
 
106
106
  - **市场与路由**:本命令仅支持 A 股(港股 / 美股会报 `120001`「非有效A股」)。A股盈利预测 / 一致预期始终走本命令,不走 EDE;EDE 搜索目前没有一致预期语义,搜到的基本 / 稀释 EPS 是已实现值,不能冒充预测 EPS。港 / 美股盈利预测当前 CLI 不支持
@@ -108,7 +108,7 @@ gangtise fundamental earning-forecast --security-code <code> [--start-date <date
108
108
  - `--consensus` 可重复:`netIncome` 归母净利润 | `netIncomeYoy` 同比增速 | `eps` 每股收益 | `pe` 市盈率 | `bps` 每股净资产 | `pb` 市净率 | `peg` PEG | `roe` 净资产收益率 | `ps` 市销率
109
109
  - **`roe` 的单位是百分比(%)**:`35.6` 即 35.6%,**不要再做 ÷100 之类的单位换算**——换算后的数字看着仍像个 ROE,不会报错
110
110
  - 返回结构:`{securityCode, securityName, updateList: [{date, fieldList: [{forecastYear, ...consensus}]}]}` — 每个日期固定返回 3 年预测(如 `2026E` / `2027E` / `2028E`)
111
- - **积分**:`0.5`/条(盈利预测是 `fundamental` 里唯一收费项,其余报表/主营/估值/股东均免费)。行数随日期区间增长(每个交易日一组、每组 3 年预测),长区间一次可达数千积分,所以超时 / 5xx **不自动重试**;长区间按年分段拉
111
+ - **积分**:`0.5`/条(盈利预测是 `fundamental` 里唯一收费项,其余报表/主营/估值/股东均免费)。行数随日期区间增长(每个交易日一组、每组 3 年预测),长区间一次可达数千积分,所以超时 / 5xx **不自动重试**;长区间按年分段拉。**CLI 先按区间估算(工作日数 × 3 条 × 0.5),超过 1000 积分(约两年半)报错退出并给出估算值**,确认后加 `--yes` 或缩短区间
112
112
 
113
113
  ## 前十大股东 `fundamental top-holders`
114
114
 
@@ -275,22 +275,22 @@ gangtise indicator cross-section --indicator qte_close --security 600519.SH \
275
275
 
276
276
  | 错误码 | 实际含义 | 怎么办 |
277
277
  | :--- | :--- | :--- |
278
- | `100001` | **缺少必填参数**:如 `universe` 没传,或指标 `parameterList` 里 `required` 的参数没给(msg 会点名是哪个指标的哪个参数) | 补齐 `--indicator` / `--security`,或用 `--indicator-param` 补上点名的参数 |
278
+ | `100001` | **缺少必填参数**:如 `universe` 没传,或指标 `parameterList` 里 `required` 的参数没给(msg 会点名是哪个指标的哪个参数)。⚠️ 漏传 `fiscalYear` **不报这个码**,见下「必填参数」 | 补齐 `--indicator` / `--security`,或用 `--indicator-param` 补上点名的参数 |
279
279
  | `100003`@400 | 入参/表达式错误:`time-series` 传了「多指标 × 多证券」、`expression` 引用未声明变量、`indicatorParamList` 的 code 不在 `indicatorCodeList` 里 | 按 msg 改;多 × 多改用 `cross-section`。CLI 已在本地拦截「表达式引用未绑定变量」,不会白发一次请求 |
280
280
  | `140002`@500 | **终态参数错**:枚举越界(如「参数 adjustType 的值 99 不在有效范围内 [1,2,3,4]」)、表达式语法错误 | **不重试**(CLI 已把 140002 列为终态码)。读 `search --format json` 的 `parameterList` 改参数名/取值 |
281
- | `999999` | 系统故障。「无数据」不用此码,所以它基本只剩真故障。⚠️ 无数据是占位单元格(统一 `null`);代码或参数名写错报 `100003`、缺必填参数报 `100001`,都会点名 | CLI 对 indicator 端点**不重试此码**;确认参数无误仍报错,稍后再试或联系平台支持 |
281
+ | `999999` | 系统故障。「无数据」不用此码,所以它基本只剩真故障。⚠️ 无数据是占位单元格(统一 `null`);代码或参数名写错报 `100003`、缺必填参数报 `100001`,都会点名(漏传 `fiscalYear` 例外,不报错) | CLI 对 indicator 端点**不重试此码**;确认参数无误仍报错,稍后再试或联系平台支持 |
282
282
  | `110003` | **超出账号数据权限的时间范围**。窗口按**账号**配、不按接口配——`cross-section` / `time-series` / `screener` 同界,区间**跨过**下界也整批报这个码;`quote day-kline` 在同一条界上,但跨界时从下界起返回、不报错 | 把起点移进范围;整段区间都早于下界时缩短窗口无用,**换接口绕不过去**,要更长历史联系客户经理开通 |
283
283
  | `130001` | 数据未找到,或**该指标无权限**(内层信封失败会带具体 msg,如"指标无权限";此码被服务端复用) | 检查查询条件与指标权限;换证券/日期仍失败多为无权限,联系管理员开通 |
284
284
 
285
285
  ### 指标专属参数
286
286
 
287
- 缺必填参数报 `100001` 并点名是哪个指标的哪个参数。**先完成语义 + `scopeList` + `parameterList` 三项校验;其中凡 `required:true` 的参数都用 `--indicator-param "指标code:参数=值"` 补上。** 常见的几个:
287
+ 缺必填参数报 `100001` 并点名是哪个指标的哪个参数。🔴 **`fiscalYear` 例外:漏传不报错**——预测类(如 `frcst_pe`)与分红类(`div_cash_yr` / `div_cash_paid_ratio`)都会按一个服务端自定的默认年度取数(不随 `--date` 变):该年度有数就返回它,看着完全正常,但未必是你要的那一年;没有就是 `null`,与「没有数据」无法区分。所以 `parameterList` 里标 `required` 的 `fiscalYear` 一律显式传。**先完成语义 + `scopeList` + `parameterList` 三项校验;其中凡 `required:true` 的参数都用 `--indicator-param "指标code:参数=值"` 补上。** 常见的几个:
288
288
 
289
289
  | 参数 | 适用指标 | 示例 |
290
290
  | :--- | :--- | :--- |
291
- | `periodNum` | N 期统计(N 期均值/最值,如 `finc_roe_avg_avg` 平均ROE N期均值) | `--indicator-param "finc_roe_avg_avg:periodNum=4"`;部分还需配**年报日期**才出数(如 `finc_roe_avg_avg` 用季末日期为空、用年报日期有数) |
291
+ | `periodNum` | N 期统计(N 期均值/最值,如 `finc_roe_avg_avg` 平均ROE N期均值) | `--indicator-param "finc_roe_avg_avg:periodNum=4"`;`finc_roe_avg_avg` 属报告期类,还要补 `--indicator-param "finc_roe_avg_avg:reportDate=2025-12-31"`(只给 `--date` 报 `100003`) |
292
292
  | `sDate` | 区间类的**起始日**(如 `qte_vol_intvl` 区间成交量、`qte_avg_vol` 区间日均成交量),格式 `yyyy-MM-dd` | `--indicator-param "qte_vol_intvl:sDate=2024-01-02"`。⚠️ **`sDate` 不能替代 `tradeDate`**——它是区间起点,`tradeDate`(=区间终点)仍是 required,`--date` 会照常下发。区间起始日的参数名就是 `sDate`,写成 `startDate` 会报 `100003 不支持参数 startDate`。⚠️ **不传 `sDate` 不报错**——它是可选参数,缺了就按默认区间算,所以要的是特定区间就必须显式传。另:`qte_amp_mo`(月振幅)等周期变体只吃 `tradeDate`,没有起始日参数 |
293
- | `fiscalYear` | 年度/报告期类(如 `div_cash_yr` 年度现金分红) | `--indicator-param "div_cash_yr:fiscalYear=2025"` |
293
+ | `fiscalYear` | 年度/报告期类(如 `div_cash_yr` 年度现金分红)、预测类(如 `frcst_pe`,与 `tradeDate` 同时必填)。**漏传不报错**,见上 | `--indicator-param "div_cash_yr:fiscalYear=2025"` |
294
294
  | `industryType` + `industryLevel` | `scr_indu` 所属行业(两个都 required,缺任一报 `100001`) | `--indicator-param "scr_indu:industryType=1" --indicator-param "scr_indu:industryLevel=0"` |
295
295
 
296
296
  > `paramValue` 一律按**字符串**约定传(`periodNum=4` 内部即 `"4"`,CLI 已处理)。
@@ -384,7 +384,7 @@ gangtise indicator cross-section --indicator scr_indu_citic --indicator scr_indu
384
384
  - **混合日期语义要拆查询**:同时要“某报告期营收 / EPS”和“估值 PE / PB”时,按各自有效日期分别调用 `cross-section` 再按 `security` 合并(财务=报告期末、PE/PB=最新交易日);不要把不同日期语义的指标塞进同一个 `--date`
385
385
  - **探索性取数**:缺值会保留行列并给占位单元格(含 1×1 的最简形态),占位值统一为 `null`;code 写错会直接报 `100003`,不会伪装成缺值。看趋势用 `time-series` + 覆盖报告期的区间,但不能把缺值当成通过语义 / scope 校验。
386
386
  - **名称反查 code 要核对,别取首条**:存在同显示名的兄弟指标——单季 `cf_finc_exp_qtr` 与累计 `cf_finc_exp` 都叫「财务费用」,`bs_fmt`/`cf_fmt`/`is_fmt` 都叫「报表格式」。`search` 按名称模糊匹配,目标 code 高概率在 top1 但不绝对,要看 `indicatorCode` 确认。
387
- - **批量查询出错先读 msg**:缺必填参数报 `100001`、代码或参数名写错报 `100003`,msg 都会点名是哪个指标或证券,照 msg 改即可。
387
+ - **批量查询出错先读 msg**:缺必填参数报 `100001`、代码或参数名写错报 `100003`,msg 都会点名是哪个指标或证券,照 msg 改即可。漏传 `fiscalYear` 不报错,见「必填参数」。
388
388
  - **市值量纲**:`qte_mkt_cptl`(总市值)与 `shr_tot`(总股本)**A/港/美股均有数**;**默认返原始「元」**(大市值公司是 `1e12` 量级,即万亿级),别误当天文数字。用 `scale` 数字码缩放(`0`元 / `3`千 / `4`万 / `6`百万 / `8`亿 / `9`十亿——`scale=8` 即以亿元为单位)、`currency` 换币种(**大写** `DFT`本币 / `CNY` / `HKD` / `USD` …)。**跨证券比市值前先统一 `scale`+`currency`**。
389
389
  - **币种与汇率**:`DFT`(原始币种)按市场识别——A股=CNY、港股行情=HKD、美股=USD;汇率换算自洽(互逆且三角一致)。⚠️ 但**同一只港股,行情类的原始币种是 HKD、财务类可能是 CNY**(如泡泡玛特财报以人民币计),跨市场比财务数据时显式传 `--currency CNY` 别依赖 `DFT`。另:财务类指标的汇率按**报告期**折算、行情类按查询日折算,两者隐含汇率会有细微差异,属正常口径差别。
390
390
  - **EDE 财务指标的 `reportType`**:`enumList` 的 label 与实际取数**一致**,按 label 传即可(取值以 `enumList` 为准):
@@ -419,6 +419,6 @@ gangtise indicator cross-section --indicator scr_indu_citic --indicator scr_indu
419
419
 
420
420
  - **发现流程**:`indicator search --format json` → 核对 `indicatorName` + `description`、`scopeList`(含 `usageRestriction`)、`parameterList`(**参数名以此为准**)→ 三项都通过才用 `cross-section` / `time-series` / `screener`
421
421
  - **积分**:`search` 免费;`cross-section` / `time-series` / `screener` 按请求单元格数量计费,标价为每 100 单元格 A 股 0.05 / 港股 0.1 / 美股 0.2 积分,每次查询不足 100 单元格按 100 计
422
- - **空结果排查顺序**:代码、参数名写错与缺必填参数都会直接报错并点名(`100003` / `100001`),不会以空结果出现。拿到整批 `null` 或 `screener` 空集时按序排查:① 日期语义对不对(`tradeDate` vs `reportDate`——报告期类指标日期用错会整批返 `null`,看着像「没数据」)② 该指标覆不覆盖这批证券(`scopeList`,单查一行确认)③ 真的没有数据
422
+ - **空结果排查顺序**:代码、参数名写错与缺必填参数会直接报错并点名(`100003` / `100001`),不会以空结果出现——已知例外是漏传 `fiscalYear`(按默认年度取数,该年度无数据时返回 `null`)。拿到整批 `null` 或 `screener` 空集时按序排查:① 日期语义对不对(`tradeDate` vs `reportDate`——报告期类指标日期用错会整批返 `null`,看着像「没数据」;`parameterList` 要 `fiscalYear` 的传了没有)② 该指标覆不覆盖这批证券(`scopeList`,单查一行确认)③ 真的没有数据
423
423
  - **数据权限**:正式账号行情 / 财务 / 指标类可回溯的年限按服务等级而定,试用账号更短。这个时间窗口按**账号**配、不按接口配——三个 EDE 接口同界,区间跨过下界也整批返 `110003`(`quote day-kline` 在同一条界上,但跨界时从下界起返回、不报错),**换接口绕不过去**;整段区间都早于下界时缩短窗口无用,要更长历史联系客户经理开通
424
424
  - 所有格式(table/json/jsonl/csv/markdown)均可用;导出宽表给 Excel 直接用 `--format csv --output xxx.csv`
@@ -2,9 +2,9 @@
2
2
 
3
3
  `insight ... list` 大多共享:`--keyword <text>` `--start-time <datetime>` `--end-time <datetime>` `--from <n>` `--size <n>`。**例外**:`highlight list` 与 `qa list` 没有 `--keyword`;`report-image list` 用 `--top` 而不是 `--from` / `--size`;`performance-calendar list` 用 `--start-date` / `--end-date` 且没有 `--keyword`
4
4
 
5
- 按条计费的列表省略 `--size` 时,CLI 先估算全量积分,超过 1000 积分报错退出 1(报错写明估算值);确认后加 `--yes` 拉全量,或改传 `--size N`。
5
+ 按条计费的列表省略 `--size` 时,CLI 先估算全量积分,超过 1000 积分报错退出 1(报错写明估算值);确认后加 `--yes` 拉全量,或改传 `--size N`。显式 `--size` 按 `min(--size, total) × 单价` 估算仍超过 1000 积分时同样拦截。
6
6
 
7
- 时间格式:`"YYYY-MM-DD HH:mm:ss"`(datetime,需引号)。**`--end-time` 写到当天末尾 `23:59:59`**——只写日期时,A 股公告按当日 00:00:00 处理,截止日当天的数据取不到。
7
+ 时间格式:`"YYYY-MM-DD HH:mm:ss"`(datetime,需引号)。**`--end-time` 写到当天末尾 `23:59:59` 最稳**——A 股公告只写日期时 CLI 按当日 23:59:59 换算,其余列表把时间串原样交给接口。
8
8
 
9
9
  支持 `--rank-type` 的命令:opinion / summary / **pamirs-summary** / research / foreign-report / announcement / announcement-hk / announcement-us / foreign-opinion / independent-opinion / official-account。
10
10
 
@@ -47,7 +47,7 @@ gangtise insight opinion detail --chief-opinion-id <id> [--chief-opinion-id <id>
47
47
  - 🔴 **列表只含摘要**:`brief` 是正文前 200 字的截断,**1 积分/条**。要正文用 `detail` 按 `chiefOpinionId` 取(`content`,**30 积分/条**,按返回条数计);或 `list --with-content` 让列表直接带正文(30 积分/条)。只需判断相关性、做筛选时看 `brief` 就够,别默认加 `--with-content`
48
48
  - `detail` 与 `--with-content` 都按返回条数计费,**超时 / 5xx 不自动重发**(重发可能对已交付的正文再计一次费),偶发失败自行重跑
49
49
  - ⚠️ **`--with-content` 返回的是旧版结构**:标题与正文在 `contentList.title` / `contentList.content`(`contentList` 是对象,不是数组),顶层没有 `title` / `brief`。按 `content` 字段名取会取不到;要统一成 `detail` 的结构就走 `list` + `detail`
50
- - `detail`:ID 可重复传或逗号分隔,CLI 去重后按 **20 个一批**自动拆分请求。**没有有效正文的 ID 不报错、直接跳过**(ID 写错时即如此;刚发布的观点也可能暂时取不到,稍后重取)。CLI 比对请求与返回,缺的 ID 列在 `missingIds`;某一批请求失败时,已取到的正文照常输出,没取的 ID 列在 `unfetchedIds`、原因在 `unfetchedError`,只需对这些 ID 重跑。两种情况都标 `partial`、**退出 3**
50
+ - `detail`:ID 可重复传或逗号分隔,CLI 去重后按 **20 个一批**自动拆分请求。**没有有效正文的 ID 不报错、直接跳过**(ID 写错时即如此;刚发布的观点也可能暂时取不到,稍后重取)。CLI 比对请求与返回,缺的 ID 列在 `missingIds`;某一批请求失败或返回异常时,已取到的正文(包括这一批里已返回的)照常输出,没取到的 ID 列在 `unfetchedIds`、原因在 `unfetchedError`,只需对这些 ID 重跑。两种情况都标 `partial`、**退出 3**
51
51
  - 返回字段(list):`chiefOpinionId` / `publishTime` / `title` / `brief` / `author{chiefId, chiefName, researchAreaList, brokerID, brokerName}` / `securityList[]` / `industryList[]` / `conceptList[]` / `llmTagList`;`detail` 另加 `content`。`author.chiefId` / `chiefName` 在机构点评类观点上为 `null`
52
52
 
53
53
  - `--llm-tag`:`strongRcmd` 强烈推荐 | `earningsReview` 业绩点评 | `topBroker` 头部券商 | `newFortune` 新财富团队
@@ -18,7 +18,7 @@
18
18
  | `fund-flow` | `aShares` | 1 个工作日/片 |
19
19
  | `day-kline-hk` / `day-kline-us`(旧) | `all` | 2 / 1 个工作日/片 |
20
20
 
21
- 分片路径在没传 `--limit` 时自动把它抬到 10000(API 上限),避免默认 6000 行截断;传了 `--limit` 就按每片生效,低于单日行数时每片都会截断(标 `partial`)。分片只数工作日:周六日不单独发请求,跨周末的一片(如周五 + 周一)照常覆盖两边的交易日。
21
+ 分片路径在没传 `--limit` 时自动把它抬到 10000(API 上限),避免默认 6000 行截断;传了 `--limit` 就按每片生效,低于单日行数时每片都会截断(标 `partial`)。分片只数工作日:周六日不单独发请求,跨周末的一片(如周五 + 周一)照常覆盖两边的交易日。区间起点早于账号可回溯窗口时,窗口外的分片(接口报 `110003`)跳过、不影响其余分片,结果从窗口内开始,跳过的区间列在 `outOfWindowShards`(不算不完整、退出码 0;整段都在窗口外时仍报 `110003`)。
22
22
 
23
23
  **日K线历史性**:所有日K线接口仅返回**历史数据**,不提供实时行情。盘中实时数据请改用 `quote realtime`。当日数据入库时间:A 股约 15:30、港股约 16:30、美股约 07:00(北京时间)。
24
24
 
@@ -45,7 +45,7 @@ gangtise tool web-search --query "<标题>" --site csrc.gov.cn --include-content
45
45
  ```
46
46
 
47
47
  - `--query`(**必填**):1–200 字符。**服务端不做意图推断或改写**,检索词原样发送;要限定站点必须显式用 `--site`
48
- - `--size`:1–20,默认 10;**带 `--include-content` 时上限降为 5**(CLI 本地拦截并说明是哪个 flag 压低了上限)。指去重与过滤**之后**的条数,不足不补
48
+ - `--size`:1–20,默认 10;**带 `--include-content` 时上限降为 5、默认也随之取 5**(显式传超过 5 的值 CLI 本地拦截并说明是哪个 flag 压低了上限)。指去重与过滤**之后**的条数,不足不补
49
49
  - `--freshness`:`day` / `week` / `month` / `none`(默认)。按 `publishTime` 过滤,⚠️ **判不出发布日期(`publishTime` 为 `null`)的结果在 `day`/`week`/`month` 下不返回**——收窄时效会连带丢掉这批
50
50
  - `--min-tier`:`T0` / `T1` / `T2` / `T3`(默认 T3 = 不过滤)。低于该等级不返回
51
51
  - `--site`:注册域或子域(`csrc.gov.cn`、`finance.sina.com.cn`),可重复,**最多 10 个**(按去重后计),相互之间是**或**关系,子域按后缀匹配
@@ -93,7 +93,7 @@ gangtise vault wechat-message-list [--keyword <text>] [--security <code>] [--wec
93
93
  gangtise vault wechat-chatroom-list [--room-name <name>] [--from <n>] [--size <n>]
94
94
  ```
95
95
 
96
- - `--room-name`:可重复或英文逗号分隔
96
+ - `--room-name`:可重复或逗号分隔(名称里的空格、顿号原样保留)
97
97
  - 省略 `--size` 拉全量(接口返回 `total`,CLI 按 total 并发翻页);传 `--size N` 只取前 N 条。单页最大 50
98
98
  - 返回字段:`total`(总条数)/ `chatroomName` / `chatroomId`
99
99
 
@@ -13,7 +13,7 @@
13
13
  | 错误码 | 含义 | CLI 行为 | Agent 是否介入 |
14
14
  |--------|------|---------|--------------|
15
15
  | `100003` | 参数值非法——**最宽的兜底码**:类型错、`limit` 越界都归这里。**msg 通常已指明字段**(如「请求体字段类型不匹配: size 期望类型 Integer」「limit 最小为 1,最大为 10000」),先读 msg 再猜 | — | 按 msg 指的字段改;msg 没指明才对照 `--help` 查枚举拼写,**不要重试同命令** |
16
- | `999999` | 系统错误。`indicator`(EDE)的「无数据」不用此码(无数据是保留行列的占位单元格 `null`,见 `commands/indicator.md`;代码或参数名写错报 `100003`、缺必填参数报 `100001`,都会点名),所以这个码基本只剩真故障 | 普通端点自动重试 ×2;🔴 贵档与 `indicator` 端点不重试 | 确认参数无误仍报此码即服务端故障 |
16
+ | `999999` | 系统错误。`indicator`(EDE)的「无数据」不用此码(无数据是保留行列的占位单元格 `null`,见 `commands/indicator.md`;代码或参数名写错报 `100003`、缺必填参数报 `100001`,都会点名;例外是漏传 `fiscalYear` 不报错,见 `commands/indicator.md`「必填参数」),所以这个码基本只剩真故障 | 普通端点自动重试 ×2;🔴 贵档与 `indicator` 端点不重试 | 确认参数无误仍报此码即服务端故障 |
17
17
  | `410110` | **异步生成中**(HTTP 400,旧码)。新码 `140001`,CLI 两码都认 | 轮询视为 pending | 继续等 |
18
18
  | `410111` | **异步生成失败**(HTTP 400,旧码)。新码 `140002`,CLI 两码都认 | 终态 | **不重试**,换参数 |
19
19
  | `130002` | 资源不存在——下载类的常见码:`reportId` 不存在 / 非数字多归此码。另有更具体的 `130003`(资源未生成 / 无附件);`--file-type` 写错由 CLI 在本地报错、不发请求 | — | 确认 ID 有效且本账号可见;换 `--file-type` 或换一篇验证 |
@@ -21,14 +21,14 @@
21
21
  | `100001` | 缺必填参数——**msg 带字段名**(「缺少必填参数: reportId」) | — | 按 msg 指的字段补上 |
22
22
  | `110001` / `110002` | 日期格式错(msg 带字段名)/ 起晚于止。⚠️ **服务端对多种格式做宽松解析**(`2026/07/01`、`20260701`、`07/01/2026` 都能被接受),所以「没报 110001」不等于「格式被按你的意思理解了」 | — | 按参数名:`--*-date` 用 `YYYY-MM-DD`、`--*-time` 用 `YYYY-MM-DD HH:mm:ss`;`ai knowledge-batch` 的 --start-time/--end-time 收时间戳或 datetime,CLI 统一转 13 位毫秒 |
23
23
  | `120001` | 证券代码无效——msg 带原因(「非有效A股」)。Fundamental 系与 `quote day-kline`/`realtime`/`minute-kline`/`fund-flow` 都会报;**旧版 `day-kline-hk`/`day-kline-us`/`index-day-kline` 静默返回空** | — | `reference securities-search` 确认代码与后缀(`600519.SH` / `00700.HK`) |
24
- | `110003` | **超出账号数据权限的时间范围**。范围按账号等级而定、**不是平台常量**;窗口按**账号**配、不按接口配 | — | 把日期移进权限范围内;整个区间都早于下界时缩短窗口无用(`--fiscal-year 2015` 无论怎么缩都报错);**换接口绕不过去**,要更长历史联系客户经理开通。⚠️ 区间**跨过**下界时,`indicator` 与 `bond` 报这个码,`quote` 日 K 与 `valuation-analysis` 则从下界起返回、不报错——核对首行日期 |
25
- | `100006` | 查询/下载数量超限;**`indicator cross-section` / `time-series` 单次单元格数超 30000** 也是此码(msg 写明限额) | — | 缩短日期范围或调小 `--size`/`--limit`;全市场场景应已自动分片;EDE 按「截面=证券数×指标数、时序=证券数或指标数×日期数」拆批 |
24
+ | `110003` | **超出账号数据权限的时间范围**。范围按账号等级而定、**不是平台常量**;窗口按**账号**配、不按接口配 | — | 把日期移进权限范围内;整个区间都早于下界时缩短窗口无用(`--fiscal-year 2015` 无论怎么缩都报错);**换接口绕不过去**,要更长历史联系客户经理开通。⚠️ 区间**跨过**下界时,`indicator`、`bond` 与 `fund` 报这个码,`quote` 日 K 与 `valuation-analysis` 则从下界起返回、不报错——核对首行日期 |
25
+ | `100006` | 查询/下载数量超限;**`indicator cross-section` / `time-series` 单次单元格数超 30000**、**`fund` 命令单次超过 10000 行**也是此码(msg 写明限额) | — | 缩短日期范围或调小 `--size`/`--limit`;全市场场景应已自动分片;EDE 按「截面=证券数×指标数、时序=证券数或指标数×日期数」拆批;`fund` 不分页、没有 `--size`,减少 `--security` 只数或缩短日期区间分批查 |
26
26
  | `240001` | 财报期未披露或超出查询期(`earnings-review` 提交阶段就报,**不扣积分**) | — | 换更早的 `--period`(`2025q3` → `2025interim`) |
27
27
  | `250001` | 不支持的数据源 | — | 检查 `resourceType + sourceId` 组合 |
28
28
  | `999011` | 开发账号凭证无效(不区分 AK 错还是 SK 错) | 登录即失败,**不重试** | 检查 `GANGTISE_ACCESS_KEY`/`GANGTISE_SECRET_KEY` 是否写反或未 export |
29
29
  | `999010` | 接口地址不存在 | — | `raw call` 的 key 可能已下线,用 `gangtise raw list` 核对 |
30
30
  | `999004` | 无资源权限。**整库未开通与单条记录不可见都走这个码**——`insight pamirs-summary list`(专家纪要库需单独购买)未开通时即报此码 | — | `list` 撞上多为整库未开通,先确认该数据库是否已购买;`download` 撞上再考虑换一条本账号可见的记录 |
31
- | `0000001008` | Token 服务端失效(他处登录挤掉)——**旧码,token 自愈依赖它** | **强制重新登录并重试一次** | 无 AK/SK 时无法自愈,提示重新登录 |
31
+ | `0000001008` | Token 服务端失效(他处登录挤掉)——**旧码,token 自愈依赖它** | **换用已刷新的 token,不行再重新登录,然后重发** | 无 AK/SK 时无法自愈,提示重新登录 |
32
32
  | `0000001007` | 请求未携带 Bearer token | — | 检查 `GANGTISE_TOKEN` / AK/SK 是否已 export |
33
33
  | `900002` | **请求方法不正确**(msg「请求类型有误」,HTTP 405) | — | 请求方法由 CLI 按端点固定、用户改不了;出现说明接口的方法变了,带 trace 反馈 |
34
34
  | `140002` | 终态失败:AI 异步生成失败;`indicator` 的枚举越界 / 表达式语法错;或其他接口的「业务处理失败」(与入参无关) | **不立即重试**(终态码) | msg 指向参数就按 msg 改参数重提(EDE 的参数名与枚举读 `indicator search --format json` 的 `parameterList`);「业务处理失败」则稍后再试,持续出现带 trace 报障 |
@@ -81,7 +81,7 @@
81
81
 
82
82
  ## 退出码 4:数据写全了,但文件被另一次导出替换
83
83
 
84
- 本次导出的数据完整写出了,`--output` 指向的文件却在收尾期间被**另一次写向同一路径的导出**替换掉——文件在,只是不是这条命令的产物。stderr 会给出两边的 `sha256` 前缀。给并发的导出各自的 `--output` 即可。本次生成的 `.meta.json` 记录的是替换检查之前的判定;并发导出时,数据文件和元信息都可能被另一次导出覆盖。所以退出码 4 以本次进程的退出码和 stderr 为准,`sha256` 只能说明当前的数据文件与旁边的元信息是否匹配。
84
+ 本次导出的数据完整写出了,`--output` 指向的文件却在收尾期间被**另一次写向同一路径的导出**替换掉——文件在,只是不是这条命令的产物。stderr 会给出本次写出的 `sha256` 前缀。给并发的导出各自的 `--output` 即可。本次生成的 `.meta.json` 记录的是替换检查之前的判定;并发导出时,数据文件和元信息都可能被另一次导出覆盖。所以退出码 4 以本次进程的退出码和 stderr 为准,`sha256` 只能说明当前的数据文件与旁边的元信息是否匹配。
85
85
 
86
86
  与 `3` 分开是因为行没有缺、缺的是目的地。**两者同时发生时退出码是 `3`**——少了行是更重的那一个,替换另在 stderr 说明。
87
87
 
@@ -105,6 +105,16 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
105
105
  | alternative concept-securities | `{conceptId, conceptName, securityCount, securityDetail}`(单对象,分组) | `securityCount` / `securityDetail[].groupName` / `securityDetail[].securityList[].securityCode` / `.securityName` / `.isKey` / `.inclusionReason`(**这两列仅 `--full`**);无成分股时 `securityDetail` 为 `null` |
106
106
  | bond basic-info / issuer-info / daily-quote / valuation / cash-flow / issuance-detail / rating-overview / rating-change / issuer-rating-change / issuance-plan / exercise-notice | 列式 `{fieldList, list, total}` → 规范化后 `{list: [{...}], total}` | 字段名按 `--field` 或全部;每条命令的默认列恒在最前(如 `securityCode` + `tradeDate`、`issuerName`、`issueDate`),见 `commands/bond.md` |
107
107
  | bond announcement | 列式 `{fieldList, list}`(**无 `total`**)→ 规范化后为行数组 | `announcementDate` / `securityCode` + 其余字段;翻过末页为 `[]` |
108
+ | fund basic-info | `{list}`(**无 `total`**、不分页)→ 行数组;代码不存在返回 `[]` | `[].fundCode` / `fundName` / `mainFundCode`(A/C 份额共用)/ `investTypeCodeLevel1` / `investTypeNameLevel1` / `…Level2` / `mgrComp` / `setupDate` / `operationMode` / `exchange`(场外为 `null`)/ `riskLevel` / `isIndexFund`(布尔)/ `trackIndexCode` / `trackIndexName` |
109
+ | fund nav | 同上 | `[].fundCode` / `tradeDate`(倒序)/ `navUnit` / `navAccumulated` / `adjustFactor` / `navAdjusted` / `mmfAnnualizedYield` / `mmfUnitYield`(后两列仅货币基金有值) |
110
+ | fund fee-rate | 同上 | `[].fundCode` / `feeType` / `feeCondition`(分档条件,无分档为 `null`)/ `feeRate`(**字符串**,如 `"1.5%"`) |
111
+ | fund manager-info | 同上 | `[].managerName` / `currentCompany` / `careerStartDate` / `workingYears` / `managedFundScale`(亿元)/ `managedFundCount` / `historyFundCount` / `introduction`;同名经理多行 |
112
+ | fund manager-history | 同上 | `[].fundCode` / `managerName` / `startDate` / `endDate`(`null` = 现任)/ `managedDays` / `managedReturn`(%) |
113
+ | fund asset-size / holder-structure / top10-holders | 同上,每报告期一行(`top10-holders` 每期按名次多行) | `[].fundCode` / `reportDate` + 规模(`sharesEnd` / `netAsset`,万份 / 万元)、持有人结构(`holderCount` 是**带千分位的字符串** / `pctInstitution` / `pctIndividual`)、前十大(`serialNumber` / `holderName` / `holdingShares` / `holdingPct`) |
114
+ | fund asset-allocation | 同上,每报告期按资产类型多行 | `[].fundCode` / `reportDate` / `assetLevel` / `assetType` / `assetTypeName` / `holdingValue`(元)/ `pctToTotalAsset` |
115
+ | fund stock-portfolio / bond-portfolio / fund-portfolio | 同上,每报告期按持仓多行 | `[].fundCode` / `reportDate` / `stockName` · `bondName` · `holdingFundName`(**只有简称、无代码**)/ `holdingQuantity` / `holdingValue`(万元)/ `pctToNav`;股票另有 `pctToFloatShares` / `pctToNavChg` |
116
+ | fund industry-allocation / bond-type-allocation / fund-type-allocation | 同上,每报告期按分类多行 | `[].fundCode` / `reportDate` / `industryCode` + `industryName` · `bondTypeCode` + `bondTypeName` · `investTypeCodeLevel1` + `investTypeNameLevel1` / `pctToNav`;行业与基金类型另有 `positionType`(`top` / `all`) |
117
+ | fund etf-pcf-header / etf-pcf-components / etf-share-change | 同上 | 申赎参数(`tradeDate` / `purchaseRedemptionStatus` / `minUnitShares` / `cashBalance` / `componentCount`);成分清单(`serialNumber` / `componentCode` / `componentName` / `pctWeight` / `purchaseQuantity` / `cashSubstituteFlag`);份额变动(`tradeDate` / `shares` / `sharesChange` / `scale`,万份 / 万元) |
108
118
  | indicator search | `[{indicatorCode, indicatorName, ...}]`(列表) | `indicatorCode` / `indicatorName` / `description` / `scopeList[].market` / `scopeList[].securityType` / `scopeList[].usageRestriction`(接口限制,`null`=无限制) / `parameterList[].paramKey`(**参数名以此为准**) / `.enumList[].value` / `score` |
109
119
  | indicator cross-section | CLI 拍平为宽表 `{list, total}` | `list[].security` / `list[].name` + 每个指标名一列;**单日多指标 × 多证券**,每行一只证券。**没有 `date` 列**(查询日期挂在每个指标的参数上,各列可为不同日期);原始响应的 `values` 为 `[证券][指标]` |
110
120
  | indicator time-series | CLI 拍平为宽表 `{list, total}` | `list[].date` + 序列列:单证券时列=各指标、多证券时列=各证券;每行一个日期。原始响应 `values` 仍为 `[序列][日期]` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gangtise-openapi-cli",
3
- "version": "0.43.0",
3
+ "version": "0.44.0",
4
4
  "description": "CLI for Gangtise OpenAPI",
5
5
  "license": "MIT",
6
6
  "repository": {