【夜间复盘】2026-06-11

📊 夜间复盘

2026-06-11 22:33 · 数据时间 22:33
🥇 黄金
📈 指数
🔥 基金
💰 债市
📰 快讯
Cron Job: 夜间复盘 22:30 (FAILED)

Job ID: 10cbc8199343

Run Time: 2026-06-11 22:30:50

Schedule: 30 22 * * *

Prompt

[IMPORTANT: The user has invoked the "financial-advisory" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

name: financial-advisory

description: 专业投顾资讯平台 v4.7 – 灵活配置+科技主题版:ttfund技能+东方财富直连+AKShare,飞书 Docx 三通道投递(WP + 飞书 PDF + 飞书文档-原生真表格)。重点关注科技/CPO/红利基金/芯片/半导体,黄金作为可选对冲配置

version: "4.7"

tags: [finance, stock, investment, A股, 科技, CPO, 芯片, 半导体, 红利基金, 灵活配置, 龙虎榜, 融资融券, 北向资金, feishu-docx]

related_skills: []

专业投顾资讯平台 v4.5 – 灵活配置+科技主题版
概述

面向灵活配置型投资者的金融市场分析服务。

核心关注方向:科技 / CPO(光模块) / 红利基金 / 芯片 / 半导体——这是市场主线机会与底仓配置的双轮。

黄金、债券、活期宝作为可选对冲与现金管理工具,按需展示,不再作为核心推送。

覆盖能力:

  • 科技/CPO/芯片/半导体板块行情、成分股、资金流向、机构调研
  • 红利基金/低波基金排行、估值、配置建议
  • AI算力/数据要素等热点主题追踪
  • 全类型基金排行/估值/净值分析
  • 黄金(仅作为对冲参考)、债券、活期宝(按需调用)
  • 板块研判、资金流向分析、技术指标计算、买卖信号生成
数据源矩阵
妙想技能(东方财富权威数据,优先使用)
技能 功能 调用方式
mx-data 金融数据查询(行情/财务/关联) `python3 ~/.hermes/skills/mx-data/mx_data.py "查询内容"`
mx-search 资讯搜索(新闻/研报/公告) `python3 ~/.hermes/skills/mx-search/mx_search.py "关键词"`
mx-xuangu 智能选股(自然语言条件) `python3 ~/.hermes/skills/mx-xuangu/mx_xuangu.py "选股条件"`
mx-zixuan 自选股管理 `python3 ~/.hermes/skills/mx-zixuan/mx_zixuan.py`
mx-moni 模拟组合管理(买卖/持仓) `python3 ~/.hermes/skills/mx-moni/mx_moni.py`

bond_market 数据来源: em_client.py的`bond_market`字段包含ttfund API完整响应(含markdown格式的债市晴雨表),但`orgData.barometerRateItemList`数组可能为空。真正有用的结构化数据在 `module_1[0].markdown` 字段(含整体天气emoji + 利率债/信用债 品种×期限 表格 + 市场观点 + 风险提示),不是 `module_1[0].textSummary`(那只是单行摘要)。ttfund BOND_MARKET 单独调用也可能返回空orgData,此时em_client数据更可靠。

东方财富直连API(补充实时数据)

数据类型 接口 状态
板块行情 push2.eastmoney.com/api/qt/clist/get (fs=m:90+t:2/t:3)
板块资金流向 push2.eastmoney.com clist fid=f62
大盘资金流向 push2.eastmoney.com fflow/kline
北向资金实时 push2.eastmoney.com kamt.rtmin
个股行情 push2.eastmoney.com api/qt/stock/get
美股指数 push2.eastmoney.com api/qt/ulist.np/get (secids=100.DJIA,100.SPX,100.NDX)
沪金期货 push2.eastmoney.com api/qt/stock/get (secid=113.AU0)
涨跌榜 push2.eastmoney.com clist fid=f3
天天基金Skills API(基金+黄金核心数据源)
数据类型 skill_id 调用方式
黄金行情 FUND_HUAAN_GOLD_INFO `tt_gold_market()`
基金综合信息 FUND_BASE_INFOS `tt_fund_info(fcode)`
基金经理 FUND_MANAGER_INFO `tt_fund_manager(name)`
基金持仓 FUND_HOLDING_INFO `tt_fund_holding(fcode)`
基金净值 FUND_NAV_INFO `tt_fund_nav(fcode, range)`
条件选基 FUND_CONDITION_SELECT `tt_condition_select(order, num)`
债市行情 BOND_MARKET `tt_bond_market()`
指数行情 FUND_INDEX_INFO `tt_index_info(index_id)`
基金搜索 FUND_SEARCH `tt_fund_search(query, type)`
股票行情 FUND_STOCK_PRICE_QUERY `tt_stock_price(query)`
基金主题 FUND_THEME_INFO `tt_theme_info(query)`
活期宝 FUND_HUOQIBAO_LIST `tt_huoqibao(top_n)`
投顾策略 FUND_TG_STRATEGY_INFO `tt_advisory_strategy(name)`
自选管理 FUND_FAVOR_ZX `tt_favor_query()`

所有函数通过 `tt_skill_invoke()` 统一调用天天基金网关,API Key: `$TTFUND_APIKEY`。

主采集脚本 `em_client.py` 已集成全部技能,输出JSON包含: gold_market_skill, bond_market, index_quote, fund_search, huoqibao, gold_theme, favor_funds。

天天基金API(基金排行/估值/净值 – 直连)
数据类型 接口 状态
基金排行 fund.eastmoney.com/data/rankhandler.aspx
ETF排行 rankhandler.aspx ft=zs
基金实时估值 fundgz.1234567.com.cn/js/{code}.js
基金历史净值 api.fund.eastmoney.com/f10/lsjz
AKShare(备用,东方财富限流时自动切换)
数据类型 接口 状态
A股指数 stock_zh_index_daily
美股指数 index_us_stock_sina
大宗商品 futures_zh_spot
宏观数据 macro_china_lpr / index_pmi_man_cx
融资融券 stock_margin_sse / stock_margin_szse
大宗交易 stock_dzjy_mrmx / stock_dzjy_mrtj
龙虎榜 stock_lhb_detail_em / stock_lhb_jgmmtj_em
机构调研 stock_jgdy_detail_em
股东增减持 stock_shareholder_change_ths
限售解禁 stock_restricted_release_queue_em
北向资金明细 stock_hsgt_hist_em
新闻数据(多源)
来源 方式 状态
财联社快讯 AKShare stock_info_global_cls
东方财富 AKShare stock_news_em
同花顺 HTTP API news.10jqka.com.cn
新浪财经 HTTP API feed.mix.sina.com.cn
金十数据 HTTP jin10.com/flash_newest.js
巨潮资讯 POST cninfo.com.cn API
证监会 HTML scraping csrc.gov.cn
`stock_hsgt_north_net_flow_in_em` 函数不存在(v1.18.62) `stock_hsgt_hist_em(symbol="北向资金")`
`futures_foreign_commodity_realtime` axis mismatch bug `futures_zh_spot(symbol="AU0", market="CF")`
`stock_individual_fund_flow_rank` 53页分页必断连 只用 `stock_sector_fund_flow_rank`

⚠️ 易限流函数(EastMoney服务器):

  • `stock_board_industry_name_em` / `stock_board_concept_name_em` — 连续调用必被封
  • `stock_zh_a_hist` — 单次OK,批量28只需每只间隔0.5s+retry 3次
  • `stock_hk_index_daily_em` — 间歇性ConnectionError

限流对策: 脚本间调用间隔5秒,单脚本内每个API调用间隔3秒,retry用指数退避(3s/6s/9s)。测试阶段被限流后需等待10分钟才恢复。

涨跌停数据: `stock_zt_pool_em` 盘中返回空DataFrame,必须收盘后调用。

北向资金字段映射:

  • `stock_hsgt_hist_em` 返回: 日期, 当日成交净买额, 持股市值, 领涨股 等
  • `stock_hsgt_fund_min_em` 返回: 分钟级资金流入
  • `stock_hsgt_fund_flow_summary_em` 返回: 沪股通/深股通汇总
  • northbound 字段值单位: `沪股通净流入`/`深股通净流入`/`北向合计` 的值单位为(不是万元或亿元),如 `4200000.0` = 420万元。非交易时段沪股通可能返回0.0。
  • `market_fund_flow` 在非交易时段或限流时返回 `null`,此时无法获取大盘资金流向数据。

板块行情字段名不一致:

  • 行业板块用 `stock_sector_fund_flow_rank(indicator="今日")` — 列名含"今日主力净流入-净额"
  • 个股用 `stock_individual_fund_flow_rank` — 列名含"主力净流入-净额"(但此函数不可用)
新闻API详细端点
URL/方法 解析方式
同花顺 `https://news.10jqka.com.cn/tapp/news/push/stock/?page=1&tag=&track=website&num=20` JSON → `data.list[].title`
新浪财经 `https://feed.mix.sina.com.cn/api/roll/get?pageid=153&lid=2516&num=20&encode=utf-8` JSON → `result.data[].title`
金十数据 `https://www.jin10.com/flash_newest.js` JS变量,用 `re.search(r'\[.*\]', data, re.DOTALL)` 提取JSON数组,再 `json.JSONDecoder().raw_decode()`
巨潮资讯 POST `http://www.cninfo.com.cn/new/hisAnnouncement/query` body=`startDate=&endDate=&category=&pageNum=1&pageSize=15&column=szse` JSON → `announcements[].announcementTitle`
证监会 `http://www.csrc.gov.cn/csrc/c100028/common_list.shtml` HTML解析 `<a>` 标签
脚本输出规范

所有脚本输出到 stdout(JSON格式),进度日志到 stderr

运行时:`python3 script.py > output.json 2>/tmp/script.log`

不要用 `2>&1` 或 `tee`,否则 stderr 进度条会混入 JSON。

⚠️ signal_generator.py 特殊注意(2026-06-05 重大修正:根因是 stderr 丢弃):

旧说法"首次运行产生0字节文件,重试一次即可"在 2026-06-05 午后研判实测中被推翻——连续 3 次 `python3 signal_generator.py 2>/dev/null > /tmp/signal_raw.txt` 都产生 0 字节(exit_code=1),前台 `python3 signal_generator.py 2>&1 | head -50` 一次就成功输出 7KB+ JSON。

根因: signal_generator.py 把进度日志("分析沪金期货…"、"分析 华安黄金ETF联接A…"等)写 stderr,stdout 在 stderr 缓冲 flush 之后才输出。把 stderr 丢到 `/dev/null` 会让 stdout 缓冲永远不 flush,写入 0 字节就退出了。

正确做法(已验证,4 个脚本通用——em_client/news_scanner/signal_generator/institutional_scanner):

“`bash

❌ 错误:stderr 丢到 /dev/null 触发 0 字节

python3 signal_generator.py 2>/dev/null > /tmp/signal_raw.txt

✅ 正确:stderr 重定向到真实日志文件

python3 ~/.hermes/scripts/finance/signal_generator.py 2>/tmp/signal_err.log > /tmp/signal_raw.txt

ls -la /tmp/signal_raw.txt # 必非0字节

wc -c /tmp/signal_raw.txt # 验证大小

“`

底层原理: 任何"日志到 stderr、JSON 到 stdout"的脚本都不能用 `2>/dev/null`,必须给 stderr 一个真实文件。前台 tty 自动 flush,background 模式下 stderr 缓冲是阻塞点——所以同样的脚本前台能跑、background 必坏。`2>/tmp/script.log` 既保留排查日志又保证 stdout 顺利 flush。

排查路径(如果重定向后仍 0 字节):

“`bash

python3 ~/.hermes/scripts/finance/signal_generator.py 2>/tmp/signal_err.log

看 stderr 实际输出判断是 PTY 问题还是脚本本身 bug

“`

已部署模板修订(2026-06-05): 12:30 5 进程模板里的 `2>/dev/null` 全部应改为 `2>/tmp/<name>_err.log`(如 `2>/tmp/em_err.log`、`2>/tmp/news_err.log`)。

⚠️ 脚本超时注意事项
  • em_client.py 优化后通常15-30秒完成(sleep时间从23.7秒减少到6.2秒),60秒超时足够。
  • news_scanner.py v4.0优化后通常20-40秒完成(并行采集+超时控制),60秒超时足够。
  • signal_generator.py 通常15-30秒完成。
  • institutional_scanner.py 通常10-30秒完成(已优化)。
⚠️ 所有脚本输出解析(重要)

所有数据采集脚本(em_client.py、signal_generator.py、institutional_scanner.py、news_scanner.py)的输出都包裹在 `—JSON_DATA_START—` 和 `—JSON_DATA_END—` 标记中,不是纯JSON,不能直接用 `json.loads()` 解析。

并行执行模式(已验证可用): 3个数据采集脚本可用`terminal(background=true, notify_on_complete=true)`并行启动,ttfund API curl调用可同步执行(不依赖脚本输出)。用`process(action='poll')`或`process(action='wait')`等待脚本完成。总执行时间约30-60秒。

⚠️ `process(action='wait', timeout=90)` 实际被clamp到60秒(2026-06-02 实测,返回 `"timeout_note": "Requested wait of 90s was clamped to configured limit of 60s"`)。对策: 设 `timeout=60` 拿够时间,或用 `action='poll'` 循环短轮询。如果脚本运行>60s需要 `notify_on_complete=true` 在后台等待。

正确解析方法: 使用 `execute_code` 工具(不是 terminal pipe):

“`python

在 execute_code 中:

import json, re

with open('/tmp/em_raw.txt') as f:

raw = f.read()

m = re.search(r'—JSON_DATA_START—\s*\n(.*?)\n—JSON_DATA_END—', raw, re.DOTALL)

data = json.loads(m.group(1))

然后访问 data['indices'], data['northbound'], data['fund_rankings'] 等

“`

采集+解析两步流程:

  1. `terminal`: `python3 ~/.hermes/scripts/finance/em_client.py 2>/tmp/em_err.log > /tmp/em_raw.txt` ← 注意 stderr 必须重定向到真实文件
  2. `execute_code`: 用上述正则提取JSON,再按需访问各字段

禁止的操作(会被沙箱 approval_required 拦截):

  • ❌ `python3 script.py | python3 -c "…"` — pipe到python -c被拦截
  • ❌ `python3 script.py | sed '…'` — pipe到sed被拦截
  • ❌ `python3 script.py | head -c N` — 部分pipe被拦截
  • ❌ 直接用urllib访问push2.eastmoney.com — 远端断开连接(RemoteDisconnected)
  • ❌ `python3 script.py 2>/dev/null > /tmp/x.txt` — 触发 0 字节 bug(见 signal_generator 特殊注意)

可用的操作:

  • ✅ `python3 script.py 2>/tmp/script_err.log > /tmp/file.txt` — stderr 到文件 + stdout 重定向,OK
  • ✅ `execute_code` 中用 `open()` 读取文件
  • ✅ 各脚本独立运行(不pipe)
em_client.py 主要字段(top-level keys)

`timestamp, version, focus, gold_domestic, gold_etf, gold_fund_ranking, gold_market_skill, fund_rankings, fund_estimates, fund_nav_analysis, bond_market, index_quote, industry_sectors, market_fund_flow, northbound, indices, us_market, commodities, macro`

注意:`industry_sectors`、`market_fund_flow`、`northbound` 在非交易时段或限流时可能返回 `null`。

`market_fund_flow` 实际shape(2026-06-02 实测): 交易日返回list of dict `[{日期, 主力净流入, 超大单净流入, 大单净流入}]`(通常1条),金额单位亿元。北向资金同日返回 dict `{"沪股通净流入": NaN, "深股通净流入": 0, "北向合计": NaN, "更新时间": "2026-06-01", "数据来源": "历史", "备注": "非交易时段使用历史数据"}`——NaN是非交易时段特征,不要当成错误,报告中说明"非交易时段数据"即可。

indices 字段名注意: 各指数返回 `收盘`(收盘价)和 `5日涨跌%`,不是 `price` / `change_pct`。

industry_sectors 字段名: `板块名称`、`涨跌幅`、`换手率`、`上涨家数`、`下跌家数`、`领涨股`、`领涨涨幅`。

sector_fund_inflow/outflow 字段名: `板块名称`、`主力净流入`、`主力净占比`、`超大单净流入`、`大单净流入`。

news_scanner.py priority_news 结构: 是 dict(key: `gold_related`/`fund_related`/`macro_related`),不是 list。每个 value 是 list of dicts。

⚠️ 金十数据 (jin10) 新闻 title 是 Python repr 字符串陷阱: 2026-06-02 实测发现 jin10 flash 推送的 `title` 字段有时是 `"{'vip_title': '…', 'content': '', 'lock': True, 'vip_level': 1, 'vip_desc': '…'}"` 这种字符串(不是真嵌套 dict),导致 `for n in news[:3]` 在 `news` 实际是 dict 时直接 TypeError。清洗代码模板:

“`python

import re as _re

title = n.get('title', '')

if title.startswith('{'):

m = _re.search(r"'vip_title':\s*'([^']+)'", title)

if m: title = m.group(1)

“`

另外金十时间字段有两种格式:`"2026-06-02 11:51:19"` 字符串 或 Unix 戳(秒级 `1780972444` = 2026-06-09 09:14:04,不是毫秒)。读取时 `isinstance(time, (int, float))` 判断后直接 `datetime.fromtimestamp(int(time))` 即可。不要乘以1000当毫秒处理,否则会得到 year=58406 out of range 错误(2026-06-09 12:30 实测踩坑)。`news_scanner.py` 输出的 `news` 字段本身是 dict `{"items": […]}` 不是 list(来自 `gold_market_skill.body.data.news.items`)。

fund_rankings 字段名: `基金代码`、`基金名称`、`单位净值`、`日涨幅%`、`近1周%`、`近1月%`、`近3月%`、`近6月%`、`近1年%`。按类型分:`股票型`、`混合型`、`债券型`、`指数型`、`QDII`,每类各10只。

institutional_scanner.py 输出结构:

  • `block_trades`: dict, keys=`block_trades`(list), `block_trade_stats`(list)
  • `dragon_tiger`: dict, keys=`lhb_detail`(list), `institutional_lhb`(list)
  • `institutional_research`: dict, keys=`research_visits`(list), `research_count_7d`(list), `research_stats`(list)
  • `shareholder`: dict, keys=`shareholder_changes`(list), `pledge_overview`(list), `high_pledge_risk`(list)
  • `northbound`: dict, keys=`northbound_hist`(list)。注意:`当日成交净买额`等资金字段近期返回NaN,仅`领涨股`和`沪深300`数据可靠。

signal_generator.py 输出结构:

  • keys: `timestamp`, `version`, `focus`, `summary`, `buy_signals`, `sell_signals`, `conflict_signals`, `detailed`
  • `summary`: dict with `items_analyzed`, `buy_signals`(count), `sell_signals`(count), `strong_buy`, `strong_sell`, `conflict_signals`(count)
  • `buy_signals`/`sell_signals`: list of dicts with `name`, `price`, `pct_change`, `type`, `strength`, `source`, `desc`
  • `conflict_signals`: list of dicts with `name`, `buy_signals`, `sell_signals`, `final_signal`, `note`
  • `detailed` 字段(2026-06-02 午后研判实测的回归): 9个标的里有2个 (`沪金主力(AU0)`, `华安黄金ETF(518880)`) 全字段返回 `_error: "数据获取失败"`,`signals=[]` 且 `indicators={}`。v3.0 的"沪金期货+黄金ETF技术面分析"实际是坏的——MACD/KDJ/RSI/BOLL 单标的技术分析未真正落地。目前能信的只有 `buy_signals`/`sell_signals`/`conflict_signals`(基于基金净值动量趋势,非技术指标)。需要技术面分析时改用 ttfund `FUND_HUAAN_GOLD_INFO` 的 `au9999` / `au_td` / `gold_futures_shfe` open/close/high/low 手算均线/MACD,或外接行情 API,不要依赖 signal_generator 的 detailed 块。

gold_market_skill 结构: 嵌套较深。正确完整路径是 `em_client_output["gold_market_skill"]["data"]["raw_result"]["body"]["data"]["gold_quotes"]`(不是 `.body.data`,`gold_market_skill.body` 是个空 dict——em_client 把 ttfund 完整响应包了一层在 `.data` 里)。包含 `sge_benchmark`(上海金基准价), `au9999`, `au_td`, `gold_futures_shfe`, `central_bank_gold`。每项含`open/close/high/low/change_pct`等。央行数据含`trend`字段(增持/减持)和`recent_3m`近3月储备量。⚠️ `risk_indicators`在2026-05-29前是list(每项含`key`/`name`/`value.INDICATOR_VAL`),在2026-06-02实际响应中变成dict同时包含`vix`/`exchprice`/`dxy`三个扁平键 + 内嵌`items`数组,两种shape都要兼容。`sge_benchmark`用`morning_price/evening_price`不是`open/close`。`central_bank_gold`带`is_stale:true`和`freshness_days:62`——央行月度数据经常滞后2个月,报告里要点明"4月数据"避免误导。同样的 `.data.raw_result.body.data` 路径适用于所有 em_client 嵌套的 ttfund 技能(`bond_market` / `gold_theme` / `huoqibao` 在 em_client 中都是空壳,实际数据需走 `data.raw_result.body.data` 或单独 curl ttfund 网关)。

indices 字段名注意: `index_quote`中各指数返回 `收盘`、`涨跌幅%`、`涨跌点`、`今年以来%`;顶层`indices`字段返回 `收盘` 和 `5日涨跌%`。`indices` 是 dict(key=指数名如"上证指数"/"沪深300"),不是 list,不能 `indices[:5]` 切片(2026-06-09 12:30 实测触发 TypeError,正确遍历用 `for k, v in indices.items()`)。

⚠️ `gold_domestic` / `gold_etf` / `fund_estimates` 字段名陷阱(2026-06-02 午间速报实测): SKILL.md 之前没说清楚这三个字段的实际 shape 与字段名,整理如下:

  • `gold_domestic` 是 dict(key=`沪金主力`/`沪银主力`),每项只有 `价格` 和 `涨跌幅` 两个字段,没有 open/close/high/low。要 high/low/change_pct 必须从 `gold_market_skill.body.data.gold_quotes.au9999` 拿。
  • `gold_etf` 是 dict(key=名称如"华安黄金ETF"),不是 list。每项字段:`代码`/`名称`/`最新价`/`涨跌幅`/`最高`/`最低`/`开盘`/`昨收`/`成交量`/`成交额`(不是 `price`/`change_pct`/`high`/`low`)。
  • `fund_estimates` 字段:`基金代码`/`基金名称`/`单位净值`/`估算值`/`估算涨跌幅%`/`估值时间`/`分类`(不是 `估算净值`/`估算涨幅%`)。`分类` 取值 `黄金`/`债券`/`混合`/`指数`。
  • `industry_sectors` 的 `领涨股` 字段值是股票代码不是名称,要展示中文名需另查(em_client 的个股行情接口),或干脆不展示名称。
  • ttfund 直接 curl `FUND_INDEX_INFO` 返回的字段是英文 key:`current_point`/`change_pct`/`change_point`/`ytd_return`/`turnover_amount`(不是 `收盘`/`涨跌幅%`/`涨跌点`/`今年以来%`)。`em_client.index_quote` 是脚本已经重命名后的版本。

fund_nav_analysis 结构: 是dict,key为基金名称(如`华安黄金ETF联接A`),value含`最新净值`、`近1月收益%`、`净值走势`(数组,每项含`日期/单位净值/累计净值/日涨跌幅%`)。

📖 **决策框架 v1.0:美元-利率二维象限 × 3 级预警**(4 象限定位 + L1/L2/L3 警报 + 5 类对冲工具 + 5 条退出红线)见 `references/decision-framework-v1-quadrant-alert.md`。22:30 夜间复盘 prompt v4.4 起**每晚自动落地**该框架的"象限+警报+配置"三段(必填)。

📖 完整ttfund API响应结构见 `references/ttfund-api-response-structures.md`(含FUND_HUAAN_GOLD_INFO、FUND_HUOQIBAO_LIST、FUND_THEME_INFO、BOND_MARKET的完整嵌套路径和字段类型说明)。

📖 **2026-06-02 实测shape漂移**(`risk_indicators`从list变dict、`central_bank_gold`新增`is_stale`、金十title是Python repr字符串、process() 60秒clamp等)见 `references/live-response-shapes-2026-06.md`。
📖 **2026-06-02 午间速报现场字段速查**(`gold_domestic`/`gold_etf`/`fund_estimates`/`industry_sectors` 实际字段名 + 字段对照表 + 报告推荐展示组合)见 `references/live-response-shapes-2026-06-02-noon.md`。
📖 **2026-06-02 午后研判实测**(FUND_THEME_INFO/BOND_MARKET/FUND_HUOQIBAO_LIST 完整字段、FUND_HUAAN_GOLD_INFO 全 5 项 gold_quotes 速查、并行采集5进程模板、午后研判报告结构模板、已验证"不能用"清单)见 `references/live-response-shapes-2026-06-02-pm.md`。
📖 **报告渲染与飞书 PDF 投递 pipeline**(双渲染路径、LLM JSON 契约、已部署 4 个 no-agent 任务清单、关键陷阱)见 `references/report-rendering-pipeline.md`。
📖 **2026-06-04 午间速报 5 进程模板与报告 6 块结构**(5 进程启动命令、文件大小预期、字段 fallback 路径速查、输出位置、已知陷阱)见 `references/noon-flash-workflow-2026-06-04.md`。
📖 **2026-06-05 14:30 午后研判实测**(signal_generator.py 0字节问题根因修正 / 5 进程采集模板 / FUND_THEME_INFO 同义词陷阱 / 报告 5 块结构 / CPO芯片算力齐跌时的报告语调)见 `references/afternoon-research-workflow-2026-06-05.md`。
📖 **2026-06-09 8:00 晨报实测**(8 进程采集模板 / 8:00 vs 22:30 框架定位差异 / 数据基准日处理 / CPO PE 99.6% 减仓案例)见 `references/morning-brief-workflow-2026-06-09.md`。
🎨 **报告 HTML 模板**(深色卡片 + sparkline + gauge + A 股红涨绿跌配色)见 `templates/report_template.html`。
股票池注意事项
  • `000001` 是平安银行(金融),不是科技股
  • 个股行情接口返回的"股票代码"列是代码不是名称,需手动传入name参数
  • 每次只跑28只以内,超过会被限流
覆盖板块(灵活配置视角)
核心主线(重点推送 + 详细分析)
板块 重点标的 关注指标
**CPO/光模块** 中际旭创(300308)、新易盛(300502)、天孚通信(300394)、光迅科技(002281)、亨通光电(600487) 800G/1.6T出货、ASIC需求、海外云厂商capex
**半导体/芯片** 中芯国际(688981)、北方华创(002371)、韦尔股份(603501)、澜起科技(688008)、圣邦股份(300661)、兆易创新(603986) 国产替代、先进制程、存储价格、AI芯片
**AI算力/数据要素** 海光信息(688041)、寒武纪(688256)、紫光股份(000938)、浪潮信息(000977) 国产替代订单、大模型训练集群
**科技综合** 海康威视(002415)、京东方A(000725)、科大讯飞(002230) 研发投入、订单可见度
底仓配置(防御+稳健)
板块 重点标的 关注指标
**红利基金/低波** 中证红利ETF(515080)、红利低波ETF(512890)、红利机会LOF 股息率、分红可持续性、估值分位
**债券/现金** 30年国债ETF(511090)、短债基金、活期宝 利率走势、信用利差、流动性
对冲参考(仅在主线过热/风险释放时关注)
板块 重点标的 关注指标
黄金 沪金AU0、黄金ETF(518880) 美元指数、地缘风险(仅作对冲参考)
信号体系
单指标信号
信号 类型 强度 触发条件
MACD金叉 BUY STRONG(低位)/MEDIUM DIF上穿DEA
MACD死叉 SELL STRONG(高位)/MEDIUM DIF下穿DEA
KDJ金叉 BUY STRONG(K<30)/MEDIUM K上穿D
KDJ死叉 SELL STRONG(K>70)/MEDIUM K下穿D
RSI超卖 BUY STRONG(<25)/MEDIUM(<30) RSI极低
RSI超买 SELL STRONG(>75)/MEDIUM(>70) RSI极高
布林下轨 BUY MEDIUM 价格<下轨
布林上轨 SELL MEDIUM 价格>上轨
放量上涨 BUY MEDIUM 量比>2且涨
放量下跌 SELL MEDIUM 量比>2且跌
均线多头 BUY WEAK MA5>MA10>MA20
均线空头 SELL WEAK MA5<MA10<MA20
共振信号(最高价值)
信号 强度 条件
MACD+KDJ双金叉 STRONG_BUY 两指标同时金叉
MACD+KDJ双死叉 STRONG_SELL 两指标同时死叉
J值超卖+RSI超卖 STRONG_BUY J<0且RSI<25
J值超买+RSI超买 STRONG_SELL J>100且RSI>75
数据采集脚本
1. 东方财富+天天基金直连客户端(主力,优先运行)v4.0(优化版)

“`bash

python3 ~/.hermes/scripts/finance/em_client.py 2>/tmp/em_err.log > /tmp/em_raw.txt

“`

直接调用东方财富push2 API + 天天基金API,绕过AKShare限流。

优化版特性:

  • 超时优化:http_get超时时间从15秒减少到10秒,重试次数从3次减少到2次
  • sleep优化:总sleep时间从23.7秒减少到6.2秒,提高执行效率
  • 北向资金备用数据源:非交易时段使用历史数据,避免返回null
  • 板块资金数据修复:修复资金字段字符串转数字错误

重点增强: 黄金专题(国内金价/黄金ETF/黄金基金排行)、基金专题(全类型排行/重点基金估值/净值走势分析)、天天基金技能API集成。

天天基金 rankhandler.aspx 解析要点:

  • 返回的是JS变量赋值(`var rankData = {…};`),不是纯JSON
  • 不能用 `json.loads()` 解析,必须用正则提取datas数组:`re.search(r'datas:\[(.+?)\]', data)` + `re.findall(r'"([^"]+)"', …)`
  • 字段用逗号分隔:code,name,shortcode,date,unitNAV,accNAV,dayReturn%,weekReturn%,monthReturn%,3monthReturn%,6monthReturn%,1yearReturn%…
2. 市场扫描器(AKShare备用)

“`bash

python3 ~/.hermes/scripts/finance/market_scanner.py 2>/tmp/mkt_err.log > /tmp/mkt_raw.txt

“`

A股指数、美股指数、大宗商品(沪金/沪银/原油/螺纹钢/铁矿石)、融资融券、北向资金历史。

3. 新闻扫描器 v4.0(基金+黄金专版,优化版)

“`bash

python3 ~/.hermes/scripts/finance/news_scanner.py 2>/tmp/news_err.log > /tmp/news_raw.txt

“`

7源新闻(财联社/东方财富/同花顺/新浪/金十/巨潮/证监会)+ 宏观数据(CPI/PPI/PMI/LPR/M2/社零/贸易差额)+ 龙虎榜。

优化版特性:

  • 并行采集:使用ThreadPoolExecutor并行采集7个新闻源,提高效率
  • 超时控制:设置30秒总超时,15秒单源超时,避免长时间阻塞
  • 增强关键词:扩展黄金/基金/宏观关键词库,提高相关性
  • 改进去重逻辑:基于标题前40字符+内容前100字符去重,提高质量
  • 优化排序:按优先级和时间排序,支持字符串/数字类型混合
  • 自动分类输出:黄金相关/基金相关/宏观相关新闻,每类最多20条
4. 信号生成器 v3.0(基金+黄金专版)

“`bash

python3 ~/.hermes/scripts/finance/signal_generator.py 2>/tmp/signal_err.log > /tmp/signal_raw.txt

“`

从股票技术分析转向基金+黄金分析: 沪金期货/黄金ETF技术面分析 + 重点基金净值动量信号。

分析黄金MACD/KDJ/RSI/BOLL/均线,基金净值趋势/动量/波动率。

5. 机构资金扫描器

“`bash

python3 ~/.hermes/scripts/finance/institutional_scanner.py 2>/tmp/inst_err.log > /tmp/inst_raw.txt

“`

融资融券、大宗交易、龙虎榜(机构买卖+营业部排行)、机构调研、股东增减持、股票质押风险、限售解禁、北向资金持股明细。

6. 基金推荐与黄金配置顾问(新增)

“`bash

python3 ~/.hermes/scripts/finance/fund_advisor.py 2>/tmp/advisor_err.log > /tmp/advisor_raw.txt

“`

基于市场数据+基金排行+风险评估,提供个性化基金+黄金配置建议。

  • 黄金市场分析(沪金价格、黄金ETF表现)
  • 全类型基金推荐(黄金主题/债券稳健/混合平衡/指数成长)
  • 配置建议生成(黄金15-40%、债券30-40%、混合/指数20-30%、现金10%)
  • 优质基金清单(每类前3)
6. 妙想金融数据(东方财富权威数据库)

“`bash

cd ~/.hermes/skills/mx-data && python3 mx_data.py "查询贵州茅台最新行情"

cd ~/.hermes/skills/mx-search && python3 mx_search.py "半导体行业最新消息"

cd ~/.hermes/skills/mx-xuangu && python3 mx_xuangu.py "市盈率低于20的半导体股票"

“`

需设置环境变量 `MX_APIKEY`。输出到 `/root/.openclaw/workspace/mx_data/output/`。

输出格式
晨报(8:00)

外盘回顾 → A股展望 → 板块研判(逐一分析6大板块)→ 资金面 → 信号提醒 → 重要资讯 → 操作建议

⚠️ 8:00 关键陷阱:周日/节假日/早盘前数据处理(2026-06-08 周日实测)

  • 8:00 cron 每天触发,但周日、节假日 A股全天不开盘——em_client 拿到的指数/板块/资金/北向/基金估值 = 最后一个交易日数据(周五或上一个交易日)
  • 报告第一行必须明确数据基准日(与 22:30 同模式):例如 "今日为周日休市日,以下数据均为上周五(2026-06-05)A股收盘 + 周末海外要闻"
  • 报告语调从"今日开盘展望"切到"周一开盘展望"——重点是周末海外催化(美股/海外科技/英伟达等)+ 周一 A 股应对策略
  • 美股数据 = 上一个交易日(周五)收盘(周日 8:00 美股周末无交易,脚本只取前一个交易日)
  • 黄金(沪金/沪银)期货、`au9999`/`gold_futures_shfe.date` 同样是周五日期
  • 行业板块 `industry_sectors` / `market_fund_flow` / `fund_estimates` 在周日返回周五数据,不要把"周五涨跌"当成"今日涨跌幅"
  • 8:00 早盘前(即使工作日)也常见 `gold_etf={}` + `gold_domestic.*.涨跌幅=0`——属正常模式,fallback 到 `gold_market_skill.body.data.gold_quotes`(详见 2026-06-03 条目11)
  • CPO/芯片/算力三大主题齐跌 ≥ 3.5%:报告语调切到"主力资金获利兑现"(参考 22:30 条目5 + 14:30 关键要点),主线仓位降至 40-45%,不主动抄底
  • JSON 块加 `data_basis` 字段 + `is_weekend: true` 标记
  • ⚠️ 8:00 prompt 模板仍写 `2>/dev/null`(已过时)——按 SKILL.md #17 修正方案应改为 `2>/tmp/em_err.log` + `2>/tmp/news_err.log`,避免 0 字节 bug
  • 8:00 vs 22:30 周末处理差异:8:00 报告应同时包含"周五复盘"和"周一开盘策略"两部分,22:30 只需"周五复盘 + 周一展望"(已收盘后)
午间速报(12:30)

上午行情 → 板块TOP5 → 资金动向 → 热点概念 → 信号更新 → 消息面 → 下午建议

⚠️ 午间速报执行要点(2026-06-04 12:30 实测,5进程模板):

  • 5个后台进程并行启动(`terminal(background=true, notify_on_complete=true)`):

1. `python3 ~/.hermes/scripts/finance/em_client.py 2>/tmp/em_err.log > /tmp/em_raw.txt`

2. `python3 ~/.hermes/scripts/finance/news_scanner.py 2>/tmp/news_err.log > /tmp/news_raw.txt`

3. `curl … FUND_HUAAN_GOLD_INFO query_scope="all" > /tmp/gold_raw.json`

4. `curl … FUND_INDEX_INFO index_id="沪深300" query_scope="all" > /tmp/index_hs300_raw.json`

5. `curl … BOND_MARKET > /tmp/bond_raw.json` ← 之前 SKILL.md 漏了这个

  • `process(action='wait', timeout=30~60)` 等待全部完成(实测 < 40s)
  • 1个 execute_code 解析所有 5 个文件,总耗时约 30-40 秒
  • 解析时按 6 块构造(黄金/指数/基金/债市/快讯/建议),每块单独 print 一段方便定位
  • `fund_estimates` 字段名陷阱:用 `估算值`/`估算涨跌幅%`/`分类`(不是 `估算净值`/`估算涨幅%`)
  • `gold_etf` 12:30 仍可能为空 dict(2026-06-04 实测),用 `gold_market_skill.body.data.gold_quotes.{au9999, au_td, gold_futures_shfe}` fallback
  • 完整执行步骤、文件大小预期、报告 6 块结构模板见 `references/noon-flash-workflow-2026-06-04.md`
报告美化与 PDF 投递(飞书 Drive)

飞书消息在 30KB 以上会被折叠/截断,本技能 4 个报告的 markdown 输出普遍 30-60KB,移动端阅读体验差。解决方案是把 LLM 输出的 markdown 渲染成深色卡片式 PDF,上传到飞书 Drive 后以 file 消息形式推送。

架构(paired LLM + no-agent cron jobs):

“`

LLM 任务 (08:00/12:30/14:30/22:30)

↓ 写 ~/.hermes/cron/output/<job_id>/<timestamp>.md

no-agent 任务 (08:03/12:33/14:33/22:33)

↓ post_process_<jobid>.sh 读最新 .md

↓ publish_wordpress.py 调 render_report.py → weasyprint → .pdf

↓ WP API 上传 PDF 当 featured media + 发布深色 HTML 文章

↓ post_process.py 上传 PDF 到飞书 Drive + 发送 file 消息(仅夜间复盘任务跑这条路径)

“`

⚠️ 渲染管线 v4.2 实装(2026-06-05 修复): 之前 `render_template()` 是空壳只填 4 个变量、`{{REPORT_BODY}}` 占位符没被替换、`post_process.py` 缺 `import re` 报 ImportError、4 个 wrapper 脚本中只有 1 个存在导致 WP 路径实际从未跑通——5 个 bug 一次修完。详见 `references/report-rendering-pipeline.md`。

⚠️ 渲染管线 v4.7 实装(2026-06-10 00:30 优化): 飞书文档无占位策略实现,彻底消除表格前的"📊 数据表格"文字。关键技术:

  • anchor 识别:H1/H2/H3/Divider 之后紧跟表格时,自动标记该 heading 为 table_anchor,anchor_idx 指向其在 blocks 列表中的位置
  • 三阶段写入:(1) 批量写所有非表格 blocks;(2) 取文档 children 找到 anchor 真实 index;(3) 反向遍历 tables,从最后往前插到 anchor_idx+1 位置(反向保证前面 anchor 索引不被破坏)
  • md_to_blocks 签名变更:返回 `(blocks, tables)` tuple,blocks 不再混入 __table__ 占位 dict
  • 优势:表格紧跟 H2/H3 标题,文档视觉完全干净,无任何"数据表格/省略/续表"占位字样
  • 实测:财经晨报 71 blocks + 11 tables、午间速报 84 blocks + 13 tables、夜间复盘 127 blocks + 12 tables 全部无占位
  • 4 个 wrapper 升级为三通道(WP → 飞书 PDF → 飞书文档),每步独立 try,exit 取最严重。详见 `references/post-process-wrapper-fix-2026-06-09.md`。
  • `references/feishu-docx-publish-pipeline.md` — 飞书 Docx API 速记、block 映射、表格降级局限、env 加载
  • `references/post-process-wrapper-fix-2026-06-09.md` — v4.4 解耦 + v4.5 三通道 wrapper 终态
  • `references/wp-publish-failures-2026-06-11.md` — 6/11 晨报 silent WP + docx 乱码事件:4 个 bug 集中归档(html NameError / WP_APP_PASSWORD 注入 / raw JSON 段泄漏 / docx 补发模式 + wrapper 改造 diff + Recovery 配方)

⚠️ 渲染管线 v4.7 实装(2026-06-09 23:55 优化): 飞书 Docx 通道增加生产级 retry + 空 body 防御(v4.6 大文档 14 表格场景实测 0-5% cell 写入偶发空 body):

  • 3 次重试 + 指数退避:cell 写入 0.3s/0.6s/0.9s,table 创建 0.5s/1.0s/1.5s
  • 空 body 识别:`r.json()` 失败时不立即报错,标记为 transient 失败进入下次重试(block 通常已 server-side 创建)
  • 永久错误码跳过重试:`1770001 invalid param` 等参数错误立即终止(不是 transient)
  • per-cell 成功跟踪:4 个 wrapper 跑完 12+ 表格 108 cells,零实际失败,重试补救了所有偶发空 body
  • v4.6 简化版占位策略仍保留:每张表前一个 `📊 数据表格 N×M` text 作为视觉锚点(不是 placeholder 残留,是有意保留的 section title)
  • 完整生产级 API 速记 + 4 个 critical gotchas + 实现参考 `references/feishu-docx-publish-pipeline.md`(已升级为 v4.7)
  • class-level 实战知识(任何飞书 Docx 用户都受益)已抽到 `rich-report-rendering` umbrella skill 的 `references/feishu-docx-api-field-notes.md`(端点速查表 + block 构造模板 + 4 个 gotcha + retry 模式 + card 消息格式)

⚠️ 渲染管线 v4.8 实装(2026-06-11 用户反馈 docx 末尾出现 raw JSON 段): 飞书 Docx 必须过滤 `—REPORT_JSON_START—` … `—REPORT_JSON_END—` 段:

  • 根因:`feishu_doc_publish.py` 的 `md_to_blocks()` 之前只挡表格占位和空行,没挡 raw JSON 段——该段是 PDF 图表渲染器消费的数据契约(`render_report.py` 从这抽字段画 sparkline/gauge/三色 action 卡),人眼路径不该看
  • 修法:`md_to_blocks()` 入口加一行 `re.sub(r"^—\s*REPORT_JSON_START—.*?^—\s*REPORT_JSON_END—\s*$", "", md, flags=re.DOTALL | re.MULTILINE)`
  • 影响:所有 4 个 cron 报告的 .md 末尾都带这个段(晨报/午间/午后/夜盘)——v4.8 之前飞书 docx 都有这个泄漏,PDF 路径不受影响(render_report 自己解析)
  • 完整诊断 + 6/11 事件 4 个 bug 集中归档(html NameError / WP_APP_PASSWORD 注入 / raw JSON 段泄漏 / docx 补发模式)见 `references/wp-publish-failures-2026-06-11.md`

⚠️ 用户显示偏好 (2026-06-09 23:30 明确表态): "飞书聊天报告不要有 ###、、— 这些符号" / "做成飞书文档发给我"。所有 cron 报告的飞书交付必须以 Docx 为主入口,PDF 兜底,禁止继续把 100KB+ 的 LLM final response 当聊天消息直推**。

双渲染路径(详见 `templates/report_template.html` + `scripts/render_report.py`):

  1. 有 JSON 块(`—REPORT_JSON_START—` … `—REPORT_JSON_END—`)→ 用完整卡片模板(黄金 sparkline、估值分位 gauge、操作建议三色 action 卡)
  2. 无 JSON 块(降级路径)→ 只取 `## Response` 之后内容(避免把 SKILL/prompt 全文塞进报告),提取模板 CSS + 智能 markdown 解析:自动给 `+X.XX%`/`-X.XX%` 数字上 A 股配色(红涨绿跌),无需 LLM 配合

关键文件:

  • 模板:`~/.hermes/skills/finance/financial-advisory/templates/report_template.html`(~4KB 深色卡片+渐变头+sparkline+gauge + `{{REPORT_BODY}}` 占位符)
  • 渲染:`~/.hermes/scripts/finance/render/render_report.py`(双路径 + 5 个区块生成器 + weasyprint → PDF)
  • WP 渲染+发布:`~/.hermes/scripts/finance/render/publish_wordpress.py`(调 `render_report.py` 拿 PDF+深色 HTML,HTML 当 WP 文章内容,PDF 当 featured media)
  • 飞书投递:`~/.hermes/scripts/finance/render/post_process.py`(找最新 .md → 渲染 → 飞书 `/im/v1/files` + `/im/v1/messages`)
  • 4 个 wrapper:`~/.hermes/scripts/finance/render/post_process_<jobid>.sh`(hardcode `JOB_ID`,调 `publish_wordpress.py`)—— 4 个必须都存在(2026-06-05 发现 3 个缺失导致 WP 报告从未真用深色卡片)

prompt 优化建议: 在 LLM 任务的 prompt 末尾追加"可选 JSON 块"指令(在"⚠️ 免责声明"前插入)。字段命名必须严格匹配 `render_report.py` 中的 `render_*_block()` 签名:

  • `gold.sge_benchmark.{price, change_pct}` / `gold.au9999.{close, change_pct}` / `gold.etf_avg.{price, change_pct}` / `gold.central_bank.{holdings, trend}` / `gold.macro.{dxy, vix, us10y, cn10y}`
  • `indices[]: {name, price, change_pct, pe_ttm, pe_percentile}`(`pe_percentile` 是 0-100 数字)
  • `sectors[]: {name, change_pct}`(取前 4 个进卡片)
  • `funds_top[]` / `funds_bottom[]: {code, name, change_pct, category}`
  • `news[]: {tag, title}`(tag 含 黄金/CPO/芯片/AI/红利/宏观 关键词,渲染器按 tag 自动配色)
  • `actions[]: {type, badge, title, reason, suggestion}`(`type` 必传 `buy`/`hold`/`sell`,决定卡片左边框颜色 + icon:↑ 买 / ◆ 持 / ↓ 卖)

⚠️ jobs.json 字段名陷阱: 文件存的是 `id`(不是 `job_id`),但 `cronjob(action='list')` API 返回时映射成 `job_id`。直接读写 jobs.json 用 `j['id']`,list 出来的 jobs 用 `j['job_id']`。

⚠️ Feishu IM file 消息 content 字段必传 JSON 字符串(2026-06-05 实测踩坑):

“`python

✅ 正确

payload = {

"receive_id": chat_id,

"msg_type": "file",

"content": json.dumps({"file_key": file_key, "file_name": "report.pdf"}), # ← 必须 json.dumps()

}

❌ 错误(会返回 code 9499 "Invalid parameter type")

payload = {

"content": {"file_key": file_key, "file_name": "report.pdf"} # ← 嵌套对象

}

“`

Feishu `/im/v1/messages` 的 `content` 字段是字符串化的 JSON,不是嵌套对象。

飞书 API 速记:

  • 上传文件:`POST /im/v1/files` (multipart, `file_type=pdf`)
  • 发 file 消息:`POST /im/v1/messages` (msg_type=file, content=json.dumps({file_key, file_name}))
  • 必传 header:`Authorization: Bearer <tenant_access_token>`(从 `/auth/v3/tenant_access_token/internal` 拿)
  • HTML 文件在飞书 IM 中只显示为源代码,必须转 PDF 才能预览
  • 投递需要 `FEISHU_APP_ID`/`FEISHU_APP_SECRET` 环境变量(execute_code 沙箱不继承 env,飞书上传必须用 `terminal()` 跑 Python,不要用 execute_code)

已部署 4 个 no-agent 推送任务: f77695c488f0 / 0cfd303d6b4f / 7c15d0d7366a / 4673e057251b(22:30 是夜间复盘的 PDF 飞书推送;08:00/12:30/14:30 是深色卡片版 WP 发布)

📖 **2026-06-09 12:30 午间速报周二实测**(金十时间戳秒级修正 / indices 是 dict / sge_benchmark None / us10y null / L2 黄预警实战案例)见 `references/noon-flash-workflow-2026-06-09.md`。
📖 **2026-06-09 14:30 午后研判周二实测**(5 进程模板验证 / risk_indicators us10y 第三种 null 状态 / 半导体加仓 vs CPO 减仓 PE 分位实战 / 黄金双口径冲突 / 主线切换决策框架)见 `references/afternoon-research-workflow-2026-06-09.md`。
午后研判(14:30)

全天预判 → 板块轮动 → 建仓/加仓/减仓/清仓信号汇总 → 明日展望

14:30 关键要点(2026-06-05 + 2026-06-09 二次验证):

  • 采集模板:em_client + signal_generator + FUND_THEME_INFO(query=同义词) × 2 + BOND_MARKET(5 进程)
  • FUND_THEME_INFO 同义词:`CPO光模块` ❌ → `光模块` ✅;`半导体` ❌ → `芯片` ✅;`红利` ❌ → `FUND_INDEX_INFO index_id="中证红利"` 替代
  • PE 分位告警规则:分位 ≥ 95% 标"⚠️ 极高估建议减仓",80-95% 标"偏高谨慎加仓",< 50% 标"低估可加仓"
  • CPO/芯片/算力三大主题齐跌 ≥ 4%:报告语调切换为"主力资金获利兑现",主线仓位降至 40-45%,不主动抄底
  • 报告输出路径:`~/.hermes/cron/output/afternoon_research/<YYYYMMDD_HHMMSS>.json`
  • 完整工作流 + 报告 5 块结构见 `references/afternoon-research-workflow-2026-06-05.md`
  • 2026-06-09 14:30 实战更新(5 进程模板二次验证 / us10y 持续 null / 半导体加仓 vs CPO 减仓 PE 分位实战 / 黄金双口径冲突 / 14:30 prompt 仍写 2>/dev/null 待修)见 `references/afternoon-research-workflow-2026-06-09.md`
夜间复盘(22:30)

全天总结 → 资金复盘 → 信号复盘 → 夜盘(美股/黄金/原油)→ 晚间消息 → 明日展望

⚠️ 22:30 关键陷阱:周日/非交易日处理(2026-06-07 实测)

  • 22:30 cron 每天触发,但周日、节假日 A股全天不开盘——em_client 拿到的指数/板块/资金/北向/基金估值 = 最后一个交易日数据
  • 报告第一行必须明确数据基准日:例如 "今日为周日休市日,以下数据均为上周五(2026-06-05)A股收盘 + 本周日22:30美股盘中复盘"
  • em_client 的 `industry_sectors` / `market_fund_flow` / `fund_estimates` 在周日均返回周五数据,不要把"周五涨跌"当成"今日涨跌幅"
  • 美股数据 = 上一个交易日(周五)收盘,周日 22:30 美股盘中也拿不到(脚本只取前一个交易日)
  • 黄金(沪金/沪银)期货同样 = 周五收盘;`au9999`/`gold_futures_shfe.date` 字段会是 6-05
  • 央行黄金储备 = 上月数据(`is_stale: true, freshness_days: 67`),本就是滞后指标
  • 报告语调:周五 = "昨日复盘" + "周一开盘展望"(不是"今日复盘")
  • JSON 块加 `data_basis` 字段(如 `"data_basis": "2026-06-05(上周五)收盘 + 本周日22:30美股盘中"`)

⚠️ 22:30 采集模板(2026-06-07 实测 10 进程成功)

  • 5 个数据脚本 + 5 个 ttfund curl,全部 `terminal(background=true, notify_on_complete=true)` 并行启动,~30-50秒完成
  • 5 个脚本:em_client + news_scanner + signal_generator + (可选:institutional_scanner)
  • 5 个 ttfund curl:FUND_HUAAN_GOLD_INFO + FUND_THEME_INFO("光模块") + FUND_THEME_INFO("芯片") + FUND_FAVOR_ZX(zx_query) + FUND_HUOQIBAO_LIST(top_n=5)
  • 2 个可选 ttfund curl:FUND_INDEX_INFO(沪深300) + FUND_INDEX_INFO(中证红利)
  • 文件大小参考:em 380KB / news 48KB / signal 7KB / gold 12KB / theme_cpo 35KB / theme_chip 35KB / favor 35KB / huoqibao 4KB
  • 报告保存:`~/.hermes/cron/output/nightly_recap/<YYYY-MM-DD_HHMM>.md`(HHMM 用 22-30 格式,不要用其他时间戳命名,会被 22:33 的 no-agent 任务找不到最新文件)
  • 注意:用户 cron prompt 模板仍写 `2>/dev/null`(已过时),SKILL.md #17 修正方案 `2>/tmp/<name>_err.log` 已验证有效

⚠️ 22:30 报告 7 块结构(2026-06-07 定稿)

  1. 科技/CPO/芯片 复盘(主题表现+龙头股+周末催化)
  2. 红利底仓(中证红利/红利低波 + PE 分位)
  3. 指数总结(沪深300/中证500/上证50/创业板/科创50 + PE 估值)
  4. 基金复盘(股票型/指数型/QDII/债券型 TOP5)
  5. 自选基金动态(关键词匹配 6 大分类:半导体/机器人AI/海外/红利/电子传媒/黄金)
  6. 技术信号复盘(buy/sell/conflict 汇总 + 解读)
  7. 夜盘(美股 + 英伟达催化 + 22:30 实时情绪)
  8. 黄金(一行带过,仅作对冲参考)
  9. 晚间消息(科技/AI/政策优先 + 机构观点 + 海外宏观)
  10. 明日展望(5 大块操作建议:核心主线/底仓/AI算力/对冲/风险提示)
  11. 操作清单(一图速览 8 行 + 重要数据快照)
  12. JSON 块(含 data_basis 字段)
⚠️ execute_code空格吞并陷阱(2026-06-11晨报实测,阻断性 bug)
📖 **完整工作绕过手册**(触发模式表 + chr(32)代码模板 + shell拼接 + 检测信号)见 `references/execute-code-space-collapsing-workaround.md`。**所有4 个 cron任务的解析阶段第一步就该假设会撞这个 bug**,直接采用 chr(32) + list join + write_file .sh + bash 四连方案。

症状: 在 `execute_code`工具里写 Python 时,token之间的空格会被吞掉,典型失败模式:

  • `else0` 被合并成 `else0` → `SyntaxError: expected 'else' after 'if' expression`
  • `return0` 被合并成 `return0` → `IndentationError`
  • `def _cnt(v):` 后面的 `\n return0`缩进被吃 → `IndentationError`
  • shell 命令参数之间空格丢失:`python3 em_client.py2>/tmp/…`实际被解析成 `python3 em_client.py2`(找不到该文件)
  • `if cond:` 后面的缩进块整体丢失 →整段代码崩

根因: execute_code沙箱在序列化/反序列化 code 参数时,会把某些紧贴的「关键字 +空格 +数字/字符」组合中的 ASCII空格(U+0020)压缩掉。不是所有空格都吞,但 keyword-then-space-then-number(如 `else0`、`return0`、`py2>…`)命中率很高。复现规律:90%出现在 f-string、`with` 语句末尾、多行字符串拼接、`else`/`return`/`finally`关键字后。

触发场景示例(2026-06-11 实测踩坑10+ 次):

“`python

❌触发:被沙箱吞掉空格

n = len(v) if v is not None else0 # → SyntaxError

n = len(v) if (v is not None) else0 # → SyntaxError

cnt = len(v) if v else0 # → SyntaxError

def _cnt(v):

if v is None: return0 # → IndentationError

return len(v)

for name in names:

if os.path.exists(path): # →空格被吞

with open(path) as f: # → IndentationError

“`

shell同样触发:

“`

python3 ~/.hermes/scripts/finance/em_client.py2>/tmp/em_err.log > /tmp/em_raw.txt

#实际被解析为:python3 …/em_client.py2 (文件名 = "em_client.py2",找不到文件)

“`

✅修法1(最稳):用 `chr(32)`显式插入空格

“`python

space = chr(32)

script_lines = [

'with open("/tmp/em_raw.txt") as f:',

space*4 + 'raw = f.read()', # ← 用 chr(32)*4替代4 个普通空格

]

script = "\n".join(script_lines) + "\n"

“`

修法2:list拼接 + `' '.join()`

“`python

parts = ['python3', '/root/.hermes/scripts/finance/em_client.py',

'2>/tmp/em_err.log', '>', '/tmp/em_raw.txt']

cmd = ' '.join(parts)

“`

修法3(推荐用于 shell):write_file写 `.sh` 文件然后 `bash` 执行

“`python

在 execute_code 里构造完整 .sh 文件内容(用 chr(32) 或 ' '.join 保证空格),

#写到 /tmp/run_em.sh,再单独 terminal("bash /tmp/run_em.sh") 调用

#关键:write_file写入的内容也要用 chr(32)拼接,否则同样吞

“`

修法4:避免触发模式

-不用 `else0`、`return0` 这种紧贴写法,改成多行 `if/else`块

-不用 `else:` 后直接 inline;用 `if cond: x = a \n else: x = b`

  • shell字符串里脚本路径和重定向符号之间永远用 `' '.join(list_parts)`拼接

检测方式: `SyntaxError: expected 'else' after 'if' expression` 或 `IndentationError: expected an indented block after 'if'/'try'/'with' statement`出现时,第一反应检查空格是否被吞,而不是先怀疑逻辑错。

影响范围: 所有用 execute_code写 Python 的任务都受影响(晨报/午间/午后/夜盘脚本、批量解析、报表生成)。这是 Hermes沙箱级 bug,与具体脚本无关——下次任何 cron任务都可能复发。

已验证的兜底: 本次晨报实测用 `chr(32) + list join + write_file .sh + bash` 三连组合成功完成全流程,em_client370KB / news_scanner37KB 输出正常,8进程并行采集 +解析 +报告生成一气呵成。

##已知问题

ttfund Skill Gateway API 不可靠端点 (2026-05-26 发现)

以下端点通过 `curl` 调用天天基金skill网关时返回 `code:0`(成功)但实际数据为空:

  • FUND_CONDITION_SELECT: `raw_result.body.data` 返回 `{}`(空对象)。替代方案: 直接用 em_client.py 的 `fund_rankings` 字段(来自 rankhandler.aspx 直连API),数据可靠且包含近1年收益率排行。
  • FUND_SEARCH query="黄金": 返回 `total_count:0, candidates:null`(可能是搜索索引问题)。替代方案: 用 em_client.py 的 `gold_fund_ranking` 字段获取黄金基金列表,或用 FUND_THEME_INFO query="黄金" 获取黄金主题数据。
  • FUND_SEARCH query="债券": 正常返回5497条结果。不同关键词结果差异大,不可靠时优先用脚本数据。

可靠端点(2026-05-26 验证):

  • FUND_HUAAN_GOLD_INFO: ✅ 完整返回黄金行情(需多层嵌套解析)
  • BOND_MARKET: ✅ 完整返回债市晴雨表
  • FUND_HUOQIBAO_LIST: ✅ 活期宝排行正常
  • FUND_FAVOR_ZX: ✅ 自选基金列表正常
  • FUND_THEME_INFO: ✅ 主题数据正常(含行情/估值/资金流/成分股)

FUND_THEME_INFO Response Structure

路径: `data.raw_result.body.data` → 包含 `performance`(收益), `quote`(行情), `valuation`(估值), `fund_flow`(资金流), `component_stocks`(成分股), `summary`(热点摘要)

  • `quote.current_value`: 主题指数点位
  • `quote.change_pct`: 今日涨跌幅%
  • `fund_flow.today_net_flow`: 今日主力净流入(单位:元,注意是元不是亿)
  • `valuation.pe_ttm`, `valuation.pe_percentile_10y`: PE及10年分位
  • `component_stocks.items[]` 每项含 `quote.stock_name` / `quote.latest_price` / `quote.change_pct` + `stock_code` / `ratio`(权重)—— 字段名是嵌套的 `quote.stock_name`,不是顶层 `name`
  • `related_funds` 是 list 不是 dict,每项 `fund_code`/`fund_name`/`return_1w`/`return_1m`/`return_1y`/`aum`/`correlation_1y`/`overlap_to_theme`(含字符串型 return 字段需 `try/except` 转 float 后排序)

FUND_THEME_INFO 关键词命中率陷阱(2026-06-05 实测):

  • `CPO光模块` ❌ → `光模块` ✅
  • `半导体` ❌ → `芯片` ✅(实际是"存储芯片"子集)
  • `红利` ❌ → `FUND_INDEX_INFO index_id="中证红利"` 或具体基金代码
  • 主题库 query 不支持组合词和宽泛行业词,必须单字/双字热点名称

FUND_NAV_INFO Response Structure(2026-06-03 实测)

路径: `data.raw_result.body.data` → 包含 `fund_profile` / `nav_history` / `disambiguation_candidates`

  • 关键:净值数组在 `nav_history.items[]`不是 `nav_list`
  • `fund_profile`: `fund_code` / `fund_name` / `fund_type`
  • `nav_history.items[]` 每项: `FSRQ`(日期 YYYY-MM-DD)/ `DWJZ`(单位净值,字符串)/ `JZZZL`(日涨跌幅%,字符串)/ `LJJZ`(累计净值)/ `NAVTYPE` / `RATE`
  • items 默认按 `FSRQ` 升序排列(最早→最近),取最新一天需 `sorted(…, key=lambda x: x['FSRQ'], reverse=True)[0]`
  • 计算近1周/近1月涨幅:`items[0]['DWJZ']` vs `items[4]['DWJZ']` / `items[21]['DWJZ']`,记得 `float()` 转换
  • 批量调多个自选基金 标准模式:循环 `curl … > /tmp/nav_<fcode>.json`(每个sleep 0.3s避免限流),再用 execute_code 解析 `glob.glob('/tmp/nav_*.json')` 一并处理。禁止 `curl | python3 -c` pipe(沙箱拦截)
优化记录 (2026-06-11 晨报 silent WP 失败 + docx 乱码事件)

【根因已定位 + 4 个 bug 已修 3 个】 6/4–6/10 晨报/午间/午后/夜间复盘 4 份报告全部没有发到 WordPress,且 6/4–6/10 飞书 docx 末尾全部泄漏 raw JSON 段。no_agent 日志显示 `✅ WP 认证成功 + ⚠️ WP 发布失败` 但 cron `last_status: ok` —— 一个 cron 跑了 ~7 天没产出任何 WP 帖子,飞书 docx 末尾有 raw JSON 用户没注意,但没有任何告警。

4 个 bug 的根因(详见 `references/wp-publish-failures-2026-06-11.md`)

  1. `publish_wordpress.py` `import html` NameError(已修):`import html` 写在 `render_md_to_html()` 内部但 `build_wp_html_content()` 顶层用 → NameError。`post_process_*.sh` 用 `|| echo` 把异常吞了 + `set -e` 不触发 → silent fail。类级教训:import 一律模块顶部,函数内 import 是 latent bug
  2. ⚠️ `source wordpress.env` 不向 `python3` 子进程传播 export(半解决):4 个 wrapper 仍用裸 `source`,需改 `set -a && source … && set +a`。已记录在 references 修复手册;下一次 cron 出错时按手册改造。手工 source + 重跑已成功补发 6/11 晨报(id=1074,URL: https://www.nbjida.com/archives/1074)。
  3. 飞书 docx 末尾泄漏 `—REPORT_JSON_START—` raw JSON 段(已修):`feishu_doc_publish.py` v4.7 的 `md_to_blocks()` 只挡表格占位,没挡 raw JSON 段——该段是 PDF 图表渲染器的数据契约,人眼路径不该看。修法:`md_to_blocks` 入口加 `re.sub(r"^—\s*REPORT_JSON_START—.*?^—\s*REPORT_JSON_END—\s*$", "", md, flags=DOTALL|MULTILINE)`。
  4. ⚠️ 飞书 docx 链接不进 chat(半解决):cron LLM session 在 `write_file` 后经常被截断,`doc_url` 不会自动 send_message。手动补发流程已验证 2 次(6/10 夜盘 + 6/11 晨报),文档化在 `references/wp-publish-failures-2026-06-11.md` 第 4 节。wrapper 自动 append doc_url 到 no_agent 日志的 TODO 仍挂

补发命令模板(153KB md 跑 30-60s,必须后台):

“`bash

set -a && source /root/.hermes/secrets/wordpress.env && set +a

python3 /root/.hermes/scripts/finance/render/feishu_doc_publish.py \

/root/.hermes/cron/output/morning_brief/2026-06-11_morning_brief.md \

oc_216fc3f8de8c6038bd87a023f4a9ceed \

–job-id f189bf9a1104 –title "【财经晨报】2026-06-11"

后台跑(terminal background=true + notify_on_complete=true),前台 60s 会超时

“`

完整诊断流程、修复命令、4 个 bug 集中归档、Recovery 配方 见 `references/wp-publish-failures-2026-06-11.md`。

优化记录 (2026-06-10 夜间复盘飞书 docx 现场)
  1. no_agent 286 字节模板日志噪音(2026-06-10 22:30 实测):4 个 `post_process_<jobid>.sh` 的 286 字节小日志(`/root/.hermes/cron/output/<wp_job_id>/<date>_<time>.md`)写"✅ WP 认证成功 / ⚠️ WP 发布失败"是模板默认文本,不是脚本真跑了 WP 通道。夜间复盘 wrapper(`post_process_10cbc8199343.sh`)根本不发 WP,这条"WP 发布失败"是噪音——读日志的人会被误导。修法(待办):把 wrapper 的输出 tail 拼到 no_agent 日志后面(或干脆自定义 no_agent 模板),否则运维误判风险持续。
  2. 飞书 docx 链接不写进 no_agent 日志(2026-06-10 22:30 实测):上面那条 286 字节小日志里没有 docx URL,要查"今晚飞书 docx 在哪"必须手动跑 `feishu_doc_publish.py` 才能拿到 `doc_url`。修法(待办):让 wrapper 把 `feishu_doc_publish.py` 的 stdout(`{"doc_url": "https://feishu.cn/docx/…"}`)append 到 no_agent 日志;下次问"飞书文档呢"能秒答。临时绕开:手动跑 `python3 ~/.hermes/scripts/finance/render/feishu_doc_publish.py "<latest_md>" "<chat_id>" –job-id <job_id>` 拿 URL。
优化记录 (2026-06-09 22:30 报告显示流水线专项)
  1. WP 失败阻断飞书 PDF 推送(已修复 4 个 wrapper)

症状:`post_process_<jobid>.sh` 里 `set -e` + `python3 publish_wordpress.py` 失败 → 整个 wrapper 早退(`exit $WP_EXIT`),第 17 行的 `python3 post_process.py` 飞书 PDF 推送永远跑不到。当日 3 个报告(晨报/午间/午后)只产出 .md + .html,缺 .pdf;飞书收不到任何文件消息。

根因(双层 bug):① `set -e` 让 `publish_wordpress.py` 的非零退出码立即终止脚本,第17行 `|| echo` 容错根本走不到;② 即使去掉 `set -e`,第18行 `exit $WP_EXIT` 也会按 WP 的退出码强制退出,飞书 PDF 步骤同样被跳过。

修法(4 个 wrapper 全部统一改):`set -e` 改 `set -u`,每个 step 独立取 `$?`,最后 `exit $FEISHU_EXIT`(PDF 是 critical,WP 是 nice-to-have)。

修改文件:`post_process_f189bf9a1104.sh` (08:00) / `post_process_20b821cfdb06.sh` (12:30) / `post_process_6a99de3b00e2.sh` (14:30) / `post_process_10cbc8199343.sh` (22:30)

手动补跑 6/9 3 份缺 PDF:直接 `bash post_process_<jobid>.sh` 三次,前两次 PDF 渲染成功推送(晨报 538KB / 午后 499KB),午间第一次 render_report 45秒超时,单独跑 render_report 15.6s 生成 643KB PDF,再调 `post_process.py` 走 `find_existing_pdf()` 复用路径推送成功。

完整诊断命令 + 修复模式 + 决策树见 `references/post-process-wrapper-fix-2026-06-09.md`

  1. 22:30 夜间复盘 LLM 主任务 HTTP429 用量超限(今日 5h 滚窗 3298000/3298000 用完)

症状:22:30 任务 `error: HTTP 429: usage limit exceeded, 5-hour usage limit reached for Token Plan Plus (3298000/3298000 used)`

影响:昨日 22:30 报告未生成;今天 22:30 + 22:33 仍可能撞同样的限额

未修:未做自动 gate。建议方案(下次执行时评估):前置脚本 curl 一下 provider /v1/usage 端点确认 5h 滚窗剩余 token ≥ 阈再决定是否触发 LLM 任务,或自动降级到 22:30 已有历史模板的"轻量复盘"(无 LLM,纯脚本数据 + 静态 markdown 模板)。

  1. WP_APP_PASSWORD 缺失(持续问题):`publish_wordpress.py` 因 `WP_APP_PASSWORD` 环境变量未设置而无法连接 WordPress(认证后立刻报错)。不影响飞书 PDF 推送(已通过 4 个 wrapper 的解耦修复验证)。待用户决策:是给 WordPress 配 Application Password,还是彻底放弃 WP 路径、删除 3 个 wrapper 里的 `publish_wordpress.py` 调用(节省 ~0.5s/cron × 3/天)。
  1. 飞书 Docx 文档通道 v4.5 (2026-06-09 23:30 实装):用户明确表示不要 `###` / `**` / `—` 符号裸露、要做成飞书文档。

新脚本:`~/.hermes/scripts/finance/render/feishu_doc_publish.py`(md → Docx blocks → 创建文档 → 发卡片带 📖 打开飞书文档 按钮)

关键 API 速记:`POST /open-apis/docx/v1/documents` (创建) / `POST /open-apis/docx/v1/documents/{id}/blocks/{id}/children` (写入 children) / `POST /open-apis/im/v1/messages` (发卡片 `content=json.dumps()` 字符串)

block 映射:`#`→heading1(3) `##`→heading2(4) `###`→heading3(5) `段落`→text(2) `-`→bullet(12) `1.`→ordered(13) `>`→quote(15) `—`→divider(22) `x`→bold inline “ `x` “→inline_code `[x](u)`→link

关键陷阱:`content` 字段必须 `json.dumps(card_dict)` 字符串(嵌套对象会返回 code 9499);表格 block (31) 当前降级为文本(需要 3 层父级 cell API 嵌套,未实现)

env 加载陷阱:cron 子进程不继承 daemon env,新脚本必须主动从 `~/.hermes/.env` 读 `FEISHU_APP_ID/SECRET`(用 `load_env()` 函数,不依赖 `os.environ`)

wrapper 升级:4 个 `post_process_*.sh` 全部加第 3 通道(feishu_doc_publish),夜间复盘简化版只跑 PDF + Docx 两通道

端到端验证:今日 4 份报告全部 docx 化成功,137-206 blocks / 卡片均送达用户飞书

完整架构、API 速记、block 映射、表格降级局限、待办见 `references/feishu-docx-publish-pipeline.md`

优化记录 (2026-06-09 14:30 午后研判周二实测专项)
  1. 5 进程采集模板再次验证可用(与 2026-06-05 模板一致):em + signal + 3 ttfund curl(CPO/芯片/债市),总耗时 < 40s,em 380KB / signal 9KB / theme_cpo 35KB / theme_chip 35KB / bond 6KB。详见 `references/afternoon-research-workflow-2026-06-09.md` 第 1 节。
  1. `risk_indicators` 第三种 shape(US10Y 持续 null):继 12:30 记录 us10y null 后,14:30 盘中 US10Y 仍为 null(只有 DXY=100.0138 + VIX=21.51),两次盘中(12:30 + 14:30)US10Y 都 null——US10Y 在 A 股交易时段持续 null 是稳定模式。根因推测:ttfund 网关在 A 股时段(9:30-15:00)缓存策略或维护窗口不返回 US10Y。框架定位盲区:缺 US10Y 时象限 Ⅱ 双紧缩只能凭 DXY 暂判。报告 JSON 块 `gold.macro.us10y=null` 直接传,渲染层显示"待补"。详细 fallback 代码模板见 `references/afternoon-research-workflow-2026-06-09.md` 第 3 节。
  1. 半导体 PE 72.74% 加仓 vs CPO PE 99% 减仓实战(6/9 14:30)

– 半导体(BK000642 存储芯片): 14:30 +5.96% / 主力今日 +113.33 亿 / PE 分位 72.74% / 1 年 +230%加仓/持有信号

– CPO(BK000651 光模块): 14:30 +4.62% / 主力今日 +92.13 亿但月累计 -1207.04 亿 / PE 分位 98.81% / 1 年 +681%反弹减仓 1/3信号

决策依据写进报告:`"PE 分位 72.74% 合理 + 主力今日净流入 119.75 亿"` vs `"PE 分位 98.81% 极度高位 + 主力月累计净流出 1207 亿 + 5 日累计 -4.32%"`

– 这是 PE 分位告警规则的标准范本:≥ 95% 减仓 / 70-80% 加仓 / < 50% 切换方向

  1. 黄金双口径冲突实战(流动性紧缩 → 反弹窗口):周五(6/8)au9999 -3.43% 大跌(避险资产单日跌 = 双紧缩信号)+ 今日盘中 4 只黄金 ETF 翻红 +0.68~+0.72% + 黄金 ETF 联接基金估值 +0.58~+0.64%(风险偏好修复)。两个口径都展示不强行统一,建议语:"周五避险资产单日 -3.43% 反映流动性紧缩(双紧缩环境信号),今日盘中 ETF 翻红是风险偏好修复,但需关注 6/18 FOMC"。
  1. 指数 PE 估值分位告警写入报告(6/9 14:30 实测):沪深 300 PE 14.24 / 分位 89.58% / 中证 500 PE 34.93 / 分位 91.81% / 上证 50 PE 11.13 / 分位 72.87%。报告应在指数章节加 ⚠️ 估值高位告警——与 12:30 PE 分位 98.68% / 94.95% 历史最高位相比略低,但仍属偏高。注意区分:红利低波 PE 8.46(绝对低位)与沪深 300 PE 89.58% 分位是不同标的,不能混淆
  1. AI 算力是 CPO 减仓资金最自然切换方向(与 8:00 优化记录 5 一致):CPO PE 99% 极高位 + AI 算力 PE 48% 三大主线最低洼地。CPO 减出来的资金切换到 AI 算力是"估值最合理" + "主题仍在"的最优解。14:30 报告应包含"主线轮动判断"段,明确切换方向:AI 算力首推 / 半导体次之 / 红利防御。
  1. 14:30 prompt 模板仍写 `2>/dev/null`(待修):本次 14:30 任务 prompt 模板中 `python3 ~/.hermes/scripts/finance/em_client.py 2>/dev/null > /tmp/em_raw.txt` 和 `signal_generator.py 2>/dev/null > /tmp/signal_raw.txt` 是过时写法。本次没触发 0 字节 bug(background 模式下 stdout 最终能 flush),但仍是 latent bug。修法:参照 22:30 v4.4 升级方案 + 8:00 待办,改为 `2>/tmp/em_err.log` + `2>/tmp/signal_err.log`。优先级 14:30 > 8:00(14:30 紧接 em_client 输出,触发 0 字节时无 fallback;8:00 早盘前 em_client 失败时还有 12:30 补救机会)。
优化记录 (2026-06-09 12:30 午间速报周二实测专项)
  1. 金十时间戳是秒不是毫秒(实测踩坑):原 SKILL.md 写 "Unix 毫秒戳 `1780370063`" 是错误的——实测 2026-06-09 12:30 `time=1780972444` 对应 `2026-06-09 09:14:04`(秒级)。`datetime.fromtimestamp(1780972444)` 直接出正确时间,乘以1000当毫秒处理会得到 year=58406 报错。已修正 SKILL.md 主文 + 优化记录条目2。
  1. `indices` 字段是 dict 不是 list(澄清陷阱):之前文档说 `indices` 含 `收盘` / `5日涨跌%` 但没说明类型。2026-06-09 12:30 实测 `em['indices']` 是 dict(key=`上证指数`/`深证成指`/`创业板指`/`沪深300`/`中证500`/`科创50`),不能 `em['indices'][:5]`。正确遍历:`for k, v in em['indices'].items(): …`。
  1. `risk_indicators.us10y` 在 12:30 盘中为 null(框架定位盲区):2026-06-09 12:30 实测 `gold_market_skill.data.raw_result.body.data.risk_indicators.us10y=null`,仅有 `dxy=100.0138` + `vix=21.51` + `exchprice=6.8198`。框架"美元-利率二维象限"定位缺少 us10y 时只能暂判——本次因 DXY>100+VIX>20 暂判 Ⅱ 双紧缩象限(待 14:30 补 us10y 确认)。报告里要明确"us10y 待补"
  1. `sge_benchmark` 在 2026-06-09 12:30 全 None(间歇性数据缺口):本次 `gold_market_skill.body.data.gold_quotes.sge_benchmark.open/close/high/low/change_pct` 全部 None,仅 `au9999/au_td/gold_futures_shfe` 有数据。fallback 路径用 `gold_futures_shfe`(942.2/-3.27%)代替 sge_benchmark 在报告中展示。报告 JSON 块用 941.0 表示 sge_benchmark 价位(基于 au9999/au_td/gold_futures_shfe 三者均价)
  1. DXY 突破100 + VIX突破21 双紧缩 L2 黄实战案例(2026-06-09 12:30):DXY=100.01 + VIX=21.51 + 沪深300 PE89.58% + 中证500 PE91.81% 共同触发 L2 黄预警(任一项触发即可)。主线仓位从60%降至40-45%,红利低波加至30%。沪金单日 -3.43% 同步下跌 = 流动性紧缩信号(非典型避险逻辑)——这种"避险资产与风险资产同跌"是双紧缩环境的特征信号,应作为 L2 黄 → L3 红 升级的额外观察点。
  1. `news_scanner` 输出字段顺序核对(再次验证):2026-06-09 12:30 实测 `news.priority_news` 仍为 dict(key=`tech_related`/`fund_related`/`gold_related`/`macro_related`/`dividend_related`),dividend_related=0 条(与22:30 一致),tech_related=22 条最多。tech_related 中含大量可转债发行公告等噪声,只取标题含 "AI/数据/算力/光模块/CPO/芯片/PCB/创新药/数字" 关键词的 top5 即可。
优化记录 (2026-06-09 8:00 晨报周二实测专项)
  1. 8:00 模板标准化为 8 进程(实测 < 40s 完成):em + news + 6 个 ttfund curl(光模块 + 芯片 + 人工智能 + 中证红利 + 黄金 + 债市/活期宝)。与 22:30 的 10 进程、12:30/14:30 的 5 进程并列,4 个 cron 任务采集模板完全定型。文件大小预期固化在 `references/morning-brief-workflow-2026-06-09.md`。
  1. 8:00 框架定位集成待办(明确标记):22:30 v4.4 已强制 LLM 填"🎯 框架定位与决策建议"必填段,8:00 prompt 模板尚未同步。当前 LLM 主动 recall 框架能输出象限 + 警报 + 配置 + 退出红线(如 6/9 8:00 输出 II 双紧缩 + L2 黄 + 5 条退出红线),但应在 prompt 层强制。修法:把 22:30 框架段复制到 8:00 prompt。详见 `references/morning-brief-workflow-2026-06-09.md` 第二节。
  1. CPO PE 99.6% 极高位实战减仓案例(6/9 8:00 输出):CPO 主力 6/8 净流出 -123.68 亿 + PE 10年分位 99.6% = 明确减仓信号,主线仓位由 60% 降至 40-45%。该案例与 22:30 历次"主线获利兑现"语调切换案例一致,可作为 PE 分位告警规则的标准范本。
  1. DXY 周涨幅作为 L3 触发判定的实战示例(6/9 8:00 输出):6/5 (周五) DXY=100.08,6/8 (周一) DXY=100.01,周涨幅 -0.07% 远未达 +2% 阈值,所以即使 DXY > 100 + CPO PE 99.6% + 主力大额流出也只触发 L2 不升级 L3。L3 第 5 项"DXY 周涨幅>2%"是滞后但强力的最后确认信号。
  1. AI/算力是 PE 分位 < 50% 的少数主线(6/9 实测):CPO PE 99.6% / 芯片 PE 75% / AI PE 48% —— AI 是三大主线中唯一 PE 分位 < 50% 的方向。在主线系统性回调时,AI 算力 = "从 CPO 减出来的资金最自然切换方向",配合苹果 iOS 27 + 马斯克太空算力 + 国产 GPU 三大催化(6/9 早盘前新闻)。
优化记录 (2026-06-08 jobs.json 批量编辑陷阱专项)

【必读陷阱】 编辑 cron job prompt 时用 Python 多行字符串 `old_section` 替换容易静默失败——2026-06-08 22:30 v4.4 升级实测:第一次脚本跑完后 `step 2.5` 根本没插入 prompt(其他 5 处都替换成功),但脚本 stdout 全部打印 `✅ INSERTED`。根因:原 prompt 里 3 个脚本命令后的换行符、缩进与 `old_section` 多行字符串不完全一致,`str.replace()` 找不到匹配 → 整段替换被跳过 → 脚本无异常但 prompt 漏了关键步骤。

强制校验流程(任何 jobs.json 编辑后必走)

  1. 重新读回 `data['jobs'][i]['prompt']`,逐条 grep 关键 marker(`print(关键短语 in p)` 列表)
  2. 不要相信自己的"成功打印"——多行字符串替换是 silent failure 高发区
  3. 顺序校验:`assert idx_a < idx_b` 验证步骤顺序
  4. 备份约定:编辑前 `shutil.copy('jobs.json', f'jobs.json.bak.{int(time.time())}')`
  5. 长度差合理性:delta 应 ≈ 预期增量 ±10%;如果 delta 比预期小很多,必有步骤没插进去

替代方案(更可靠,2026-06-08 第二次修复时使用):

“`python

用单 marker 定位 + 单独字符串插入

marker = '3. 用 execute_code 解析数据'

step_25 = '''2.5 …'''

if marker in p and '2.5' not in p: # 双重条件防止重复插入

p = p.replace(marker, step_25 + marker)

“`

单 marker 比多行 old_section 安全得多——多行文本容易因不可见字符(trailing whitespace、tab vs space)失配。

症状速查

  • 脚本 print 全 ✅ 但 prompt 实际少了一段 → 99% 是多行字符串替换失配
  • prompt 长度增量比预期小 → 同上
  • 调度器 `cronjob action=list` 显示任务健康但实际跑了旧 prompt → 同上
优化记录 (2026-06-08 4 wrapper 双投递 + 复用 PDF)
  1. 3 个 wrapper (08:00/12:30/14:30) 补齐飞书 PDF 投递:原版只跑 `publish_wordpress.py` 不发飞书 → 现改为 WP → 飞书 PDF 双重投递。22:30 保持单投递(直接发飞书,不发 WP)。修改文件:

– `~/.hermes/scripts/finance/render/post_process_f189bf9a1104.sh` (08:00 晨报)

– `~/.hermes/scripts/finance/render/post_process_20b821cfdb06.sh` (12:30 午间)

– `~/.hermes/scripts/finance/render/post_process_6a99de3b00e2.sh` (14:30 午后)

– `~/.hermes/scripts/finance/render/post_process_10cbc8199343.sh` (22:30 夜间) — 未改

  1. post_process.py 新增 `find_existing_pdf()` 复用函数

– WP 路径渲染后,相同 md_path 对应同名 .pdf 已在 output 目录

– 飞书投递路径在 10 分钟 mtime 内直接复用,不再重跑 render_report.py

节省 10-30s/cron × 3 = 30-90s/天,且避免 render 竞争

– 端到端验证:22:30 跑 6/07 老报告,输出 `♻️ 复用已有 PDF(跳过渲染)` + `msg_id=om_x100b6d53bb650cacb4b985df4026eb6` 飞书消息成功

  1. 飞书凭据传递修复:`terminal()` 子进程继承父 shell 的 `FEISHU_APP_ID`/`FEISHU_APP_SECRET` env,但 `execute_code` 沙箱不继承 → 端到端测试必须用 `terminal()`,不能 `execute_code(subprocess.run(…))`(会因 env 缺失返回 exit=1 "缺少飞书凭据")。
优化记录 (2026-06-08 22:30 夜间复盘 v4.4 框架集成专项)
  1. 22:30 prompt 集成"美元-利率二维象限 + 3 级预警"决策框架(v4.4 升级)

– job_id=10cbc8199343,prompt 长度 3882→6228(+2346 字符)

修复 6 处

1. 3 个 `2>/dev/null`→`2>/tmp/<name>_err.log`(SKILL#17 stderr fix,em/news/signal 都修了)

2. CPO 同义词注释 `CPO光模块` ❌ → `光模块` ✅

3. 芯片同义词注释 `半导体` ❌ → `芯片` ✅

4. 红利改用 `FUND_INDEX_INFO index_id="中证红利"`(无主题查询)

5. 新增 step 2.5 宏观数据采集(DXY/10Y美债/CME 12月加息概率/TMT成交占比/融资余额5日累计/PE分位/科创50 5ma)共 7 项

6. 新增 step 6【框架定位】(4 象限 × 3 警报等级判定规则)+ step 7 综合生成中插入【🎯 框架定位与决策建议】必填段(宏观定位+信号灯+持仓配置+退出触发+错误记录)

– JSON 块 `actions` 数组追加 4 个 L3 减仓示例(科技减仓/红利加仓/黄金维持/现金加仓)

jobs.json 备份:`/root/.hermes/cron/jobs.json.bak.1780903679`

– 今晚 22:30 自动用新 prompt 触发

  1. 框架定位规则(写进 prompt 的 4×3 矩阵)

– 象限 Ⅰ 双宽松:DXY<99 + 10Y美债<4.0% → 满仓进攻

– 象限 Ⅱ 双紧缩:DXY>100 + 10Y美债>4.3% → 科技≤30% + 红利30% + 现金30% + 黄金5% + 有色5%

– 象限 Ⅲ 剪刀差A:DXY<99 + 10Y美债>4.3% → 周期/资源 + 红利对冲

– 象限 Ⅳ 剪刀差B:DXY>100 + 10Y美债<4.0% → 红利+价值 + 黄金对冲

– L1 绿:TMT<35% + PE<70% + 融资流入 → 主线60-70%

– L2 黄:任 1 触发(TMT>40%/PE>90%/融资-300亿)→ 主线40-50%

– L3 红:任 2 触发(TMT>47%/PE>95%/融资-200亿/CME>50%/DXY周+2%)→ 主线≤30%

  1. 退出触发 5 条红线(已写进 prompt)

– ❶ 美联储 6/18 FOMC 意外转鹰 → 清仓科技

– ❷ 科创 50 跌破 5ma 连续 3 日 → 视同上证顶部

– ❸ 长鑫存储上市公告 → 评估 1 周内止盈半导体

– ❹ 美元 DXY>103 或周涨幅>2% → 减有色至 0

– ❺ 北美科技巨头 AI capex 同比转负 → 立即清仓

优化记录 (2026-06-08 8:00 晨报周日实测专项)
  1. 8:00 周日/非交易日数据基准日处理(实测):8:00 cron 每天触发但周日/节假日 A股不开盘,em_client 拿到的指数/板块/资金/北向/基金估值 = 最后一个交易日数据。报告第一行必须明确数据基准日("今日为周日休市日,以下数据均为上周五(2026-06-05)A股收盘 + 周末海外要闻"),JSON 块加 `data_basis` 字段 + `is_weekend: true` 标记。美股/黄金期货同样 = 上一个交易日。报告语调从"今日开盘展望"切到"周一开盘展望"。
  1. 8:00 vs 22:30 周末处理差异(实测):8:00 报告应同时包含"周五复盘"和"周一开盘策略"两部分,22:30 只需"周五复盘 + 周一展望"(已收盘后只需看夜盘 + 晚间消息)。8:00 周末的实操重点是周末海外催化(英伟达合作/美股大跌传导/地缘风险)→ 周一 A 股应对策略。
  1. 8:00 早盘前数据 fallback 模式(与 12:30 同样会触发):`gold_etf={}` + `gold_domestic.*.涨跌幅=0` + `industry_sectors=null` + `market_fund_flow=null`——属正常现象,fallback 到 `gold_market_skill.body.data.gold_quotes.{au9999, au_td, gold_futures_shfe}` 拿 open/close/high/low/change_pct。12:30 也触发同模式(参考 2026-06-04 条目15)。
  1. CPO/芯片/算力三大主题齐跌 ≥ 3.5% 报告语调切换(8:00 实测):2026-06-08 周日 8:00 实测 CPO -4.32% / 芯片 -4.39% / AI -3.59% 齐跌,配合周五美股纳指 -4.18% + 周末英伟达密集签署韩企合作,报告切到"主力获利兑现"语调,主线仓位降至 40-45%,CPO PE 99.87% 极高位作为明确"减仓信号"。该模式与 22:30 条目5 + 14:30 关键要点一致,应作为三大报告(8:00/14:30/22:30)共享的语调切换规则
  1. 8:00 prompt 模板仍写 `2>/dev/null`(待修):8:00 晨报 cron prompt 模板中 `python3 ~/.hermes/scripts/finance/em_client.py 2>/dev/null > /tmp/em_raw.txt` 和 `news_scanner.py 2>/dev/null > /tmp/news_raw.txt` 是过时写法,应按 SKILL.md #17 修正为 `2>/tmp/em_err.log` + `2>/tmp/news_err.log`。12:30 模板和 14:30 模板已修正,8:00 模板需同步更新。
  1. 10 进程并行采集模板 8:00 也可用:本次 8:00 周日实测采用与 22:30 相同的 10 进程模板(em_client + news_scanner + signal_generator + 7 个 ttfund curl),总耗时 < 30s,所有文件大小正常。8:00 模板应标准化为 10 进程而非原 prompt 写的"em + news + 6 个 ttfund"。
优化记录 (2026-06-07 周日夜间复盘专项)
  1. 22:30 周日/非交易日数据基准日处理(实测):22:30 cron 每天触发但周日/节假日 A股不开盘,em_client 拿到的指数/板块/资金/北向/基金估值 = 最后一个交易日数据。报告第一行必须明确数据基准日("今日为周日休市日,以下数据均为上周五(2026-06-05)收盘"),JSON 块加 `data_basis` 字段统一处理。美股/黄金期货同样 = 上一个交易日。报告语调从"今日复盘"切到"昨日(周五)复盘 + 周一开盘展望"。
  1. 10 进程并行采集模板(实测 30-50秒完成):5 个数据脚本 + 5 个 ttfund curl 全部 `terminal(background=true, notify_on_complete=true)` 并行启动。脚本组:em_client + news_scanner + signal_generator。ttfund curl 组:FUND_HUAAN_GOLD_INFO + FUND_THEME_INFO("光模块") + FUND_THEME_INFO("芯片") + FUND_FAVOR_ZX(zx_query) + FUND_HUOQIBAO_LIST(top_n=5)。可选 2 个 ttfund curl:FUND_INDEX_INFO(沪深300) + FUND_INDEX_INFO(中证红利)。文件大小:em 380KB / news 48KB / signal 7KB / gold 12KB / theme_cpo 35KB / theme_chip 35KB / favor 35KB / huoqibao 4KB。
  1. signal_generator 0 字节问题再次触发但 SKILL.md 修正方案成功(验证):用户的 cron prompt 模板仍写 `2>/dev/null`(已过时),但 SKILL.md #17 已修正为 `2>/tmp/signal_err.log`。0 字节触发后立即按 SKILL.md 方案重跑(不重定向 stderr 到 /dev/null)一次成功 7.1KB。结论:SKILL.md 修正方案有效,但建议同步更新 cron prompt 模板(避免每次都触发 0 字节 bug),同时把所有脚本统一加 `2>/tmp/<name>_err.log` 而非 `2>/dev/null`。
  1. FAVOR 嵌套路径再次验证有效:em_client 的 `favor_funds` 字段是空 dict,真实数据在 `raw_result.body.query_result.data.zxActionResponse.zxlist`(多一层 `query_result` 包裹,与其他 ttfund 技能 `body.data` 路径不同)。82 只自选基金完整数据可一次性拿到。关键词匹配自选基金推荐字典:`['半导体', '芯片', '通信', '云计算', '机器人', '电子', '传媒', '游戏', '动漫', '新能源', '海外', '纳斯达克', '恒生科技', '军工', '红利', '白酒']`。
  1. 22:30 报告语调切换实战经验(2026-06-07 实测):当 CPO/芯片/算力三大主题齐跌 ≥ 4% + 美股纳指 -4%+ 大幅波动时,22:30 报告应切到"主力资金获利兑现"语调,主线仓位降至 40-45%,不主动抄底。配合英伟达CEO访韩深化SK海力士合作等海外催化,强调"主线方向未变但短期获利兑现压力极大",把 PE 99.87% 极高位作为明确"减仓信号"。
优化记录 (2026-06-05 报告渲染管线 v4.2 升级)
  1. 核心修复:渲染管线接通 WP 发布链。`render_template()` 不再是空壳——新增 5 个区块生成器(黄金/指数/板块/基金/资讯/操作建议),6 个辅助函数(`_pe_class`/`_change_class`/`_fmt`/`_fmt_pct`),完整驱动 `{{REPORT_BODY}}` 占位符替换。LLM 输出的 JSON 块现在能渲染出深色卡片+PE 估值分位 gauge+三色操作建议(buy 红/hold 黄/sell 绿)。
  1. 修 `post_process.py` 缺 `import re`:fallback 路径有 `re.search` 调用但缺 import,会报 ImportError(5 天来这条路径实际从未跑通)。现在补上。
  1. 补齐 3 个缺失的 cron wrapper:`~/.hermes/scripts/finance/render/post_process_<jobid>.sh` 之前只有夜间复盘那 1 个存在,晨报/午间/午后 3 个 wrapper 文件不存在——jobs.json 标 `last_status: ok` 但实际是 silent 失败。4 个 wrapper 全部 hardcode `JOB_ID` + 调 `publish_wordpress.py`,下次 cron 自动跑深色卡片版。
  1. fallback 路径只取 `## Response` 之后:`render_fallback()` 新增 `extract_response_body()`,避免把 SKILL/prompt 全文(80KB+)塞进报告。之前 PDF 第 1-2 页显示 Cron Job 元信息 + SKILL.md 全文就是这个 bug。
  1. prompt 末尾追加 JSON 块指令:4 个 LLM cron job 全部注入"可选 REPORT_JSON 块"指令(在"⚠️ 免责声明"前用 Python 字符串替换 jobs.json 写入)。字段名必须严格匹配 `render_report.py` 中的 `render_*_block()` 签名(如 `sge_benchmark.price` / `etf_avg.price` / `actions[].type` 取值 buy/hold/sell)。注意:旧 reference 里的 JSON 示例(`sge_price`/`dir:buy`)是错的,新版已按 render_report.py 实际签名校正
  1. Feishu file 消息 content 必传 JSON 字符串:实测用 `content: {dict}` 嵌套对象会被 Feishu API 拒绝(code 9499 "Invalid parameter type"),必须 `content: json.dumps({…})`。
  1. `jobs.json` 字段名陷阱:文件存的是 `id`(不是 `job_id`),但 `cronjob(action='list')` 返回时映射成 `job_id`。直接读 jobs.json 用 `j['id']`,list 出来的 jobs 用 `j['job_id']`。
优化记录 (2026-06-02)
  1. API 响应 shape 漂移记录:FUND_HUAAN_GOLD_INFO 的 `risk_indicators` 从 list 变 dict(同时含 vix/exchprice/dxy 扁平键 + items 数组),`news` 字段从 list 变 `{"items": […]}` dict,`central_bank_gold` 新增 `is_stale`/`freshness_days` 字段。完整对照见 `references/live-response-shapes-2026-06.md`。
  2. 新闻解析新坑:金十 (jin10) `title` 字段经常是 Python `repr()` 字符串(`"{'vip_title': '…', 'lock': True}"`),需用正则提取 `vip_title`;`time` 字段同 list 内同时存在 `2026-06-02 11:51:19` 字符串和 Unix 秒级戳(秒级不是毫秒,实测 `1780972444` = 2026-06-09 09:14:04)两种格式,需 isinstance 判断后直接 `datetime.fromtimestamp(int(time))`,千万别乘1000
  3. process() 60秒clamp确认:`process(action='wait', timeout=90)` 实际只等 60 秒(系统级clamp),长时间脚本需用 `notify_on_complete=true` 后台模式。
  4. 北向 NaN 是非交易时段特征:em_client 的 `northbound` 字段在非交易时段返回 NaN(数据来源=历史),不要当错误处理。
  5. 午间速报现场 shape 速记:em_client `gold_domestic` 是 dict(key=名称, value=`价格`/`涨跌幅`,没有 open/close),`gold_etf` 是 dict(key=名称, value=`最新价`/`涨跌幅`/`最高`/`最低`/`开盘`/`昨收`),`fund_estimates` 字段是 `估算值`/`估算涨跌幅%`/`分类`(不是 `估算净值`/`估算涨幅%`),`industry_sectors.领涨股` 是代码不是名称。ttfund 直接 curl `FUND_INDEX_INFO` 返回英文 key (`current_point`/`change_pct`/`change_point`/`ytd_return`),与 em_client 重命名后的中文 key 不一致。完整速查见 `references/live-response-shapes-2026-06-02-noon.md`。
  6. 债市晴雨表数据源修正:bond_market 真正有用的结构化数据在 `module_1[0].markdown` 字段(不是 `textSummary` 那行单行摘要),含 emoji 天气 + 品种×期限表格 + 市场观点。
  7. `gold_market_skill` 嵌套路径修正:em_client 中 `.body` 是空 dict,真实数据需走 `data.raw_result.body.data.gold_quotes`(不是 `body.data`)。同样的 `.data.raw_result.body.data` 路径适用于所有 em_client 嵌套的 ttfund 技能响应(`bond_market` / `gold_theme` / `huoqibao` 在 em_client 中都是空壳,需直连 ttfund 网关)。

⚠️ 2026-06-03 例外修正 `favor_funds` 嵌套路径:上述"em_client 的 ttfund 嵌套都是空壳"对 `favor_funds` 不成立。实测 `em_client.favor_funds.data.raw_result.body.query_result.data.zxActionResponse.zxlist` 包含 82 只自选基金完整数据(fcode/shortname/eitime/setTop/rsFundType/rsbType/relatedTopic)。关键差异:自选列表多一层 `query_result` 包裹,不能套用 `body.data` 路径。解析代码:

“`python

zxlist = em['favor_funds']['data']['raw_result']['body']['query_result']['data']['zxActionResponse']['zxlist']

“`

不再需要单独 curl ttfund 网关,优先用 em_client 内嵌数据。

  1. signal_generator.py v3.0 个股技术面回归:`detailed` 块中 `沪金主力(AU0)` 和 `华安黄金ETF(518880)` 返回 `_error: "数据获取失败"`,`signals=[]` 且 `indicators={}`。沪金/黄金ETF技术面分析实际未实现——可用 ttfund `FUND_HUAAN_GOLD_INFO` 的 `au9999` / `au_td` / `gold_futures_shfe` open/close/high/low 手算,或换外部行情API。
  2. signal_generator 首次运行 0 字节问题再次出现(2026-06-02 午后实测,exit_code=1):检测输出文件大小,0 字节立即重跑(必成功)。2026-06-05 修正见条目 17——根因是 stderr 丢弃而非首次运行
  3. 午后研判 5 进程并行采集模板:em_client + signal_generator + 3个 ttfund curl 同时 background 启动,60秒内完成。完整模板见 `references/live-response-shapes-2026-06-02-pm.md`。
  1. em_client 早盘前采集异常模式(2026-06-03 早间 08:00 晨报实测)

– `gold_etf` 字段返回空 dict `{}`(东方财富 push2 早盘前数据未就绪/限流)

– `gold_domestic.沪金主力.涨跌幅 = 0`、`沪银主力.涨跌幅 = 0`(同上原因)

– `industry_sectors = null`、`market_fund_flow = null`(非交易时段 + 限流,正常)

对策:黄金 ETF 行情 fallback 到 `gold_market_skill.body.data.gold_quotes.au9999/au_td/gold_futures_shfe`(三者均有 high/low/open/close/change_pct)。报告中说明"非交易时段数据"即可,不要当成错误。

  1. FUND_NAV_INFO 实际字段(2026-06-03 实测):净值数组路径是 `body.data.nav_history.items[]`(不是 `nav_list`),字段 `FSRQ`/`DWJZ`/`JZZZL` 都是字符串,items 按日期升序需 `reverse=True` 取最新。批量自选基金模板见 `references/nightly-recap-workflow-2026-06-03.md`。
  1. 夜间复盘(22:30)现场报告模板与执行步骤(8 块结构、并行采集时序、自选基金批量净值查询模式、金十 title 清洗、混合时间戳处理等全套细节)见 `references/nightly-recap-workflow-2026-06-03.md`。
  1. 午间速报 5 进程并行采集模板已验证(2026-06-04 12:30 实测)

– 5个 background 进程并行启动全部成功(em_client + news_scanner + 3个 ttfund curl),总耗时 < 40s

典型 5 进程组合:`em_client.py`、`news_scanner.py`、`FUND_HUAAN_GOLD_INFO`、`FUND_INDEX_INFO`(HS300)、`BOND_MARKET`

– 之前 SKILL.md 写"4 个后台进程"是过时的——`BOND_MARKET` 应作为第 5 个常驻调用

所有文件大小正常(em 372KB / news 46KB / gold 12KB / index 25KB / bond 6KB),无需重跑

– 5 个 `process(action='wait', timeout=30~60)` 全部正常返回,无 60秒clamp 触发

– 详细执行步骤与报告模板见 `references/noon-flash-workflow-2026-06-04.md`

  1. gold_etf 空数据模式在 12:30 也会触发(2026-06-04 实测,扩展示例)

– 之前记录(条目11)只说 08:00 早盘前会触发 `gold_etf={}` + `gold_domestic.*.涨跌幅=0`

12:30 午间速报实测同样触发:`gold_etf={}` + `gold_domestic.沪金主力.涨跌幅=0` + `沪银主力.涨跌幅=0`

– 原因可能是东方财富 push2 在 12:30 仍未刷新黄金 ETF 实时盘口(不是简单的"非交易时段"问题)

fallback 路径已验证可用:`gold_market_skill.body.data.gold_quotes.{au9999, au_td, gold_futures_shfe}` 三者均有完整 open/close/high/low/change_pct

黄金基金盘中估值(fund_estimates.分类='黄金')反而是实时刷新的,12:30 显示 000216/002611/000218 均 +0.38% 翻红——报告应以基金估值而非 ETF 盘口为准

– 行业板块/北向资金 12:30 也是 null(属正常现象,板块数据需盘后才完整)

  1. 12:30 沪深300 PE 分位 98.68% / 中证500 PE 分位 94.95% 实测高位(2026-06-04 12:30):

– 通过 `em_client.index_quote.沪深300.PE分位%` 和 `中证500.PE分位%` 直接获取

报告模板应在指数章节加上 PE 分位告警:"⚠️ 估值高位" 是关键风险提示

– 午间速报读者多为持仓用户,看到分位数有助于减仓决策

– `index_quote` 已包含 `PE_TTM/PE分位%/PB/PB分位%/ROE%` 完整估值字段(em_client 重命名后的中文 key),直接用即可

  1. signal_generator.py 0字节问题根因修正(2026-06-05 14:30 实测)

旧说法错误:"首次运行产生 0 字节文件,重试一次即可"——2026-06-05 实测连续 3 次 `python3 signal_generator.py 2>/dev/null > /tmp/signal_raw.txt` 都产生 0 字节(exit_code=1),前台运行 `2>&1 | head -50` 一次成功输出 7KB+ JSON。

真正根因: signal_generator.py 把进度日志("分析沪金期货…"、"分析 华安黄金ETF联接A…"等)写 stderr,stdout 在 stderr 缓冲 flush 之后才输出。把 stderr 丢到 `/dev/null` 会让 stdout 缓冲永远不 flush → 写入 0 字节就退出。

正确重定向(4 个脚本通用——em_client/news_scanner/signal_generator/institutional_scanner):

“`bash

# ❌ 错误:stderr 丢到 /dev/null 触发 0 字节

python3 signal_generator.py 2>/dev/null > /tmp/signal_raw.txt

# ✅ 正确:stderr 重定向到真实日志文件

python3 signal_generator.py 2>/tmp/signal_err.log > /tmp/signal_raw.txt

“`

底层原理: 任何"日志到 stderr、JSON 到 stdout"的脚本都不能用 `2>/dev/null`,必须给 stderr 一个真实文件。前台 tty 自动 flush,background 模式下 stderr 缓冲是阻塞点——所以同样的脚本前台能跑、background 必坏。

影响范围: 12:30 5 进程模板里的 `2>/dev/null` 全部应改为 `2>/tmp/<name>_err.log`(em_err.log / news_err.log 等)。已部署任务需注意这个改动。

  1. 14:30 午后研判采集模板实测(2026-06-05)

典型 5 进程组合(与 12:30 模板略有不同):`em_client.py` + `signal_generator.py` + 3 个 ttfund curl(`FUND_THEME_INFO query="光模块"`、`FUND_THEME_INFO query="芯片"`、`BOND_MARKET`)

FUND_THEME_INFO 必须用同义词——`CPO光模块` ❌ 改 `光模块` ✅;`半导体` ❌ 改 `芯片` ✅(注意:实际是"存储芯片"子集);`红利` ❌ 改 `FUND_INDEX_INFO index_id="中证红利"` 或 `FUND_NAV_INFO fund_id=<红利基金代码>` 替代

输出文件大小(实测正常):em 372KB / signal 7KB / theme_cpo 34KB / theme_chip 34KB / theme_ai 34KB / bond 6KB / gold 12KB

报告保存路径: `~/.hermes/cron/output/afternoon_research/<YYYYMMDD_HHMMSS>.json`(供 14:33 no-agent 任务渲染 PDF)

完整工作流、PE 分位告警规则、CPO芯片算力齐跌时的报告语调见 `references/afternoon-research-workflow-2026-06-05.md`

优化记录 (2026-05-29)
1. 数据质量与稳定性优化
  • 北向资金数据修复:添加备用数据源,非交易时段使用历史数据
  • 板块资金数据类型修复:修复资金字段字符串转数字错误
  • 超时控制优化:减少http_get超时时间(15秒→10秒)和重试次数(3次→2次)
  • sleep时间优化:em_client.py总sleep时间从23.7秒减少到6.2秒
2. 新闻扫描器优化 (news_scanner.py v4.0)
  • 并行采集:使用ThreadPoolExecutor并行采集7个新闻源
  • 超时控制:设置30秒总超时,15秒单源超时
  • 增强关键词:扩展黄金/基金/宏观关键词库,提高相关性
  • 改进去重逻辑:基于标题前40字符+内容前100字符去重
  • 优化排序:按优先级和时间排序,支持字符串/数字类型混合
3. 定时任务提示词优化
  • 简化步骤:减少不必要的API调用,避免超时
  • 强调超时控制:提示词中注明"已优化,带超时控制"
  • 选择性调用:减少天天基金API调用数量,只调用可靠端点
优化记录 (2026-05-26)
1. ttfund API可靠性验证与文档
  • 验证了8个ttfund skill网关端点的可靠性
  • 发现 FUND_CONDITION_SELECT 和 FUND_SEARCH(query="黄金") 返回空数据
  • 确认 FUND_HUAAN_GOLD_INFO, BOND_MARKET, FUND_HUOQIBAO_LIST, FUND_FAVOR_ZX, FUND_THEME_INFO 可靠
  • 记录了 FUND_THEME_INFO 完整返回结构(行情/估值/资金流/成分股/热点摘要)
  • 发现 FUND_SEARCH 不同关键词可靠性差异大("债券"OK,"黄金"为空)
2. 夜间复盘并行执行优化
  • 3个数据采集脚本(em_client/news_scanner/signal_generator)可并行执行
  • 8个ttfund API调用可并行执行(每个用独立curl,保存到独立文件)
  • 总执行时间约2-3分钟(含数据解析和报告生成)
  • news_scanner.py 超时风险: 该脚本经常超时(>120s),建议用 `background=true` + `notify_on_complete=true` 运行,设 `timeout=180`。如果超时被kill,可跳过新闻数据(黄金/基金新闻从 gold_market_skill 和 gold_theme 的 summary 中补充)。
优化记录 (2026-05-25)
1. gold_fund_ranking 补充历史涨跌幅 (em_client.py)
  • 从 `近期净值` 数组计算近1日/近1周/近1月涨跌幅
  • 净值历史从5天扩展到30天(`tt_fund_nav_history(code, 30)`)
  • 新增字段:`近1日%`、`近1周%`、`近1月%`
  • 当净值数据不足22天时,`近1月%` 不会生成
2. index_quote 解析嵌套数据 (em_client.py)
  • 天天基金指数API返回数据从原始嵌套JSON解析为顶层字段
  • 新增字段:`收盘`、`涨跌幅%`、`涨跌点`、`成交额亿`、`行情日期`、`今年以来%`
  • 新增收益字段:`近1日%`、`近1周%`、`近1月%`、`近3月%`、`近1年%`
  • 新增估值字段:`PE_TTM`、`PE分位%`、`PB`、`PB分位%`、`ROE%`
  • 原始响应保留在 `_raw` 字段中
优化记录 (2026-05-21)
1. 板块数据获取优化 (market_scanner.py v2.1)
  • 添加东方财富直连API备用数据源
  • 当AKShare失败时自动切换到em_client
  • 增加请求间隔和重试逻辑
2. 机构调研性能优化 (institutional_scanner.py v1.1)
  • 使用date参数限制数据量(从9099条减少到~2000条)
  • 执行时间从17分钟减少到7秒
  • 添加请求间隔避免限流
3. 北向资金数据修复 (institutional_scanner.py)
  • 添加数据质量检查,过滤NaN行
  • 使用stock_hsgt_fund_flow_summary_em作为备用数据源
  • 改进错误处理和日志
4. 信号冲突处理 (signal_generator.py v3.1)
  • 添加信号冲突检测逻辑
  • 根据信号强度决定最终信号
  • 添加conflict_signals字段到输出
5. 股票池更新 (market_scanner.py)
  • 新增黄金相关ETF和基金
  • 减少股票数量(从32只减少到22只)
  • 聚焦基金+黄金相关标的
6. 新闻去重优化 (news_scanner.py v3.1)
  • 添加基于标题前30字符的去重逻辑
  • 过滤空标题新闻
  • 提高新闻质量
v2.1 优化记录 (2026-05)
  1. 板块数据备用源:AKShare失败时自动切换东方财富直连API
  2. 机构调研性能:使用date参数限制数据量(17分钟→7秒)
  3. 北向资金质量:过滤NaN,使用汇总数据+备用数据源
  4. 信号冲突处理:同股多信号按强度决定最终信号
  5. 股票池精简:32只→22只,聚焦黄金ETF+基金
  6. 新闻去重:基于标题前30字符去重
  7. 输出格式统一:版本号和focus字段一致
注意事项
  1. 东方财富API限流:当前被限流,板块数据和北向资金实时数据可能获取失败,已添加备用数据源
  2. EastMoney API高频限流,脚本已加3秒延迟+重试
  3. 非交易日数据可能为上一交易日
  4. 信号仅供参考,不构成投资建议
  5. 维护:`uv pip install –upgrade akshare`
  6. 时区设置:Cron调度器使用本地时间(Asia/Shanghai),非UTC。定时任务的cron表达式应直接使用北京时间(例如:`0 8 * * *` 表示北京时间8点)。
  7. 脚本运行必须用 `2>/tmp/<name>_err.log > /tmp/<name>_raw.txt` 模式——`2>/dev/null` 会触发 0 字节 bug(见条目17)
维护
  • 定期检查API可用性
  • 根据市场调整股票池
  • 更新AKShare版本
  • 参考 `references/data-field-units.md` 查看各字段单位与典型值

[IMPORTANT: The user has invoked the "ttfund" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

name: ttfund

description: 天天基金Skills技能集合 – 16个基金类API技能,覆盖基金信息查询、基金经理、条件选基、重仓股、黄金行情、投顾策略、指数行情、基金净值、模拟交易、自选管理、债市行情、组合回测、基金搜索、股票股价、基金主题、活期宝

version: "1.0.0"

tags: [finance, fund, gold, tiantianfunds, 天天基金, 基金, 黄金]

天天基金Skills技能集合
前置条件
  • `TTFUND_APIKEY` 环境变量必须已配置
  • API Key 获取路径:天天基金App → 搜索 `skills` → 获取api key
统一调用信息
  • 网关地址:`https://skills.tiantianfunds.com/ai-smart-skill-service/openapi/skill/invoke`
  • 请求方式:`POST`
  • 鉴权 Header:`X-API-Key`
  • 请求体格式:JSON
  • 必填字段:每次请求都要同时传 `skill_id` 和 `_skill_version`
统一请求模板

“`bash

curl –location 'https://skills.tiantianfunds.com/ai-smart-skill-service/openapi/skill/invoke' \

–header "X-API-Key: $TTFUND_APIKEY" \

–header 'Content-Type: application/json' \

–data '{

"skill_id": "<SKILL_ID>",

"_skill_version": "<VERSION>",

…其他参数

}'

“`

16个技能速查表
# 技能名称 skill_id version 核心功能
1 天天基金信息 `FUND_BASE_INFOS` 1.2.0 基金综合信息查询(基础信息+净值+交易规则+费率)
2 天天基金经理信息 `FUND_MANAGER_INFO` 1.0.0 基金经理信息、在管产品、历史管理和业绩
3 天天条件选基 `FUND_CONDITION_SELECT` 1.1.0 按条件筛选基金(收益率/评级/规模/风险)
4 天天基金重仓股 `FUND_HOLDING_INFO` 1.0.0 基金持仓、重仓股债、行业配置与仓位
5 天天黄金行情 `FUND_HUAAN_GOLD_INFO` 1.0.0 黄金行情、宏观指标、风险指标、相关新闻
6 天天投顾策略 `FUND_TG_STRATEGY_INFO` 1.0.0 投顾策略基本信息、业绩、风险与持仓
7 天天指数行情 `FUND_INDEX_INFO` 1.0.0 指数点位、估值、成分和相关产品
8 天天基金净值 `FUND_NAV_INFO` 1.0.0 基金净值历史、累计净值、日涨跌幅和分红拆分
9 天天模拟交易 `MODEL_PORTFOLIO` 1.0.0 模拟组合列表/详情/持仓/收益/买入赎回/交易
10 天天自选管理 `FUND_FAVOR_ZX` 1.2.0 查询/新增/删除自选基金与自选投顾
11 天天债市行情 `BOND_MARKET` 1.0.0 利率债、信用债等债市行情快照
12 天天组合回测 `FUND_GROUP_BACKTEST` 1.0.0 查询/创建/修改并分析基金组合回测
13 天天基金搜索 `FUND_SEARCH` 1.0.0 基金/指数/基金经理/投顾策略搜索
14 天天股票股价查询 `FUND_STOCK_PRICE_QUERY` 1.0.0 股票实时行情查询
15 天天基金主题 `FUND_THEME_INFO` 1.0.0 基金主题查询(业绩/估值/资金流/成分股)
16 天天活期宝 `FUND_HUOQIBAO_LIST` 1.0.0 活期宝基金列表、排行与详情
技能详细参数
1. 天天基金信息 (FUND_BASE_INFOS v1.2.0)
请求字段 类型 必填 说明 示例
`fcode` string 与fund_name至少传一项 基金代码 `000001`
`fund_name` string 与fcode至少传一项 基金名称 `华夏核心成长混合C`
`nav_range` string 净值范围: y/3y/6y/n/2n/3n/ln `n`

示例:

“`json

{"skill_id":"FUND_BASE_INFOS","_skill_version":"1.2.0","fund_name":"华夏核心成长混合C","nav_range":"n"}

“`

2. 天天基金经理信息 (FUND_MANAGER_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`manager_id` string 与manager_name二选一 经理代码 `30189744`
`manager_name` string 与manager_id二选一 经理姓名 `张坤`

示例:

“`json

{"skill_id":"FUND_MANAGER_INFO","_skill_version":"1.0.0","manager_name":"张坤"}

“`

3. 天天条件选基 (FUND_CONDITION_SELECT v1.1.0)
请求字段 类型 必填 说明 示例
`pageIndex` integer 页码 `1`
`pageNum` integer 每页数量 `5`
`pageType` integer 页面类型 `1`
`orderField` string 排序字段 `5_6_-1`(近1年收益率倒序)
`rsfType` string 一级分类 `002`
`rsbType` string 二级分类 `002001`
`riskLevel` string 风险等级(逗号分隔) `3,4`
`fundLevel` string 基金评级(逗号分隔) `4,5`
`fundSize` string 规模筛选 `2,3`
`isBuy` string 是否可购 `1`
`isDt` string 是否支持定投 `1`
`stageSyl` string 阶段收益率 `6_0_50`
`annualStageSyl` string 年化收益率 `6_0_30`
`annualizedVolatility` string 年化波动率 `6_0_20`
`stageRanking` string 同类排名 `6_0_20`
`followIndex` string 跟踪指数代码 `000300`
`fcode` string 基金代码(逗号分隔) `000001,000006`
`bkcodes` string 主题板块代码 `000001`

常用orderField:近1年收益率倒序=`5_6_-1`,日涨跌幅倒序=`5_1_-1`

示例:

“`json

{"skill_id":"FUND_CONDITION_SELECT","_skill_version":"1.1.0","pageIndex":1,"pageNum":5,"pageType":1,"orderField":"5_6_-1"}

“`

4. 天天基金重仓股 (FUND_HOLDING_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`fund_id` string 基金代码或名称 `000001`
`report_period` string 报告期 `2025-Q4`
`holding_type` string 持仓类型: stock/bond/all `all`

示例:

“`json

{"skill_id":"FUND_HOLDING_INFO","_skill_version":"1.0.0","fund_id":"000001","holding_type":"all"}

“`

5. 天天黄金行情 (FUND_HUAAN_GOLD_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`query_scope` string 查询范围: gold/macro/risk/news/all `all`

示例:

“`json

{"skill_id":"FUND_HUAAN_GOLD_INFO","_skill_version":"1.0.0","query_scope":"all"}

“`

6. 天天投顾策略 (FUND_TG_STRATEGY_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`strategy_id` string 与strategy_name二选一 策略代码 `PEYCXNH`
`strategy_name` string 与strategy_id二选一 策略名称 `司南双月宝组合`
`query_scope` string 查询范围: basic/performance/composition/risk/all `all`

示例:

“`json

{"skill_id":"FUND_TG_STRATEGY_INFO","_skill_version":"1.0.0","strategy_name":"司南双月宝组合","query_scope":"all"}

“`

7. 天天指数行情 (FUND_INDEX_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`index_id` string 指数代码或名称 `沪深300`
`query_scope` string 查询范围: quote/valuation/composition/performance/products/all `all`
`time_range` string 历史业绩时间范围 `1y`

示例:

“`json

{"skill_id":"FUND_INDEX_INFO","_skill_version":"1.0.0","index_id":"沪深300","query_scope":"all","time_range":"1y"}

“`

8. 天天基金净值 (FUND_NAV_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`fund_id` string 基金代码或名称 `000001`
`range` string 净值范围: y/3y/6y/n/2n/3n/ln `n`

range枚举:y=近1月, 3y=近3月, 6y=近6月, n=近1年, 2n=近2年, 3n=近3年, ln=成立以来

示例:

“`json

{"skill_id":"FUND_NAV_INFO","_skill_version":"1.0.0","fund_id":"000001","range":"n"}

“`

9. 天天模拟交易 (MODEL_PORTFOLIO v1.0.0)

单skill多action路由。常用action对象:

action对象 说明
`subacc_list` 组合列表
`subacc_detail` 组合详情
`subacc_hold` 持仓查询
`subacc_profit_daily` 每日收益
`subacc_profit_monthly` 月度收益
`subacc_profit_interval_detail` 收益走势
`trade_buy_bulk_amount_v2` 买入(按金额)
`trade_redeem_bulk_percent` 赎回
`trade_list` 交易记录
`rebalance_record_list` 调仓记录
`rebalance_preview` 调仓预览

账户风格枚举:S1=激进型, S2=灵活型, S3=稳健型, Z1=活钱+, Z2=稳健理财, Z3=追求回报, Z4=牛人组合

组合类型:9=普通模拟组合, 666=普通定投, 777=组合宝, 888=策略定投, 8=模拟投顾

示例:

“`json

{"skill_id":"MODEL_PORTFOLIO","_skill_version":"1.0.0","action":"subacc.list","subacc_list":{"fetchDissolve":true}}

“`

10. 天天自选管理 (FUND_FAVOR_ZX v1.2.0)

支持action:zx_query(查询基金自选), zx_add(新增), zx_del(删除), zx_groups(分组), tg_query(查询投顾自选), tg_add(新增投顾), tg_del(删除投顾)

示例:

“`json

{"skill_id":"FUND_FAVOR_ZX","_skill_version":"1.2.0","action":"add","zx_add":{"fcode":"000001"}}

“`

11. 天天债市行情 (BOND_MARKET v1.0.0)

无业务参数,固定返回最新一期债市行情快照。

示例:

“`json

{"skill_id":"BOND_MARKET","_skill_version":"1.0.0"}

“`

12. 天天组合回测 (FUND_GROUP_BACKTEST v1.0.0)

支持action:bt_query(查询列表), bt_create(创建), bt_change_name(改名), bt_change_param(改参数), bt_backtest_date(可用时间), bt_detail_v2(详情), bt_asset_classify(资产分类), bt_heavy_hold(重仓), bt_fund_correlation(相关性)

注意:fundPercent必须为JSON字符串,持仓占比之和必须=100;写操作需传confirm_write=true

示例:

“`json

{"skill_id":"FUND_GROUP_BACKTEST","_skill_version":"1.0.0","action":"bt_detail_v2","bt_detail_v2":{"groupNo":"GROUP202604200001","fundPercent":"[{\"fundCode\":\"005827\",\"fundRation\":35},{\"fundCode\":\"110011\",\"fundRation\":65}]","groupAmount":10000,"modelType":0,"rebalanceMode":1,"startTime":"2024-01-01T00:00:00","endTime":"2026-04-20T00:00:00"}}

“`

13. 天天基金搜索 (FUND_SEARCH v1.0.0)
请求字段 类型 必填 说明 示例
`query` string 搜索关键词 `有色`
`search_type` string 搜索类型: fund/index/manager/strategy `fund`
`page_index` integer 页码 `1`
`page_size` integer 每页大小(基金/投顾默认10,指数默认20) `10`

示例:

“`json

{"skill_id":"FUND_SEARCH","_skill_version":"1.0.0","query":"有色","search_type":"fund","page_index":1,"page_size":10}

“`

14. 天天股票股价查询 (FUND_STOCK_PRICE_QUERY v1.0.0)
请求字段 类型 必填 说明 示例
`query` string 股票名称或代码 `东方财富`

示例:

“`json

{"skill_id":"FUND_STOCK_PRICE_QUERY","_skill_version":"1.0.0","query":"东方财富"}

“`

15. 天天基金主题 (FUND_THEME_INFO v1.0.0)
请求字段 类型 必填 说明 示例
`theme_code` string 与query至少传一项 主题代码 `BK000651`
`query` string 与theme_code至少传一项 主题名称关键词 `光模块`

示例:

“`json

{"skill_id":"FUND_THEME_INFO","_skill_version":"1.0.0","query":"光模块"}

“`

16. 天天活期宝 (FUND_HUOQIBAO_LIST v1.0.0)
请求字段 类型 必填 说明 示例
`fcode` string 基金代码 `000001`
`fund_name` string 基金名称 `华夏现金增利货币A`
`top_n` integer 返回前N只(1-100) `5`

示例:

“`json

{"skill_id":"FUND_HUOQIBAO_LIST","_skill_version":"1.0.0","top_n":5}

“`

使用流程
  1. 检查 `$TTFUND_APIKEY` 环境变量是否存在
  2. 若不存在,提示用户配置
  3. 根据用户意图选择合适的skill_id和参数
  4. 构造JSON请求体,POST到统一网关
  5. 解析返回结果,提炼核心信息展示
⚠️ 重要陷阱:环境变量不可用

`execute_code` 工具的 Python 沙箱中,`os.environ` 不包含 shell 环境变量。 `os.environ.get('TTFUND_APIKEY')` 返回空字符串,导致 API 调用静默失败(返回 `{"detail": "缺少 api-key"}`)。

正确做法: 必须使用 `terminal()` 工具执行 shell 命令(curl),因为 terminal 有完整的 shell 环境变量。

“`bash

✅ 正确:用 terminal + curl

terminal: curl -s –location 'https://skills.tiantianfunds.com/…' \

–header "X-API-Key: $TTFUND_APIKEY" \

–header 'Content-Type: application/json' \

–data '…' > /tmp/result.json

❌ 错误:execute_code 中的 subprocess/os.environ 无法获取环境变量
execute_code: os.environ.get('TTFUND_APIKEY') → "" (空!)

“`

批量调用模式: 多个 API 调用时,用 terminal 逐个执行 curl,保存到独立文件,再用 execute_code 解析 JSON 文件。

⚠️ FUND_HUOQIBAO_LIST Response Structure

Response path: `data.raw_result.body.data`

  • Array key is `items` (NOT `fundList` or `list`)
  • Yield field is `yield_7d_annualized` (NOT `sevenDayYield`)
  • Value is float (1.655 = 1.655%), NOT string
  • Also includes: `total_count`, `yield_date`, `top_n`, `risk_disclaimer`
  • See `financial-advisory` skill `references/ttfund-api-response-structures.md` for full structure.
⚠️ FUND_INDEX_INFO Response Structure (2026-06-02 实测)

Response path: `data.raw_result.body.data` → 包含 `performance`, `quote`, `valuation`, `composition`, `products`

`quote` 字段英文 key,不是 em_client 重命名后的中文 key):

“`json

{

"index_name": "沪深300",

"index_code": "000300",

"index_code_full": "000300.SH",

"current_point": 4882.02, // ← 不是 "收盘"

"change_pct": 0.78, // ← 不是 "涨跌幅%"

"change_point": 37.76, // ← 不是 "涨跌点"

"turnover_volume": 180435984,

"turnover_amount": 517179071600.9,

"quote_time": "2026-06-02",

"latest_nav_date": "2026-06-01 00:00:00",

"ytd_return": 4.6289 // ← 不是 "今年以来%"

}

“`

⚠️ 重要: 直接 curl ttfund API 拿到的是英文 key(`current_point`/`change_pct`/`change_point`/`ytd_return`);em_client.py 脚本会在内存中重命名为中文 key(`收盘`/`涨跌幅%`/`涨跌点`/`今年以来%`)放在 `em_client.index_quote` 字段。两个数据源并存时,字段名可能不一致,解析时要注意来源。

⚠️ FUND_THEME_INFO Response Structure

Response path: `data.raw_result.body.data`

  • `component_stocks` is a dict `{total_count, items[]}`, NOT a plain list
  • `fund_flow` values are in (not 亿), e.g. `-1504365109.0` = -15.04亿
  • `main_flow_in` is a string, not number
  • See `financial-advisory` skill `references/ttfund-api-response-structures.md` for full structure.
⚠️ FUND_NAV_INFO Response Structure(2026-06-03 实测)

路径: `data.raw_result.body.data` → 包含 `fund_profile` / `nav_history` / `disambiguation_candidates`

  • 关键:净值数组在 `nav_history.items[]`不是 `nav_list`(与早期文档不符)
  • `fund_profile`: `fund_code` / `fund_name` / `fund_type`
  • `nav_history.items[]` 每项: `FSRQ`(日期 YYYY-MM-DD)/ `DWJZ`(单位净值,字符串需 float())/ `JZZZL`(日涨跌幅%,字符串)/ `LJJZ`(累计净值)/ `NAVTYPE` / `RATE`
  • items 默认按 `FSRQ` 升序排列(最早→最近),取最新一天需 `sorted(…, key=lambda x: x['FSRQ'], reverse=True)[0]`
  • 计算近1周/近1月涨幅:`items[0]['DWJZ']` vs `items[4]['DWJZ']` / `items[21]['DWJZ']`,记得 `float()` 转换
  • range 参数: `y`=近1月, `3y`=近3月, `6y`=近6月, `n`=近1年, `2n`=近2年, `3n`=近3年, `ln`=成立以来
  • 批量自选基金净值跟踪 模板:循环 `curl … > /tmp/nav_<fcode>.json` + `glob` + execute_code 解析。禁止 `curl | python3 -c` pipe(沙箱拦截)。FUND_NAV_INFO 调用间隔 0.3s 避免限流。
⚠️ FUND_THEME_INFO 关键词命中率(2026-06-05 实测)

`FUND_THEME_INFO` 的 `query` 字段对核心主线关键词大面积返回空——必须使用同义词才能命中。

关键词 (query) 结果 备注
`CPO光模块` ❌ `{"detail":"未找到匹配结果"}` 改用 `光模块`
`光模块` ✅ BK000651 完整数据(quote/valuation/fund_flow/component_stocks/summary)
`半导体` ❌ `theme_code=None`, `quote/valuation/summary` 全空 改用 `芯片`
`芯片` ✅ BK000642 **注意:实际是"存储芯片"**,非广义半导体
`算力` ✅ BK000601 AI 算力链
`人工智能` ✅ BK000217 主题库最稳
`红利` ❌ `{"detail":"未找到匹配结果"}` 主题库未覆盖
`中证红利` ❌ `{"detail":"未找到匹配结果"}` 同上
`红利低波` ❌ `{"detail":"未找到匹配结果"}` 同上

根因: ttfund 主题库的 query 字段不支持组合词和宽泛行业词——必须是明确单字/双字热点名称。"半导体"在主题库是空类目,"芯片"映射到 BK000642(存储芯片子集,含北方华创/兆易创新/澜起/中芯国际等),能覆盖大部分"半导体/芯片"分析需求。

可用主题线(4 条): CPO/光模块、AI算力/人工智能、芯片(存储)。不可用主题线(2 条): 半导体(用芯片替代)、红利/红利低波(用 `FUND_INDEX_INFO index_id="中证红利"` 或具体基金代码 `FUND_NAV_INFO` 替代)。

报告会诊时: 遇到 `theme_code` 为 None 或返回 `{"detail":"未找到匹配结果"}`,立刻换同义词重试或切到指数/基金代码路径,不要在报告里写"无数据"然后继续

⚠️ ETF联接基金持仓查询陷阱

ETF联接基金(如 006328 易方达中证海外互联网50ETF联接C)查询 `FUND_HOLDING_INFO` 时,`top_holdings.stock` 返回 `null`,因为联接基金主要投资于对应的ETF,不直接持有股票。

正确做法: 从响应中提取 `top_holdings.etf_code`,再用该ETF代码查询实际股票持仓。

“`bash

第一步:查询联接基金,获取底层ETF代码

curl … FUND_HOLDING_INFO fund_id=006328

响应: top_holdings.etf_code = "513050", etf_shortname = "中概互联网ETF易方达"
第二步:用ETF代码查询实际股票持仓

curl … FUND_HOLDING_INFO fund_id=513050

响应: top_holdings.stock = [腾讯30.65%, 阿里26.06%, …]

“`

识别ETF联接基金的方法: `fund_type` 包含 "ETF联接" 字样。

错误处理
  • 缺少api key → 提示用户配置TTFUND_APIKEY
  • HTTP失败 → 提示稍后重试
  • 业务错误 → 简要说明,不伪造结果
  • 用户信息校验失败 → 提示前往天天skill首页刷新用户信息
  • 版本落后 → 提示升级skill
安全与边界
  • 返回数据不构成投资建议
  • 不伪造结果或输出未验证内容
  • 搜索结果仅用于候选检索,不自动串联详情

[IMPORTANT: The user has invoked the "akshare-stock" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

name: akshare-stock

description: A股量化数据分析工具,基于AkShare库获取A股行情、财务数据、板块信息等。用于回答关于A股股票查询、行情数据、财务分析、选股等问题。

A股量化 – AkShare 数据接口
快速开始

安装依赖:

“`bash

pip install akshare

“`

支持的功能
1. 实时行情查询

“`python

import akshare as ak

个股实时行情

stock_zh_a_spot_em()

stock_zh_a_spot_em(symbol="北证A股")

“`

2. 历史K线数据

“`python

import akshare as ak

日K线

stock_zh_a_hist(symbol="000001", period="daily", start_date="20240101", end_date="20241231", adjust="qfq")

周K线

stock_zh_a_hist(symbol="000001", period="weekly", start_date="20240101", end_date="20241231", adjust="qfq")

月K线

stock_zh_a_hist(symbol="000001", period="monthly", start_date="20240101", end_date="20241231", adjust="qfq")

“`

3. 财务数据

“`python

import akshare as ak

财务报表

stock_financial_abstract_ths(symbol="000001", indicator="按报告期")

主要财务指标

stock_financial_analysis_indicator(symbol="000001")

“`

4. 板块/行业分析

“`python

import akshare as ak

行业板块行情

stock_board_industry_name_em()

概念板块行情

stock_board_concept_name_em()

板块内个股

stock_board_industry_cons_em(symbol="半导体")

“`

5. 资金流向

“`python

import akshare as ak

个股资金流向

stock_individual_fund_flow(stock="000001", market="sh")

大单净流入

stock_individual_fund_flow(stock="000001", market="sh", symbol="大单净流入")

“`

6. 龙虎榜

“`python

import akshare as ak

每日龙虎榜

stock_lhb_detail_em(date="20240930")

机构调研

stock_zlzj_em()

“`

7. 新股/IPO

“`python

import akshare as ak

新股申购

stock_new_ipo_em()

待上市新股

stock_new_ipo_start_em()

“`

8. 融资融券

“`python

import akshare as ak

融资融券

stock_margin_sse(symbol="600000")

融资融券明细

stock_rzrq_detail_em(symbol="600000", date="20240930")

“`

常用股票代码
  • 平安银行: 000001
  • 贵州茅台: 600519
  • 宁德时代: 300750
  • 比亚迪: 002594
  • 招商银行: 600036
备选方案: Baostock

如果 AkShare 安装失败,可使用 baostock(更轻量):

“`python

import baostock as bs

登录

lg = bs.login()

print(lg.error_msg)

获取历史K线

rs = bs.query_history_k_data_plus('sh.600519',

'date,code,open,high,low,close,volume',

start_date='20250101',

end_date='20251231')

data_list = []

while rs.next:

data_list.append(rs.get_row_data())

bs.logout()

“`

注意事项
  1. 数据仅供学术研究,不构成投资建议
  2. 接口可能因目标网站变动而失效
  3. 建议添加异常处理和重试机制
  4. 当前环境网络问题可能导致测试失败,请在本地环境测试

[IMPORTANT: The user has invoked the "stock-analysis" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

name: stock-analysis

description: Analyze stocks and cryptocurrencies using Yahoo Finance data. Supports portfolio management, watchlists with alerts, dividend analysis, 8-dimension stock scoring, viral trend detection (Hot Scanner), and rumor/early signal detection. Use for stock analysis, portfolio tracking, earnings reactions, crypto monitoring, trending stocks, or finding rumors before they hit mainstream.

version: 6.2.0

homepage: https://finance.yahoo.com

commands:

– /stock – Analyze a stock or crypto (e.g., /stock AAPL)

– /stock_compare – Compare multiple tickers

– /stock_dividend – Analyze dividend metrics

– /stock_watch – Add/remove from watchlist

– /stock_alerts – Check triggered alerts

– /stock_hot – Find trending stocks & crypto (Hot Scanner)

– /stock_rumors – Find early signals, M&A rumors, insider activity (Rumor Scanner)

– /portfolio – Show portfolio summary

– /portfolio_add – Add asset to portfolio

metadata: {"clawdbot":{"emoji":"📈","requires":{"bins":["uv"],"env":[]},"install":[{"id":"uv-brew","kind":"brew","formula":"uv","bins":["uv"],"label":"Install uv (brew)"}]}}

Stock Analysis v6.1

Analyze US stocks and cryptocurrencies with 8-dimension analysis, portfolio management, watchlists, alerts, dividend analysis, and viral trend detection.

What's New in v6.2
  • 🔮 Rumor Scanner — Early signals before mainstream news

– M&A rumors and takeover bids

– Insider buying/selling activity

– Analyst upgrades/downgrades

– Twitter/X "hearing that…", "sources say…" detection

  • 🎯 Impact Scoring — Rumors ranked by potential market impact
What's in v6.1
  • 🔥 Hot Scanner — Find viral stocks & crypto across multiple sources
  • 🐦 Twitter/X Integration — Social sentiment via bird CLI
  • 📰 Multi-Source Aggregation — CoinGecko, Google News, Yahoo Finance
  • Cron Support — Daily trend reports
What's in v6.0
  • 🆕 Watchlist + Alerts — Price targets, stop losses, signal changes
  • 🆕 Dividend Analysis — Yield, payout ratio, growth, safety score
  • 🆕 Fast Mode — `–fast` skips slow analyses (insider, news)
  • 🆕 Improved Performance — `–no-insider` for faster runs
Quick Commands
Stock Analysis

“`bash

Basic analysis

uv run {baseDir}/scripts/analyze_stock.py AAPL

Fast mode (skips insider trading & breaking news)

uv run {baseDir}/scripts/analyze_stock.py AAPL –fast

Compare multiple

uv run {baseDir}/scripts/analyze_stock.py AAPL MSFT GOOGL

Crypto

uv run {baseDir}/scripts/analyze_stock.py BTC-USD ETH-USD

“`

Dividend Analysis (NEW v6.0)

“`bash

Analyze dividends

uv run {baseDir}/scripts/dividends.py JNJ

Compare dividend stocks

uv run {baseDir}/scripts/dividends.py JNJ PG KO MCD –output json

“`

Dividend Metrics:

  • Dividend Yield & Annual Payout
  • Payout Ratio (safe/moderate/high/unsustainable)
  • 5-Year Dividend Growth (CAGR)
  • Consecutive Years of Increases
  • Safety Score (0-100)
  • Income Rating (excellent/good/moderate/poor)
Watchlist + Alerts (NEW v6.0)

“`bash

Add to watchlist

uv run {baseDir}/scripts/watchlist.py add AAPL

With price target alert

uv run {baseDir}/scripts/watchlist.py add AAPL –target 200

With stop loss alert

uv run {baseDir}/scripts/watchlist.py add AAPL –stop 150

Alert on signal change (BUY→SELL)

uv run {baseDir}/scripts/watchlist.py add AAPL –alert-on signal

View watchlist

uv run {baseDir}/scripts/watchlist.py list

Check for triggered alerts

uv run {baseDir}/scripts/watchlist.py check

uv run {baseDir}/scripts/watchlist.py check –notify # Telegram format

Remove from watchlist

uv run {baseDir}/scripts/watchlist.py remove AAPL

“`

Alert Types:

  • 🎯 Target Hit — Price >= target
  • 🛑 Stop Hit — Price <= stop
  • 📊 Signal Change — BUY/HOLD/SELL changed
Portfolio Management

“`bash

Create portfolio

uv run {baseDir}/scripts/portfolio.py create "Tech Portfolio"

Add assets

uv run {baseDir}/scripts/portfolio.py add AAPL –quantity 100 –cost 150

uv run {baseDir}/scripts/portfolio.py add BTC-USD –quantity 0.5 –cost 40000

View portfolio

uv run {baseDir}/scripts/portfolio.py show

Analyze with period returns

uv run {baseDir}/scripts/analyze_stock.py –portfolio "Tech Portfolio" –period weekly

“`

🔥 Hot Scanner (NEW v6.1)

“`bash

Full scan – find what's trending NOW

python3 {baseDir}/scripts/hot_scanner.py

Fast scan (skip social media)

python3 {baseDir}/scripts/hot_scanner.py –no-social

JSON output for automation

python3 {baseDir}/scripts/hot_scanner.py –json

“`

Data Sources:

  • 📊 CoinGecko Trending — Top 15 trending coins
  • 📈 CoinGecko Movers — Biggest gainers/losers
  • 📰 Google News — Finance & crypto headlines
  • 📉 Yahoo Finance — Gainers, losers, most active
  • 🐦 Twitter/X — Social sentiment (requires auth)

Output:

  • Top trending by mention count
  • Crypto highlights with 24h changes
  • Stock movers by category
  • Breaking news with tickers

Twitter Setup (Optional):

  1. Install bird: `npm install -g @steipete/bird`
  2. Login to x.com in Safari/Chrome
  3. Create `.env` with `AUTH_TOKEN` and `CT0`
🔮 Rumor Scanner (NEW v6.2)

“`bash

Find early signals, M&A rumors, insider activity

python3 {baseDir}/scripts/rumor_scanner.py

“`

What it finds:

  • 🏢 M&A Rumors — Merger, acquisition, takeover bids
  • 👔 Insider Activity — CEO/Director buying/selling
  • 📊 Analyst Actions — Upgrades, downgrades, price target changes
  • 🐦 Twitter Whispers — "hearing that…", "sources say…", "rumor"
  • ⚖️ SEC Activity — Investigations, filings

Impact Scoring:

  • Each rumor is scored by potential market impact (1-10)
  • M&A/Takeover: +5 points
  • Insider buying: +4 points
  • Upgrade/Downgrade: +3 points
  • "Hearing"/"Sources say": +2 points
  • High engagement: +2 bonus

Best Practice: Run at 07:00 before US market open to catch pre-market signals.

Analysis Dimensions (8 for stocks, 3 for crypto)
Stocks
Dimension Weight Description
Earnings Surprise 30% EPS beat/miss
Fundamentals 20% P/E, margins, growth
Analyst Sentiment 20% Ratings, price targets
Historical 10% Past earnings reactions
Market Context 10% VIX, SPY/QQQ trends
Sector 15% Relative strength
Momentum 15% RSI, 52-week range
Sentiment 10% Fear/Greed, shorts, insiders
Crypto
  • Market Cap & Category
  • BTC Correlation (30-day)
  • Momentum (RSI, range)
Sentiment Sub-Indicators
Indicator Source Signal
Fear & Greed CNN Contrarian (fear=buy)
Short Interest Yahoo Squeeze potential
VIX Structure Futures Stress detection
Insider Trades SEC EDGAR Smart money
Put/Call Ratio Options Sentiment extreme
Risk Detection
  • ⚠️ Pre-Earnings — Warns if < 14 days to earnings
  • ⚠️ Post-Spike — Flags if up >15% in 5 days
  • ⚠️ Overbought — RSI >70 + near 52w high
  • ⚠️ Risk-Off — GLD/TLT/UUP rising together
  • ⚠️ Geopolitical — Taiwan, China, Russia, Middle East keywords
  • ⚠️ Breaking News — Crisis keywords in last 24h
Performance Options
Flag Effect Speed
(default) Full analysis 5-10s
`–no-insider` Skip SEC EDGAR 3-5s
`–fast` Skip insider + news 2-3s
Supported Cryptos (Top 20)

BTC, ETH, BNB, SOL, XRP, ADA, DOGE, AVAX, DOT, MATIC, LINK, ATOM, UNI, LTC, BCH, XLM, ALGO, VET, FIL, NEAR

(Use `-USD` suffix: `BTC-USD`, `ETH-USD`)

Data Storage
File Location
Portfolios `~/.clawdbot/skills/stock-analysis/portfolios.json`
Watchlist `~/.clawdbot/skills/stock-analysis/watchlist.json`
Limitations
  • Yahoo Finance may lag 15-20 minutes
  • Short interest lags ~2 weeks (FINRA)
  • Insider trades lag 2-3 days (SEC filing)
  • US markets only (non-US incomplete)
  • Breaking news: 1h cache, keyword-based
Disclaimer

⚠️ NOT FINANCIAL ADVICE. For informational purposes only. Consult a licensed financial advisor before making investment decisions.

[IMPORTANT: The user has invoked the "data-analysis" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]

name: Data Analysis

slug: data-analysis

version: 1.0.2

homepage: https://clawic.com/skills/data-analysis

description: "Data analysis and visualization. Query databases, generate reports, automate spreadsheets, and turn raw data into clear, actionable insights. Use when (1) you need to analyze, visualize, or explain data; (2) the user wants reports, dashboards, or metrics turned into a decision; (3) the work involves SQL, Python, spreadsheets, BI tools, or notebooks; (4) you need to compare segments, cohorts, funnels, experiments, or time periods; (5) the user explicitly installs or references the skill for the current task."

changelog: Added metric contracts, chart guidance, and decision brief templates for more reliable analysis.

metadata: {"clawdbot":{"emoji":"D","requires":{"bins":[]},"os":["linux","darwin","win32"]}}

When to Use

Use this skill when the user needs to analyze, explain, or visualize data from SQL, spreadsheets, notebooks, dashboards, exports, or ad hoc tables.

Use it for KPI debugging, experiment readouts, funnel or cohort analysis, anomaly reviews, executive reporting, and quality checks on metrics or query logic.

Prefer this skill over generic coding or spreadsheet help when the hard part is analytical judgment: metric definition, comparison design, interpretation, or recommendation.

User asks about: analyzing data, finding patterns, understanding metrics, testing hypotheses, cohort analysis, A/B testing, churn analysis, or statistical significance.

Core Principle

Analysis without a decision is just arithmetic. Always clarify: What would change if this analysis shows X vs Y?

Methodology First

Before touching data:

  1. What decision is this analysis supporting?
  2. What would change your mind? (the real question)
  3. What data do you actually have vs what you wish you had?
  4. What timeframe is relevant?
Statistical Rigor Checklist
  • [ ] Sample size sufficient? (small N = wide confidence intervals)
  • [ ] Comparison groups fair? (same time period, similar conditions)
  • [ ] Multiple comparisons? (20 tests = 1 "significant" by chance)
  • [ ] Effect size meaningful? (statistically significant != practically important)
  • [ ] Uncertainty quantified? ("12-18% lift" not just "15% lift")
Architecture

This skill does not require local folders, persistent memory, or setup state.

Use the included reference files as lightweight guides:

  • `metric-contracts.md` for KPI definitions and caveats
  • `chart-selection.md` for visual choice and chart anti-patterns
  • `decision-briefs.md` for stakeholder-facing outputs
  • `pitfalls.md` and `techniques.md` for analytical rigor and method choice
Quick Reference

Load only the smallest relevant file to keep context focused.

Topic File
Metric definition contracts `metric-contracts.md`
Visual selection and chart anti-patterns `chart-selection.md`
Decision-ready output formats `decision-briefs.md`
Failure modes to catch early `pitfalls.md`
Method selection by question type `techniques.md`
Core Rules
1. Start from the decision, not the dataset
  • Identify the decision owner, the question that could change a decision, and the deadline before doing analysis.
  • If no decision would change, reframe the request before computing anything.
2. Lock the metric contract before calculating
  • Define entity, grain, numerator, denominator, time window, timezone, filters, exclusions, and source of truth.
  • If any of those are ambiguous, state the ambiguity explicitly before presenting results.
3. Separate extraction, transformation, and interpretation
  • Keep query logic, cleanup assumptions, and analytical conclusions distinguishable.
  • Never hide business assumptions inside SQL, formulas, or notebook code without naming them in the write-up.
4. Choose visuals to answer a question
  • Select charts based on the analytical question: trend, comparison, distribution, relationship, composition, funnel, or cohort retention.
  • Do not add charts that make the deck look fuller but do not change the decision.
5. Brief every result in decision format
  • Every output should include the answer, evidence, confidence, caveats, and recommended next action.
  • If the output is going to a stakeholder, translate the method into business implications instead of leading with technical detail.
6. Stress-test claims before recommending action
  • Segment by obvious confounders, compare the right baseline, quantify uncertainty, and check sensitivity to exclusions or time windows.
  • Strong-looking numbers without robustness checks are not decision-ready.
7. Escalate when the data cannot support the claim
  • Block or downgrade conclusions when sample size is weak, the source is unreliable, definitions drifted, or confounding is unresolved.
  • It is better to say "unknown yet" than to produce false confidence.
Common Traps
  • Reusing a KPI name after changing numerator, denominator, or exclusions -> trend comparisons become invalid.
  • Comparing daily, weekly, and monthly grains in one chart -> movement looks real but is mostly aggregation noise.
  • Showing percentages without underlying counts -> leadership overreacts to tiny denominators.
  • Using a pretty chart instead of the right chart -> the output looks polished but hides the actual decision signal.
  • Hunting for interesting cuts after seeing the result -> narrative follows chance instead of evidence.
  • Shipping automated reports without metric owners or caveats -> bad numbers spread faster than they can be corrected.
  • Treating observational patterns as causal proof -> action plans get built on correlation alone.
Approach Selection
Question type Approach Key output
"Is X different from Y?" Hypothesis test p-value + effect size + CI
"What predicts Z?" Regression/correlation Coefficients + R² + residual check
"How do users behave over time?" Cohort analysis Retention curves by cohort
"Are these groups different?" Segmentation Profiles + statistical comparison
"What's unusual?" Anomaly detection Flagged points + context

For technique details and when to use each, see `techniques.md`.

Output Standards
  1. Lead with the insight, not the methodology
  2. Quantify uncertainty – ranges, not point estimates
  3. State limitations – what this analysis can't tell you
  4. Recommend next steps – what would strengthen the conclusion
Red Flags to Escalate
  • User wants to "prove" a predetermined conclusion
  • Sample size too small for reliable inference
  • Data quality issues that invalidate analysis
  • Confounders that can't be controlled for
External Endpoints

This skill makes no external network requests.

Endpoint Data Sent Purpose
None None N/A

No data is sent externally.

Security & Privacy

Data that leaves your machine:

  • Nothing by default.

Data that stays local:

  • Nothing by default.

This skill does NOT:

  • Access undeclared external endpoints.
  • Store credentials or raw exports in hidden local memory files.
  • Create or depend on local folder systems for persistence.
  • Create automations or background jobs without explicit user confirmation.
  • Rewrite its own instruction source files.
Related Skills

Install with `clawhub install <slug>` if user confirms:

  • `sql` – query design and review for reliable data extraction.
  • `csv` – cleanup and normalization for tabular inputs before analysis.
  • `dashboard` – implementation patterns for KPI visualization layers.
  • `report` – structured stakeholder-facing deliverables after analysis.
  • `business-intelligence` – KPI systems and operating cadence beyond one-off analysis.
Feedback
  • If useful: `clawhub star data-analysis`
  • Stay updated: `clawhub sync`

The user has provided the following instruction alongside the skill invocation: [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more.]

你是专业投顾分析师,服务灵活配置型投资者核心关注方向:科技 / CPO(光模块) / 红利基金 / 芯片 / 半导体。现在是北京时间晚上22:30,A股已收盘,美股交易中,请执行以下步骤生成【夜间复盘】:

  1. 加载 financial-advisory skill 和 ttfund skill

1.5 【2026-06-10 新增】本任务已加载以下 3 个新 skill(按需使用,不要每次都跑全):

akshare-stock (v1.0.1): A股量化/技术指标/板块分析。重要:本机东方财富 em 接口被封,`*_em()` 系列不可用 → 改用 baostock 兜底(已装在 venv,详见 4.5 段)

stock-analysis (v6.2.0): 美股/港股 Yahoo Finance 数据,8 维评分、投资组合、传闻扫描(用 Yahoo Finance 走海外 API,不受东财封禁影响)

data-analysis (v1.0.2): 通用数据分析/SQL/Python,可视化、历史回测、相关性矩阵(适合"过去 60 日主线 vs 红利 相关性"等分析)

  1. 运行数据采集脚本(已优化,带超时控制):

– python3 ~/.hermes/scripts/finance/em_client.py 2>/tmp/em_err.log > /tmp/em_raw.txt

– python3 ~/.hermes/scripts/finance/news_scanner.py 2>/tmp/news_err.log > /tmp/news_raw.txt

– python3 ~/.hermes/scripts/finance/signal_generator.py 2>/tmp/signal_err.log > /tmp/signal_raw.txt

2.5 【框架必需】采集宏观定位数据(美元-利率二维象限 + 3 级预警):

– 美元指数 DXY:em_client.us_market(推送中的 DJI/S&P/NDX 不含 DXY 时用 web_search "DXY 美元指数 今日 收盘")

– 10Y 美债收益率:web_search "10年期美债收益率 今日 收盘"

– CME 12月利率概率:web_search "CME FedWatch 12月 加息概率 维持"(关键退出触发)

– TMT 成交占比:从 em_client.industry_sectors 计算 (电子+计算机+传媒+通信 成交额) / 全A 成交额 × 100%

– 融资余额 5 日累计:em_client 没有就用 web_search "沪深两市融资余额 5日 累计净流出"

– 主流板块 PE 分位:CPO/半导体/AI 算力,从 em_client.index_quote 或 FUND_THEME_INFO

– 科创 50 5ma/20ma 状态:em_client.index_quote 科创50 收盘价 vs 5/20 日均线

  1. 用 execute_code 解析数据(正则提取 —JSON_DATA_START— 和 —JSON_DATA_END— 之间的JSON)
  2. 补充天天基金技能API查询(选择性调用):

– 科技主题:# 同义词修正:CPO光模块❌ → 光模块✅

– curl …/skill/invoke -d '{"skill_id":"FUND_THEME_INFO","query":"光模块"}'

– 半导体主题:# 同义词修正:半导体❌ → 芯片✅(实际为存储芯片子集)

– curl …/skill/invoke -d '{"skill_id":"FUND_THEME_INFO","query":"芯片"}'

– 红利主题:# 红利无对应主题查询,改用指数

– curl …/skill/invoke -d '{"skill_id":"FUND_INDEX_INFO","index_id":"中证红利"}'

– 自选基金:curl FUND_FAVOR_ZX action="query" zx_query={}

– 活期宝TOP5:curl FUND_HUOQIBAO_LIST top_n=5

(统一网关: https://skills.tiantianfunds.com/ai-smart-skill-service/openapi/skill/invoke,Header: X-API-Key: $TTFUND_APIKEY)4.5 【多源数据补充,按需调用】

a) baostock 兜底(个股K线/技术指标):当复盘提到的龙头股需要技术面验证时(如北方华创 002371/中际旭创 300308/中芯国际 688981),用 baostock 拉日 K 线 + 算 MA5/MA20/MACD/RSI:

“`python

import baostock as bs

bs.login()

rs = bs.query_history_k_data_plus('sz.002371',

'date,open,high,low,close,volume',

start_date='20260401', end_date='20260610', frequency='d', adjustflag='2')

bs.logout()

“`

b) stock-analysis 美股盘后(重要):调用 stock-analysis 查 NVDA/TSM/AAPL/MSFT/GOOG/META 实时报价 + 8 维评分 + 隔夜新闻 + 传闻扫描——美股科技股是 CPO/AI 算力主线的核心驱动

c) data-analysis 历史回测(可选,~30s):跑"过去 60 个交易日,CPO/半导体/AI 算力/红利 4 大主线 vs 北向资金 + 融资余额 5 日累计" 多因子回归,识别最稳主线

  1. web_search搜索晚间财经消息补充(关键词:CPO 半导体 芯片 AI算力 红利基金 美股科技股)
  2. 【框架定位】根据第 2.5 步采集的数据,先定位市场环境:

a) 象限定位(4选1):

– Ⅰ 双宽松:DXY<99 + 10Y美债<4.0%

– Ⅱ 双紧缩:DXY>100 + 10Y美债>4.3% ← 当前最可能

– Ⅲ 剪刀差A:DXY<99 + 10Y美债>4.3%(周期/资源强势)

– Ⅳ 剪刀差B:DXY>100 + 10Y美债<4.0%(新兴市场债/A股红利机会)

b) 警报等级(3级):

– L1 绿:TMT成交占比<35% + PE分位<70% + 融资5日累计净流入

– L2 黄:上述任1触发(TMT>40% / PE>90% / 融资5日累计-300亿)

– L3 红:上述任2触发(TMT>47% / PE>95% / 融资单日-200亿 / CME加息概率>50% / DXY周涨幅>2%)

  1. 综合生成夜间复盘(板块按科技→CPO→芯片/半导体→AI算力→红利→债市→黄金(仅作对冲参考)排序),并在末尾追加【🎯 框架定位与决策建议】模块:

📊 【夜间复盘】YYYY-MM-DD

🚀 科技/CPO/芯片/半导体全天复盘(板块涨跌幅/主力资金/龙头股异动/ETF资金流向)

💎 红利基金与底仓(中证红利/红利低波 全天表现+股息率+估值分位)

🏛️ 指数全天总结(沪深300/中证500/科创50/创业板指 收盘价+涨跌幅+PE分位)

💰 基金复盘(科技/半导体/红利/CPO类基金TOP5、近1年收益排行)

🔍 自选基金动态(用户自选基金净值更新/涨跌排名)

⚡ 技术信号复盘(CPO/半导体/科技ETF 的MACD/KDJ/RSI、基金净值动量)

🌍 夜盘关注(美股科技股/英伟达/台积电ADR表现,仅作情绪指标参考)

🥇 黄金(仅作对冲参考,一行带过:沪金收盘+涨跌,不作核心分析)

📰 晚间消息(科技/CPO/AI/国产替代/芯片政策 相关优先)

🎯 【框架定位与决策建议】⚠️ 必填段(基于第 6 步象限+警报):

┌─ 宏观定位 ─────────────────────────────

│ DXY: __ / 10Y美债: __ / CME 12月加息概率: __%

│ 中美 10Y 利差: __

│ 象限: Ⅰ Ⅱ Ⅲ Ⅳ

├─ 信号灯 ───────────────────────────────

│ TMT 成交占比: __% (5年峰值 47.73%)

│ 融资余额 5日累计: __亿

│ 主流板块 PE 分位: CPO __% / 半导体 __% / AI 算力 __%

│ 警报等级: L1 绿 / L2 黄 / L3 红

├─ 持仓配置建议(L3 状态下参考)─────────

│ • 科技/CPO/芯片/AI 算力: 30%(L3上限)

│ • 红利+价值(风格对冲): 30%

│ • 黄金(对冲参考): 5%

│ • 现金/短债: 30%

│ • 其他(有色/能源底仓): 5%

├─ 退出触发条件(设红线,不犹豫)─────

│ ❶ 美联储 6/18 FOMC 意外转鹰 → 清仓科技

│ ❷ 科创 50 跌破 5ma 连续 3 日 → 视同上证顶部

│ ❸ 长鑫存储上市公告 → 评估 1 周内止盈半导体

│ ❹ 美元 DXY>103 或周涨幅>2% → 减有色至 0

│ ❺ 北美科技巨头 AI capex 同比转负 → 立即清仓

├─ 错误记录 ─────────────────────────────

│ 上周判断: __

│ 实际市场: __

│ 偏差: __

│ 本周修正: __

└──────────────────────────────────────

🎯 明日展望(主线(科技/CPO/芯片)配置建议、底仓(红利)加减仓建议、债市/黄金对冲建议

📊 可选:如果你希望飞书用户收到深色卡片式 PDF 报告(强烈建议输出),在报告最后附加一个结构化 JSON 块:

—REPORT_JSON_START—

{

"title": "【夜间复盘】YYYY-MM-DD",

"date": "YYYY-MM-DD",

"weekday": "周五",

"data_time": "12:30",

"gold": {

"sge_benchmark": {"price": 974.87, "change_pct": 0.17},

"au9999": {"close": 974.50, "change_pct": 0.17},

"etf_avg": {"price": 7.85, "change_pct": 0.10},

"central_bank": {"holdings": "7464万oz", "trend": "持续增持"},

"macro": {"dxy": 99.45, "vix": 16.06, "us10y": 4.47, "cn10y": 1.70}

},

"indices": [

{"name": "沪深300", "price": 4899.10, "change_pct": -0.12, "pe_ttm": 14.55, "pe_percentile": 96.45},

{"name": "中证500", "price": 8367.37, "change_pct": 0.13, "pe_ttm": 36.75, "pe_percentile": 94.71},

{"name": "上证50", "price": 2899.08, "change_pct": 0.27, "pe_ttm": 11.15, "pe_percentile": 73.31}

],

"sectors": [

{"name": "通信设备", "change_pct": 2.5},

{"name": "半导体", "change_pct": 1.8},

{"name": "计算机", "change_pct": 1.2},

{"name": "医药", "change_pct": 0.6}

],

"funds_top": [

{"code": "457001", "name": "国富亚洲机会股票(QDII)A", "change_pct": 2.00, "category": "QDII"},

{"code": "021662", "name": "国富亚洲机会股票(QDII)C", "change_pct": 2.00, "category": "QDII"}

],

"funds_bottom": [

{"code": "001956", "name": "国联安科技动力", "change_pct": -5.84, "category": "股票型"},

{"code": "008382", "name": "融通产业趋势股票", "change_pct": -5.34, "category": "股票型"}

],

"news": [

{"tag": "CPO", "title": "800G光模块需求超预期,龙头股单季报亮眼"},

{"tag": "芯片", "title": "存储芯片价格Q3有望触底反弹,机构看好"},

{"tag": "宏观", "title": "美联储6月议息会议维持利率不变概率96%"}

],

"actions": [

{"type": "sell", "badge": "L3·减仓", "title": "科技/CPO主线(高位)", "reason": "DXY破100+TMT成交占比高位+PE>95%", "suggestion": "主线仓位降至30%"},

{"type": "buy", "badge": "对冲加仓", "title": "红利低波ETF", "reason": "L3防御配置+风格对冲", "suggestion": "加至30%"},

{"type": "hold", "badge": "维持", "title": "黄金对冲", "reason": "5%底仓对冲", "suggestion": "不变"},

{"type": "buy", "badge": "现金", "title": "活期宝/短债", "reason": "L3需30%现金等反转", "suggestion": "加至30%"},

{"type": "buy", "badge": "建议加仓", "title": "科技/CPO主线(逢回调)", "reason": "AI算力+800G/1.6T光模块需求持续验证", "suggestion": "维持科技仓位50-60%,CPO龙头回调时分批加仓"},

{"type": "hold", "badge": "建议持有", "title": "红利底仓", "reason": "PE 8.46绝对低位,防御属性", "suggestion": "维持30%红利低波底仓,不轻易减"},

{"type": "sell", "badge": "建议减仓", "title": "高估值科技基金(PE>90%分位)", "reason": "PE分位95%+极端高位", "suggestion": "减仓1/3锁定利润,切换至平衡型"}

]

}

—REPORT_JSON_END—

字段说明

  • `gold.*` 黄金(sge_benchmark 上海金/Au99.99/etf_avg ETF/central_bank 央行储备/macro 美元VIX美10Y中10Y)
  • `indices` 指数列表(name/price/change_pct/pe_ttm/pe_percentile 10年分位)
  • `sectors` 领涨板块TOP4
  • `funds_top` / `funds_bottom` 日涨/跌幅基金各前5
  • `news` 重点资讯 tag+title(tag 可选:黄金/CPO/芯片/AI/宏观/红利)
  • `actions` 操作建议(type: buy/hold/sell,badge 自定义文案)
  • 未提供时 系统自动降级到 markdown 渲染(仍美观)
  • 板块/行情字段缺失时(如非交易时段)可省略对应字段

⚠️ 免责声明:以上分析仅供参考,不构成投资建议。

Error

“`

RuntimeError: HTTP 529: 当前服务集群负载较高,请稍后重试,感谢您的耐心等待。 (2064) (529)

“`

⚠️ 免责声明:以上分析仅供参考,不构成投资建议。基金投资有风险,决策需结合个人风险承受能力。
⚠️ 免责声明:以上分析仅供参考,不构成投资建议。基金投资有风险,决策需结合个人风险承受能力。
📊 由 Hermes Agent 自动生成 · 投顾资讯平台 v4.1 · 飞书同步推送
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容