echopai 2.0.0 → 2.2.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.
- package/README.md +13 -1
- package/dist/_generated/commands.js +46 -38
- package/dist/_generated/help.js +46 -41
- package/dist/_generated/operations.js +390 -167
- package/dist/bin.js +18 -7
- package/dist/tools/welcome.js +190 -0
- package/dist/verbs/digest.js +16 -14
- package/dist/verbs/financials.js +212 -0
- package/dist/verbs/index.js +14 -6
- package/dist/verbs/search.js +105 -0
- package/dist/verbs/views.js +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/verbs/research.js +0 -44
package/README.md
CHANGED
|
@@ -125,13 +125,16 @@ Available MCP tools (subset shown to LLM depends on token scopes):
|
|
|
125
125
|
| `digest` | One-shot research digest: 5 buckets in one call | `digest.get` + fan-out fallback |
|
|
126
126
|
| `quote` | Real-time quote for 1-200 codes | `quote` |
|
|
127
127
|
| `views` | **PRIMARY** research source (analyst views w/ entity attribution) | `views.recent` |
|
|
128
|
-
| `research` | Research-entity performance (hit rate / coverage) | `research.entity-performance-list` |
|
|
129
128
|
| `news` | **SUPPLEMENTARY** news / market briefs | `news.search` / `news.feed` |
|
|
130
129
|
| `sentiment` | Aggregate market sentiment | `sentiment.overview` |
|
|
131
130
|
| `hot` | Today's hot-stock leaderboard | `stocks.hot` |
|
|
132
131
|
| `chart` | Single-security K-line (daily / minute) | `bars.daily` / `bars.minute` |
|
|
133
132
|
| `bars_batch` | Batch K-line (≤100 codes × 1yr daily; ≤20 × 7d minute) | `bars.daily-batch` / `bars.minute-batch` |
|
|
134
133
|
| `scan` | Full-market quote snapshot (~5800 securities) | `quote.scan` |
|
|
134
|
+
| `financials_quote_snapshot` | **Headline** valuation snapshot (PE / PB / PS / 换手率 / 股息率 / 量比 14 fields, TDX + Sina 自算) | `financials.quote-snapshot` |
|
|
135
|
+
| `financials_pit` | Point-in-time financial indicators at a given trade_date (anti-future-fn for backtests) | `financials.pit` |
|
|
136
|
+
| `financials_reports` | Last N report-period snapshots (~25 fields × period, filter by Q1/H1/Q3/annual) | `financials.reports` |
|
|
137
|
+
| `financials_series` | Time series of a single financial metric across report periods | `financials.series` |
|
|
135
138
|
|
|
136
139
|
The agent should prefer `views` over `news` when forming an investment
|
|
137
140
|
opinion (views carries research-entity attribution; news is breadth-only).
|
|
@@ -159,6 +162,15 @@ echopai raw views feed --since-days 7 --all | jq '.title'
|
|
|
159
162
|
|
|
160
163
|
# One-shot research digest (server-side composite, 5 buckets, partial-failure tolerant)
|
|
161
164
|
echopai digest --code SSE:600519
|
|
165
|
+
|
|
166
|
+
# Headline valuation snapshot: 14 fields (PE / PB / PS / 换手率 / 股息率 / 量比 ...)
|
|
167
|
+
echopai financials quote-snapshot --code SSE:600519
|
|
168
|
+
echopai financials quote-snapshot --code SSE:600519 --date 2026-05-13 # historical
|
|
169
|
+
|
|
170
|
+
# Deeper fundamentals
|
|
171
|
+
echopai financials pit --code SSE:600519 --date 2024-11-01
|
|
172
|
+
echopai financials reports --code SSE:600519 --kind annual --limit 5
|
|
173
|
+
echopai financials series --code SSE:600519 --metric roe_simple
|
|
162
174
|
```
|
|
163
175
|
|
|
164
176
|
## Output formats
|
|
@@ -83,22 +83,6 @@ export function buildCommandTree(program, dispatch) {
|
|
|
83
83
|
attachOperation(cmd, OPERATIONS["auth.whoami"], dispatch);
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
{
|
|
87
|
-
const noun = program.command("backtest");
|
|
88
|
-
noun.description("backtest commands");
|
|
89
|
-
{
|
|
90
|
-
const cmd = noun.command("excess-distribution");
|
|
91
|
-
attachOperation(cmd, OPERATIONS["backtest.excess-distribution"], dispatch);
|
|
92
|
-
}
|
|
93
|
-
{
|
|
94
|
-
const cmd = noun.command("rolling-win-rate");
|
|
95
|
-
attachOperation(cmd, OPERATIONS["backtest.rolling-win-rate"], dispatch);
|
|
96
|
-
}
|
|
97
|
-
{
|
|
98
|
-
const cmd = noun.command("summary");
|
|
99
|
-
attachOperation(cmd, OPERATIONS["backtest.summary"], dispatch);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
86
|
{
|
|
103
87
|
const noun = program.command("bars");
|
|
104
88
|
noun.description("bars commands");
|
|
@@ -127,6 +111,42 @@ export function buildCommandTree(program, dispatch) {
|
|
|
127
111
|
attachOperation(cmd, OPERATIONS["digest.get"], dispatch);
|
|
128
112
|
}
|
|
129
113
|
}
|
|
114
|
+
{
|
|
115
|
+
const noun = program.command("financials");
|
|
116
|
+
noun.description("financials commands");
|
|
117
|
+
{
|
|
118
|
+
const cmd = noun.command("pit");
|
|
119
|
+
attachOperation(cmd, OPERATIONS["financials.pit"], dispatch);
|
|
120
|
+
}
|
|
121
|
+
{
|
|
122
|
+
const cmd = noun.command("quote-snapshot");
|
|
123
|
+
attachOperation(cmd, OPERATIONS["financials.quote-snapshot"], dispatch);
|
|
124
|
+
}
|
|
125
|
+
{
|
|
126
|
+
const cmd = noun.command("reports");
|
|
127
|
+
attachOperation(cmd, OPERATIONS["financials.reports"], dispatch);
|
|
128
|
+
}
|
|
129
|
+
{
|
|
130
|
+
const cmd = noun.command("series");
|
|
131
|
+
attachOperation(cmd, OPERATIONS["financials.series"], dispatch);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
{
|
|
135
|
+
const noun = program.command("index");
|
|
136
|
+
noun.description("index commands");
|
|
137
|
+
{
|
|
138
|
+
const cmd = noun.command("daily-bars");
|
|
139
|
+
attachOperation(cmd, OPERATIONS["index.daily-bars"], dispatch);
|
|
140
|
+
}
|
|
141
|
+
{
|
|
142
|
+
const cmd = noun.command("minute-bars");
|
|
143
|
+
attachOperation(cmd, OPERATIONS["index.minute-bars"], dispatch);
|
|
144
|
+
}
|
|
145
|
+
{
|
|
146
|
+
const cmd = noun.command("snapshot");
|
|
147
|
+
attachOperation(cmd, OPERATIONS["index.snapshot"], dispatch);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
130
150
|
{
|
|
131
151
|
const noun = program.command("market");
|
|
132
152
|
noun.description("market commands");
|
|
@@ -154,10 +174,6 @@ export function buildCommandTree(program, dispatch) {
|
|
|
154
174
|
const cmd = noun.command("search");
|
|
155
175
|
attachOperation(cmd, OPERATIONS["news.search"], dispatch);
|
|
156
176
|
}
|
|
157
|
-
{
|
|
158
|
-
const cmd = noun.command("sources");
|
|
159
|
-
attachOperation(cmd, OPERATIONS["news.sources"], dispatch);
|
|
160
|
-
}
|
|
161
177
|
}
|
|
162
178
|
{
|
|
163
179
|
const noun = program.command("payment");
|
|
@@ -180,15 +196,19 @@ export function buildCommandTree(program, dispatch) {
|
|
|
180
196
|
}
|
|
181
197
|
}
|
|
182
198
|
{
|
|
183
|
-
const noun = program.command("
|
|
184
|
-
noun.description("
|
|
199
|
+
const noun = program.command("search");
|
|
200
|
+
noun.description("search commands");
|
|
185
201
|
{
|
|
186
|
-
const cmd = noun.command("
|
|
187
|
-
attachOperation(cmd, OPERATIONS["
|
|
202
|
+
const cmd = noun.command("semantic");
|
|
203
|
+
attachOperation(cmd, OPERATIONS["search.semantic"], dispatch);
|
|
188
204
|
}
|
|
205
|
+
}
|
|
206
|
+
{
|
|
207
|
+
const noun = program.command("securities");
|
|
208
|
+
noun.description("securities commands");
|
|
189
209
|
{
|
|
190
|
-
const cmd = noun.command("
|
|
191
|
-
attachOperation(cmd, OPERATIONS["
|
|
210
|
+
const cmd = noun.command("industry");
|
|
211
|
+
attachOperation(cmd, OPERATIONS["securities.industry"], dispatch);
|
|
192
212
|
}
|
|
193
213
|
}
|
|
194
214
|
{
|
|
@@ -219,18 +239,6 @@ export function buildCommandTree(program, dispatch) {
|
|
|
219
239
|
attachOperation(cmd, OPERATIONS["sentiment.turnover"], dispatch);
|
|
220
240
|
}
|
|
221
241
|
}
|
|
222
|
-
{
|
|
223
|
-
const noun = program.command("signals");
|
|
224
|
-
noun.description("signals commands");
|
|
225
|
-
{
|
|
226
|
-
const cmd = noun.command("outcome");
|
|
227
|
-
attachOperation(cmd, OPERATIONS["signals.outcome"], dispatch);
|
|
228
|
-
}
|
|
229
|
-
{
|
|
230
|
-
const cmd = noun.command("outcomes");
|
|
231
|
-
attachOperation(cmd, OPERATIONS["signals.outcomes"], dispatch);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
242
|
{
|
|
235
243
|
const noun = program.command("squawk");
|
|
236
244
|
noun.description("squawk commands");
|
package/dist/_generated/help.js
CHANGED
|
@@ -22,21 +22,6 @@ export const HELP = {
|
|
|
22
22
|
"description": "Returns the calling token's kind, scopes, audience, app metadata,\nrate_limit, allowed_clients, agent_budget (if kind=agent), api_version,\nfeature_flags. Any valid JWT can call — no specific scope required.\n\nCLI/MCP call this once at startup, cache 5 minutes in-process, and use\nthe response to derive `verbs.available` (intersection of curated verb\nscopes with token scopes) and to populate `echopai doctor` checks.\n\nSee `docs/PLAN_CLI_V2_AGENT_SURFACE.md` §5.1.\n",
|
|
23
23
|
"example": "echopai auth whoami"
|
|
24
24
|
},
|
|
25
|
-
"backtest.excess-distribution": {
|
|
26
|
-
"summary": "Excess-return distribution over a benchmark",
|
|
27
|
-
"description": "信号相对基准(沪深 300 / 中证 1000 等)持有期超额收益的直方分布。",
|
|
28
|
-
"example": "echopai backtest excess-distribution"
|
|
29
|
-
},
|
|
30
|
-
"backtest.rolling-win-rate": {
|
|
31
|
-
"summary": "Rolling win rate of a signal series",
|
|
32
|
-
"description": "信号在滚动窗口(默认 60 个交易日)内的胜率时间序列。",
|
|
33
|
-
"example": "echopai backtest rolling-win-rate"
|
|
34
|
-
},
|
|
35
|
-
"backtest.summary": {
|
|
36
|
-
"summary": "Backtest summary metrics for a signal series",
|
|
37
|
-
"description": "信号回测汇总:胜率、平均超额收益、Sharpe-like 评分、最大回撤等。",
|
|
38
|
-
"example": "echopai backtest summary"
|
|
39
|
-
},
|
|
40
25
|
"bars.daily": {
|
|
41
26
|
"summary": "Daily OHLC bars for one A-share security",
|
|
42
27
|
"description": "Daily OHLC bars for one A-share security over a date range. Returns open / high / low / close / volume / turnover per trading day. Requires `bars:30d` (last 30 trading days) or `bars:full` (full history) scope.",
|
|
@@ -59,9 +44,44 @@ export const HELP = {
|
|
|
59
44
|
},
|
|
60
45
|
"digest.get": {
|
|
61
46
|
"summary": "One-shot research digest for a single security (composite)",
|
|
62
|
-
"description": "Composite endpoint: in one HTTP call returns views (PRIMARY research),\
|
|
47
|
+
"description": "Composite endpoint: in one HTTP call returns views (PRIMARY research),\nreal-time quote, valuation snapshot (PE/PB/PS/换手率/股息率/量比 等 14 字段),\nmarket sentiment context, and supplementary news.\nPartial-failure tolerant:\neach bucket is independently fetched and per-bucket failures surface\nin `meta.partial_failures[]` rather than poisoning the response. If\nevery sub-bucket fails the endpoint returns 502.\n\nBucket scopes are checked *per bucket* (not at gateway level): a\ntoken with only `views:read` gets the views bucket populated and the\nrest reported as `scope_insufficient` partial failures. This mirrors\nthe CLI fan-out contract exactly so `echopai digest` can either call\nthis endpoint (preferred, single round-trip) or fall back to local\nfan-out without behavior drift.\n\nSee `docs/PLAN_CLI_V2_AGENT_SURFACE.md` §3.3 (digest spec) and §11\nPhase 5.2 (server endpoint).\n",
|
|
63
48
|
"example": "echopai digest get VALUE"
|
|
64
49
|
},
|
|
50
|
+
"financials.pit": {
|
|
51
|
+
"summary": "Point-in-time financial indicators for one A-share at a given date",
|
|
52
|
+
"description": "基于 TDX 财务数据的 Point-in-time 查询。给定 `code` 和 `date`,返回该\n`trade_date` 当时市场上可见的最新一期财务报告(`announce_date <= date`,\n无公告日时保守延迟 90 天)。专为回测、AI agent、量化策略防未来函数泄漏。\n\n返回字段包括:EPS(基本/扣非/稀释)、BPS、ROE、毛利率、营收/净利润/总资产/\n归母权益等核心 ~25 字段。\n",
|
|
53
|
+
"example": "echopai financials pit --code SSE:600519 --date 2024-11-01"
|
|
54
|
+
},
|
|
55
|
+
"financials.quote-snapshot": {
|
|
56
|
+
"summary": "Real-time valuation / share / turnover snapshot for one A-share",
|
|
57
|
+
"description": "一站式估值快照 —— 一次返回 14 个字段,**全部基于 TDX 原始数据 + Sina 实时\n价自算,不依赖 Tushare**:\n\n- 估值: `pe` / `pe_ttm` / `pb` / `ps` / `ps_ttm`\n- 股本(万股): `total_share` / `float_share` / `free_share`\n- 市值(万元): `total_mv` / `circ_mv`\n- 流动性: `turnover_rate` / `turnover_rate_f`(%)/ `volume_ratio`(倍)\n- 分红: `dv_ratio` / `dv_ttm`(%)\n\n计算口径:\n- PE-TTM = 当前总市值 / 近 4 季度滚动净利润(PIT 表 `ni_parent_ttm`)\n- PE = 当前总市值 / 上年报净利润(`ni_parent_last1y`)\n- PB = 当前总市值 / 归母净资产(`equity_parent`,PIT 防穿越)\n- 换手率 = 当日累计成交量 / 流通股本 × 100\n- 量比 = 当日累计 / 近 5 日同时段累计平均(实时模式)\n / 近 5 日全日成交量平均(指定历史日期模式)\n- 股息率 = Σ(去年 / 近12月内派息事件 派现/10) / 现价 × 100\n\n默认 `date` 留空 → 实时(Sina 5s 快照价 + 当日累计成交量);\n给 `date=YYYY-MM-DD` 则按当日 close 取值(用于历史回测 / 校验)。\n\n财报数据走 `security_financial_indicators_pit` PIT 视图:保证 `visible_date`\n≤ trade_date,避免未来函数。\n\n准确性已对照 Tushare `daily_basic` 校验(见 `scripts/validation/validate_quote_snapshot_vs_tushare.py`)。\n",
|
|
58
|
+
"example": "echopai financials quote-snapshot --code SSE:600519 --date 2026-05-13"
|
|
59
|
+
},
|
|
60
|
+
"financials.reports": {
|
|
61
|
+
"summary": "Recent financial reports for one A-share security",
|
|
62
|
+
"description": "返回该股票最近 N 期财务报告的核心指标(EPS/BPS/ROE/毛利率/营收/净利润/总\n资产/归母权益/经营现金流/总股本 等 ~25 字段)。可按 `kind` 过滤季报/半年报/\n年报。每期 `announce_date` 字段告知何时市场可见,建议结合回测时使用。\n",
|
|
63
|
+
"example": "echopai financials reports --code SSE:600519"
|
|
64
|
+
},
|
|
65
|
+
"financials.series": {
|
|
66
|
+
"summary": "Time series of a single financial metric for one security",
|
|
67
|
+
"description": "返回某只股票某个财务指标的历史时间序列(按报告期排列)。`metric` 是\nindicators 表中的字段名(如 `roe_simple` / `revenue` / `ni_parent` /\n`debt_asset_ratio` / `gross_margin` / `eps_basic` 等共 150 个)。\n\n典型用法:画茅台 10 年 ROE 走势、对比 5 只白酒股 net_margin。\n",
|
|
68
|
+
"example": "echopai financials series --code SSE:600519 --metric roe_simple"
|
|
69
|
+
},
|
|
70
|
+
"index.daily-bars": {
|
|
71
|
+
"summary": "Daily OHLC bars for one A-share index",
|
|
72
|
+
"description": "指数日线 OHLC。覆盖 v2 表中的指数(上证综指 `SSE:000001` / 深证成指\n`SZSE:399001` / 沪深300 `SSE:000300` / 北证50 `BSE:899050` / 中证系列 `CSI:000922` 等)。\n与 `/v1/bars/daily` 同语义,但 index 没有 `turnover_rate` / `paused` 等股票特有字段。\n",
|
|
73
|
+
"example": "echopai index daily-bars --code SSE:000001 --from 2024-01-01 --to 2024-12-31"
|
|
74
|
+
},
|
|
75
|
+
"index.minute-bars": {
|
|
76
|
+
"summary": "Minute OHLC bars for one A-share index",
|
|
77
|
+
"description": "指数 1min OHLC。日期范围 ≤ 7 天(与 `/v1/bars/minute-batch` 对齐)。\n返回 `bar_time` / `trade_date` / OHLC / volume / amount / pct_change。\n",
|
|
78
|
+
"example": "echopai index minute-bars --code SSE:000001"
|
|
79
|
+
},
|
|
80
|
+
"index.snapshot": {
|
|
81
|
+
"summary": "Real-time snapshot of all Sina-OK A-share indices (172 indices)",
|
|
82
|
+
"description": "Returns the latest real-time snapshot for the 172 indices that Sina\nexposes a quote for (SSE / SZSE / BSE — includes 北证50 `BSE:899050`\nand 专精特新 `899601.BJ`). Source is the Redis hash\n`stockpulse:index_snapshots:latest` which the Rust collector refreshes\nevery ~15 seconds during market hours; outside trading hours the last\nintraday snapshot is returned.\n\nUse `codes` to narrow to a subset (canonical format `SSE:000001` (exchange-prefix; legacy `000001.SH` is also accepted but discouraged)).\nOmit to receive all 172.\n\nNote: CSI-series indices (e.g. `CSI:000922`) are not available here —\nSina has no quote feed for them. Daily/minute history for those still\nlives behind `/api/internal/index/{daily-bars,minute-bars-range}`.\n\nRequires `quote:l1`, `quote:l2`, or `quote:delayed` scope.\n",
|
|
83
|
+
"example": "echopai index snapshot --codes SSE:000001,SZSE:399001,BSE:899050"
|
|
84
|
+
},
|
|
65
85
|
"market.status": {
|
|
66
86
|
"summary": "Current A-share market session state",
|
|
67
87
|
"description": "Current A-share market session: pre-open / open / lunch / closed; current and next trading day; holiday flag. Requires `market:read` or any `quote:*` scope.",
|
|
@@ -74,7 +94,7 @@ export const HELP = {
|
|
|
74
94
|
},
|
|
75
95
|
"news.get": {
|
|
76
96
|
"summary": "Fetch a single news item by id",
|
|
77
|
-
"description": "返回新闻完整内容:title、content snippet、source
|
|
97
|
+
"description": "返回新闻完整内容:title、content snippet、tagged securities。(采集端字段 source / source_id / source_url 对外不暴露,admin 路径 /v1/admin/news/{id} 可见。)",
|
|
78
98
|
"example": "echopai news get VALUE"
|
|
79
99
|
},
|
|
80
100
|
"news.list": {
|
|
@@ -84,14 +104,9 @@ export const HELP = {
|
|
|
84
104
|
},
|
|
85
105
|
"news.search": {
|
|
86
106
|
"summary": "Full-text search recent news",
|
|
87
|
-
"description": "Full-text search recent news / market briefs. Returns title,
|
|
107
|
+
"description": "Full-text search recent news / market briefs. Returns title, published_at, snippet, tagged securities. (Internal collector identifiers — `source`/`source_id`/`source_url` — are NOT exposed publicly; admin tools see them via /v1/admin/*.) Requires `news:read` scope. Note: news fields are user-generated; meta.untrusted_text_fields lists fields that need sanitization before passing to an LLM.",
|
|
88
108
|
"example": "echopai news search --query 光伏龙头"
|
|
89
109
|
},
|
|
90
|
-
"news.sources": {
|
|
91
|
-
"summary": "List canonical news source identifiers",
|
|
92
|
-
"description": "返回新闻 source 标识列表(如 `cls`、`jin10`、`twitter`、`wallstreetcn`),可用于 list/search 的 source 过滤。",
|
|
93
|
-
"example": "echopai news sources"
|
|
94
|
-
},
|
|
95
110
|
"payment.plans": {
|
|
96
111
|
"summary": "List subscription plans",
|
|
97
112
|
"description": "返回订阅计划清单(plan_id + 价格 + 时长 + 描述)。",
|
|
@@ -107,15 +122,15 @@ export const HELP = {
|
|
|
107
122
|
"description": "Dumps the entire Redis snapshot of A-share real-time quotes in a single\nround-trip. Use for \"全市场扫描\" / agent universe-of-interest discovery\nwhen you don't yet know which codes to query.\n\nFiltering:\n- `exchange=SSE|SZSE|BSE` narrows to one exchange (canonical_code prefix)\n- `app.allowed_securities` is ALWAYS applied; codes outside drop silently\n\nResponse size: ~3 MB unfiltered (~5800 items). CLI users should pair\nwith `--max-bytes` / `--fields` / `--query` from Phase 1.4.\n\n9:00–9:14 集合竞价时段返回空 items + `note` 字段说明。\n\nRequires `quote:l1`, `quote:l2`, or `quote:delayed` scope.\n",
|
|
108
123
|
"example": "echopai quote scan"
|
|
109
124
|
},
|
|
110
|
-
"
|
|
111
|
-
"summary": "
|
|
112
|
-
"description": "
|
|
113
|
-
"example": "echopai
|
|
125
|
+
"search.semantic": {
|
|
126
|
+
"summary": "Hybrid semantic search across news + analyst views",
|
|
127
|
+
"description": "语义 + 模糊泛化搜索。结合 entity 精确匹配(公司代码/分析师)、向量召回(pgvector\n+ DashScope embedding)、trigram 模糊、ILIKE 精确四路召回,RRF 融合后用 reranker\n精排,叠时间衰减 + views 加权(views 主源优先)。\n\n- 搜\"锂电池\"会带出新能源产业链(正极/负极/碳酸锂/宁德时代…)\n- 搜\"芯片\"会带出存储芯片/洁净室/晶圆代工…\n- mode=exact 兼容老 ILIKE 行为,仅在精确关键词命中时返回。\n",
|
|
128
|
+
"example": "echopai search semantic --q 锂电池"
|
|
114
129
|
},
|
|
115
|
-
"
|
|
116
|
-
"summary": "
|
|
117
|
-
"description": "
|
|
118
|
-
"example": "echopai
|
|
130
|
+
"securities.industry": {
|
|
131
|
+
"summary": "TDX + 申万 industry classification for one A-share security",
|
|
132
|
+
"description": "返回该股票的 TDX 自定义行业代码(T1001 食品饮料等)与申万行业三级代码\nL1/L2/L3(X5001 食品饮料 / X500102 白酒 等)。\n\n用法:\n- 股票详情页\"申万行业:白酒 / 食品饮料\"标签\n- 筛选器交叉过滤:行业 + ROE/营收增长率\n- AI agent `find_peers(code)` 用申万二级行业找同业\n",
|
|
133
|
+
"example": "echopai securities industry --code SSE:600519"
|
|
119
134
|
},
|
|
120
135
|
"semantic.find": {
|
|
121
136
|
"summary": "Find A-share securities by name / code / pinyin",
|
|
@@ -142,16 +157,6 @@ export const HELP = {
|
|
|
142
157
|
"description": "Intraday turnover time series. Requires `sentiment:read` scope.",
|
|
143
158
|
"example": "echopai sentiment turnover"
|
|
144
159
|
},
|
|
145
|
-
"signals.outcome": {
|
|
146
|
-
"summary": "Outcome trace for a single signal",
|
|
147
|
-
"description": "单条 signal 的细化结果追踪。",
|
|
148
|
-
"example": "echopai signals outcome VALUE"
|
|
149
|
-
},
|
|
150
|
-
"signals.outcomes": {
|
|
151
|
-
"summary": "Outcomes of analyst-view-derived signals",
|
|
152
|
-
"description": "返回分析师 views 派生信号的实际结果(目标价命中 / 止损 / 到期),含命中时长、最大回撤等。",
|
|
153
|
-
"example": "echopai signals outcomes"
|
|
154
|
-
},
|
|
155
160
|
"squawk.audio": {
|
|
156
161
|
"summary": "Stream squawk TTS audio",
|
|
157
162
|
"description": "返回 squawk 项的 TTS 音频(MP3)。直接 stream,可作为 `<audio>` src 用。",
|