Skill: asfamilybank/stock-query (version 2.6.0)

--- name: stock-query description: > 查询全球股票实时行情（A 股、港股、美股）、ETF、场外基金、指数，支持批量查询、历史K线（含均线）与自选股管理。 TRIGGER when: 用户查询股价/行情/净值/历史K线/自选盈亏/大盘指数时。NOT for: 加密货币、期货、期权、外汇。 license: MIT compatibility: Requires curl, iconv, python3. macOS/Linux only. metadata: version: "2.6.0" author: asfamilybank repo: https://github.com/asfamilybank/stock-query user-invocable: true allowed-tools: - Bash --- # 全球股票/ETF/基金/指数 实时价格查询 ## 权限与操作范围 | 权限 | 声明用途 | 限制 | |------|---------|------| | `network` | `scripts/sq.sh` 内部调用行情 API | 仅限 `qt.gtimg.cn`、`hq.sinajs.cn`、`push2.eastmoney.com`、`web.ifzq.gtimg.cn`、`query1.finance.yahoo.com`、`fundgz.1234567.com.cn`、`api.fund.eastmoney.com` 七个数据源，不发送用户个人数据 | | `shell` | 执行 `curl`、`iconv`、`grep`、`awk`、`mktemp` | 仅操作 `portfolio.csv`；不执行任意命令 | **文件访问：** 本 skill 仅在用户**显式指令**下读写 `portfolio.csv` 一个文件，优先查找 `~/.config/stock-query/portfolio.csv`，其次兼容旧版安装目录（`~/.openclaw/workspace/skills/stock-query/`、`~/.claude/skills/stock-query/`、`~/.agents/skills/stock-query/`），无需配置任何环境变量。历史数据通过网络实时获取，不写本地文件。 **自动触发范围：** **文件操作（Command 1）不会自动触发**，仅在用户明确发出增/删/改/查 portfolio 指令时执行。 ⚠️ **凭证安全：** `portfolio.csv` 仅应包含股票代码、名称、数量、自选价格。**禁止存放账户密码、API 密钥、Token 或任何认证凭证。** ## 前置依赖 | 工具 | 说明 | |------|------| | `scripts/sq.sh` | 行情查询 CLI，内部使用 `curl` + `iconv` | | `scripts/fmt.sh` | 格式化输出工具，由 `sq.sh --format` 调用，依赖 `python3`，输出人类可读的 Markdown 表格 | ## 支持的市场与标的 | 市场 | 代码格式 | 示例 | |------|---------|------| | 沪/深市股票、ETF、指数 | 6 位数字 | `601991`、`510300`、`000001` | | 港股 | ≤5 位数字（自动补零） | `700`、`00700`、`09988` | | 美股 | 英文 ticker | `AAPL`、`TSLA`、`BIDU` | | 美股指数 | `.DJI` / `.IXIC` / `.SPX` | `.DJI` | | 场外基金 | 6 位数字 | `014978`、`110011` | --- ## 工作流程 ### Step 0: 意图识别与 Command 路由 **Meta 命令**（最高优先级）：输入为 `version`、`-v`、`--version`、`help`、`-h`、`--help`（大小写不敏感） → 直接输出版本/帮助信息，**不执行后续步骤** version 输出： ``` stock-query v2.6.0 ``` help 输出： ``` stock-query v2.6.0 — 全球股票/ETF/基金/指数实时行情查询 用法： /stock-query <代码> [代码2 ...] 查询一个或多个标的实时行情 /stock-query <代码> 历史 查询个股历史K线（默认近30个交易日） /stock-query version 显示版本号 /stock-query help 显示本帮助 支持的市场： A股（沪/深） 6位数字，如 601991 000001 港股 5位数字，如 00700 09988 美股 英文ticker，如 AAPL TSLA NVDA 美股指数 .DJI .IXIC .SPX ETF 6位数字，如 510300 159915 场外基金 6位数字，如 014978 常用示例： /stock-query AAPL /stock-query 00700 09988 /stock-query AAPL 00700 601991 510300 /stock-query 600519 近60天日K /stock-query TSLA 周K 最近20周 作者：asfamilybank · https://github.com/asfamilybank/stock-query ``` **Command 1：Portfolio 文件管理**：含操作词（添加/新增/删除/移除/修改/查看/列出）＋ 对象词（自选股/持仓/portfolio/watchlist），或明确指令如"把 AAPL 加到自选股" → 直接执行 Command 1，**不进入 Command 2/3 流程** **Command 3：历史行情查询**：含关键词（历史/历史数据/历史行情/历史价格/历史走势/K线/日K/周K/月K） → 直接执行 Command 3，**不进入 Command 2 流程** **Command 2：行情查询**（默认）：其余所有输入 → 进入 Command 2 流程（执行 Step 1–6） --- ## 静默执行原则（Claude 对话输出约束） **⛔ 严禁向用户输出任何中间推理或过程信息。** 这是最高优先级约束，覆盖所有步骤。 > 本约束仅适用于 Claude 的对话文本输出。`scripts/sq.sh` stdout 仅输出结构化数据供 Claude 内部消费：行情/基金命令输出 JSON 数组，`pfile` 命令输出文件绝对路径或控制令牌 `NOT_FOUND`；stderr 输出错误/用法提示。`scripts/fmt.sh` 是格式化渲染层，接收 `sq.sh` 的 JSON 输出，输出供用户直接查看的 Markdown 表格（含涨跌 emoji、CJK 对齐、均线列）；其 stdout 为最终展示内容，非过程日志。两个脚本均不向用户界面打印任何过程信息。 以下内容**绝对禁止出现**在回复中： - 市场/类型判断（如"014978 是场外基金"） - 数据源切换说明（如"腾讯接口返回空，切换至东方财富："） - 文件路径查找过程 - 任何形式的"正在..."、"切换..."、"尝试..."等过程性文字 **唯一允许的输出：** 最终结果表格，或无法查询时的错误提示。 --- ## Command 1: Portfolio 文件管理 **所有增删改查操作必须通过 Bash 工具执行实际命令，禁止依赖会话记忆。未执行命令不得声称操作已完成。** ### 文件定位（每次进入 Command 1 必须首先执行） ```bash PFILE=$(bash scripts/sq.sh pfile) echo "$PFILE" ``` - 输出 `NOT_FOUND` → 立即向用户输出下方创建引导，停止执行，**不得创建任何替代文件** - 否则将 `$PFILE` 用于所有后续操作 **portfolio.csv 不存在时**，引导用户创建： ``` 未找到自选股文件。请执行以下步骤创建： 1. 创建配置目录并复制模板： mkdir -p ~/.config/stock-query cp <skill安装目录>/assets/portfolio.csv ~/.config/stock-query/portfolio.csv 2. 编辑文件，填入你的自选股信息。 ``` **CSV 文件格式**（参考 `assets/portfolio.csv`）： ``` 代码,名称,数量,自选价格 601991,大唐发电,1000,4.00 # 含数量与参考价，输出浮盈亏 014978,华安纳指100C,10000, # 自选价格留空：只查行情 AAPL,,50,220.00 # 名称留空：自动从接口获取 000300,,0, # 数量为 0：纯自选 ``` ### 查 ```bash grep -v '^#' "$PFILE" | tail -n +2 ``` 格式化为表格展示，不查询实时行情。如需实时价格，使用 Command 2。 ### 增 1. 用 `bash scripts/sq.sh get <code>` 获取标的名称 2. 执行： ```bash if grep -q "^{code}," "$PFILE" 2>/dev/null; then echo "DUPLICATE:{code}" else echo "{code},{name},{shares},{cost}" >> "$PFILE" && echo "ADDED:{code},{name},{shares},{cost}" fi ``` 3. `ADDED:...` → 展示添加结果；`DUPLICATE:{code}` → 询问是否改为修改操作 ### 改 1. 用 `bash scripts/sq.sh get <code>` 获取最新名称 2. 执行： ```bash OLD=$(grep "^{code}," "$PFILE") if [ -z "$OLD" ]; then echo "NOT_FOUND:{code}" else NEW="{code},{name},{shares},{cost}" tmp=$(mktemp) awk -F',' -v c="{code}" -v n="$NEW" \ 'BEGIN{OFS=","} $1==c{print n;next}{print}' "$PFILE" > "$tmp" && mv "$tmp" "$PFILE" echo "BEFORE:$OLD" echo "AFTER:$NEW" fi ``` 3. 展示修改前后 diff；`NOT_FOUND:{code}` → 提示未找到 ### 删 ```bash DEL=$(grep "^{code}," "$PFILE") if [ -z "$DEL" ]; then echo "NOT_FOUND:{code}" else tmp=$(mktemp) grep -v "^{code}," "$PFILE" > "$tmp" && mv "$tmp" "$PFILE" echo "DELETED:$DEL" fi ``` `DELETED:...` → 展示删除结果；`NOT_FOUND:{code}` → 提示未找到 --- ## Command 2: 行情查询 ### Step 1: 解析用户输入 **detail_mode 检测：** 若用户消息含以下关键词，设 `detail_mode = true`，在 Step 3 输出详细表格： - 中文：详细、详情、详细信息、更多信息、全部信息、完整信息 - 英文：detail、details、verbose、full 从用户消息中提取标的代码，支持以下形式： - **6 位纯数字** → A 股（股票/ETF/指数/基金） - **≤5 位纯数字** → 港股，自动补零（700 → 00700） - **英文字母或英文+数字** → 美股 ticker - **中文/英文名称** → 匹配下表常见标的；无法确定时向用户确认 常见标的速查： **A 股：** - 黄金ETF → 518880 / 红利低波ETF → 512890 / 沪深300ETF → 510300 - 卫星ETF → 563230 / 创业板ETF → 159915 / 中证500ETF → 510500 - 上证指数 → 000001 / 深证成指 → 399001 / 创业板指 → 399006 - 沪深300 → 000300 / 上证50 → 000016 / 中证500 → 000905 / 中证1000 → 000852 **港股：** - 腾讯 → 00700 / 阿里巴巴 → 09988 / 美团 → 03690 / 小米 → 01810 - 比亚迪 → 01211 / 恒生指数 → HSI **美股：** - 苹果 → AAPL / 谷歌 → GOOG / 特斯拉 → TSLA / 英伟达 → NVDA - 微软 → MSFT / 亚马逊 → AMZN / 百度 → BIDU / 阿里巴巴 → BABA - 哔哩哔哩 → BILI / 拼多多 → PDD - 道琼斯 → .DJI / 纳斯达克 → .IXIC / 标普500 → .SPX ### Step 2: 查询并格式化输出 ``` Step 2A: 执行命令（不得省略 --format 参数，单支/批量/任意市场均适用） detail_mode = false → bash scripts/sq.sh get <code1> [code2 ...] --format table detail_mode = true → bash scripts/sq.sh get <code1> [code2 ...] --format table --detail Step 2B: 将命令的 stdout 原样作为回复返回 ⛔ 不得解析 JSON 自行构建表格 ⛔ 不得修改 emoji 字符（A股/港股：涨🔴跌🟢；美股：涨🟩跌🟥） ⛔ 不得添加、删除或重排列 ``` **⛔ 特别注意：港股跌幅用 🟢（非 🔴）。** A股、港股均遵循中国市场惯例：上涨 🔴，下跌 🟢，平盘 ⚪。命令输出已正确处理，勿覆盖。 ### Step 4: 自选市值计算（可选） #### 4a. 从 portfolio 文件加载 当用户指令涉及自选股（如"查我的自选股""看下自选股"），先定位文件再批量查询： ```bash PFILE=$(bash scripts/sq.sh pfile) ``` - 输出 `NOT_FOUND` → 立即输出创建引导（见 Command 1），停止执行 - 否则读取文件，提取所有代码后用 `sq get` 批量查询 执行步骤（严格按序）： ``` Step A: 读取全部条目 codes_all = 文件中所有非注释、非表头行 codes_position = codes_all 中数量 > 0 的条目 codes_watch = codes_all 中数量 = 0 或空的条目 Step B: 批量查询 bash scripts/sq.sh get <codes_all 中所有代码> Step C: 输出自选市值表（若 codes_position 非空） 横向宽表格：代码/名称/数量/自选价格/现价/市值/浮盈亏/盈亏比 Step D: 输出自选行情表（若 codes_watch 非空）← 必须执行，不得省略 标题"自选行情"，简表：代码/名称/现价/涨跌幅 ``` **⚠️ Step D 不得跳过。** 数量=0 的条目不进市值表，但必须出现在 Step D。 输出示例： ``` | 代码 | 名称 | 数量 | 自选价格 | 现价 | 市值 | 浮盈/亏 | 盈亏比 | |--------|---------|--------|---------|--------|----------|------------|------------| | 601991 | 大唐发电 | 1000股 | 4.00 | 4.08 | 4,080 | 🔴 +80 | 🔴 +2.00% | | AAPL | 苹果 | 50股 | 220.00 | 246.63 | 12,332 | 🟩 +1,332 | 🟩 +12.10%| 自选行情 | 代码 | 名称 | 现价 | 涨跌幅 | |--------|--------|---------|------------| | 000300 | 沪深300 | 4509.24 | 🔴 +0.38% | | .DJI | 道琼斯 | 45216.14| 🟩 +0.11% | ``` #### 4b. 用户手动提供自选信息 用 `sq get` 查询后，**必须使用横向宽表格，禁止使用竖向键值对格式**： ``` | 代码 | 名称 | 数量 | 自选价格 | 最新价 | 市值 | 浮盈/亏 | 盈亏比 | |--------|----------|--------|---------|--------|-----------|--------------|--------------| | 600519 | 贵州茅台 | 100股 | 1680.0 | 1725.0 | 172,500 | 🔴 +4,500 | 🔴 +2.68% | | AAPL | 苹果 | 50股 | 220.0 | 251.49 | 12,574.50 | 🟩 +1,574.50 | 🟩 +14.31% | ``` 汇总行： ``` 📊 自选合计：市值 185,074.50 | 总参考成本 179,000 | 浮盈 +6,074.50（+3.39%） ``` 浮盈亏 emoji 遵循市场规则（A股/港股：盈利🔴亏损🟢；美股：盈利🟩亏损🟥）。跨市场汇总时提示用户各币种分开统计。 CSV 解析规则：`#` 开头为注释，第一个非注释行为表头，名称列为空时从查询结果自动填充，自选价格为空时浮盈亏显示 `—`。 --- ## Command 3: 历史行情查询 ### 意图解析 从用户输入中提取以下参数（均可省略，使用默认值）： **标的代码**：同 Step 1 规则。 **周期**（默认 day）： | 用户表述 | 参数 | |---------|------| | 日/天/日K/daily | `--period day` | | 周/周K/weekly | `--period week` | | 月/月K/monthly | `--period month` | **数量/区间**： - "近N天/周/月"、"最近N条"、"过去N" → `--count N` - "从 YYYY-MM-DD 到 YYYY-MM-DD"、"2024年1月到3月" → `--start ... --end ...`（转为 YYYY-MM-DD 格式） - 未指定 → 默认 30 条 **复权**（默认前复权）： | 用户表述 | 参数 | |---------|------| | 前复权（默认） | `--fq pre` | | 后复权 | `--fq post` | | 不复权/原始价格 | `--fq none` | ### 数据获取与格式化输出 ```bash bash scripts/sq.sh hist <code> [--period day|week|month] [--count N] [--start YYYY-MM-DD] [--end YYYY-MM-DD] [--fq pre|post|none] --format table ``` 直接执行上述命令，将输出原样呈现给用户。`--format table` 已内置所有格式化逻辑：倒序 K 线表格、标题行（标的/周期/复权/条数）、区间统计、emoji 涨跌规则、成交量单位换算。 --- ## 交易时间参考 | 市场 | 交易时段（当地时间） | 时区 | |------|-------------------|------| | A 股/ETF | 工作日 09:30-11:30, 13:00-15:00 | UTC+8 | | 场外基金估值 | 工作日 09:30-15:00 | UTC+8 | | 港股 | 工作日 09:30-12:00, 13:00-16:00 | UTC+8 | | 美股 | 工作日 09:30-16:00（北京时间 夏令时 21:30-04:00） | UTC-4/-5 | | QDII 基金 | 净值 T+2 至 T+7 公布 | — |


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)