Skill: wuritu/stock-reporting-interaction (version 1.0.0)

--- name: stock_reporting_interaction description: 生成专业股票投资分析报告（盘前/盘后/研报/周报），渲染可视化图表，管理投资日志，提供自然语言问答式投资助理交互体验 metadata: { "openclaw": { "emoji": "📝", "version": "1.0.0", "requires": { "bins": ["python3"], "env": ["STOCK_DATA_API_KEY"] }, "primaryEnv": "STOCK_DATA_API_KEY" } } --- # 报告与交互技能 本技能是投资分析体系的"表达层"——将技术分析、基本面分析、宏观分析、决策引擎的原始数据和结论，转化为人类可读、可操作、有吸引力的报告和交互体验。 ## 设计原则 1. **数据驱动叙事**：不是堆砌数字，而是讲清"发生了什么→意味着什么→下一步怎么做" 2. **分层表达**：同一份数据，能以一句话摘要、段落总结、完整报告三种粒度输出 3. **可视化优先**：关键数据点尽可能以图表呈现 4. **多渠道适配**：同一报告能适配聊天消息、Canvas 展示、文件导出 5. **交互式追问**：支持用户基于报告内容继续追问 6. **风险透明**：所有报告必须包含免责声明和不确定性标注 ## 触发条件 | 用户输入模式 | 激活功能 | |-------------|---------| | "今日盘前简报" / "开盘前看看" | 盘前报告 | | "今天复盘" / "收盘总结" | 盘后报告 | | "给我一份XX的深度研报" | 个股深度研报 | | "本周总结" / "周报" | 周度总结 | | "画个K线图" / "看看走势图" | 可视化图表 | | "记一下：今天买了XX" | 投资日志 | | "我的持仓怎么样" | 持仓回顾 | | "XX能买吗" / "大盘怎么看" | 自然语言问答 | | "提醒我XX跌到100块" | 价格预警 | ## 核心能力模块 --- ### 模块一：自动化报告生成系统 #### 1A. 盘前报告（每个交易日 08:30 通过 Cron 触发） 调用: ```bash python3 {baseDir}/tools/report_generator.py --type premarket --date today ``` 报告结构: ``` 📋 盘前简报 | 2026-04-06 周一 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🌍 隔夜全球市场 · 美股: 道指 +0.3%, 纳指 -0.2%, 标普 +0.1% · 欧股: 德DAX +0.5%, 英富时 +0.2% · 亚太: 日经 +1.1%, 恒指 -0.5% · 大宗: 原油 $78.5(+1.2%), 黄金 $2350(-0.3%) · 汇率: 美元指数 104.2, 离岸人民币 7.23 📊 A股盘前信号 · 富时A50期货: +0.35%（偏多开盘预期） · 北向资金预判: 昨日净流入+45亿，连续3日流入 · 融资余额: 1.62万亿（+0.2%） 🔥 今日关注 · 重要数据: 3月PMI数据公布 · 政策动态: 国常会讨论促消费政策 · 行业事件: 苹果WWDC倒计时，消费电子关注 · 解禁提示: XX股份 5亿市值解禁 📈 策略建议 · 大盘预判: 小幅高开震荡，关注3280支撑 · 板块关注: AI算力(政策催化)、消费(政策预期) · 风险提示: PMI数据若低于预期可能引发调整 ⚠️ 以上分析仅供参考，不构成投资建议 ``` #### 1B. 盘后报告（每个交易日 15:30 通过 Cron 触发） ```bash python3 {baseDir}/tools/report_generator.py --type postmarket --date today ``` 报告结构: ``` 📋 盘后复盘 | 2026-04-06 周一 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 今日行情概览 · 上证指数: 3285.60 (+0.82%) 成交4520亿 · 深证成指: 10580.30 (+1.15%) 成交5830亿 · 创业板指: 2150.80 (+1.45%) · 北向资金: 净买入 +62.3亿 · 涨跌比: 3680:1420, 涨停62家, 跌停5家 🔍 今日复盘要点 1️⃣ 行情定性 量价齐升放量上攻，市场赚钱效应良好 成交量较昨日放大18%，突破5日均量 2️⃣ 领涨板块 TOP5 | 板块 | 涨幅 | 资金净流入 | 核心驱动 | |------|------|-----------|---------| | AI算力 | +4.2% | +38亿 | 政策+业绩 | | 消费电子 | +3.1% | +22亿 | 苹果产业链 | | ... | ... | ... | ... | 3️⃣ 资金动向 · 北向大幅流入，偏好消费+科技 · 主力资金净流入TOP: 中际旭创、立讯精密... · 融资买入前三: ... 4️⃣ 明日展望 · 技术面: 站稳3280，上方关注3320阻力 · 情绪面: 赚钱效应扩散，短线情绪偏暖 · 风险点: 获利盘抛压、外围不确定性 📌 自选股异动提醒 · 贵州茅台: +2.1% 放量突破20日线 ← 关注 · 比亚迪: -1.5% 缩量回踩60日线 ← 观察支撑 ⚠️ 以上分析仅供参考，不构成投资建议 ``` #### 1C. 个股深度研报 ```bash python3 {baseDir}/tools/report_generator.py --type deep-report --symbol 600519 ``` 报告结构（仿券商研报格式）: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 贵州茅台 (600519.SH) 深度分析报告 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📄 报告摘要 评级: 📗 推荐关注 (综合评分 72/100) 当前价: ¥1,680 | 合理估值区间: ¥1,520 - ¥1,850 主要观点: 估值合理，基本面稳健，短期技术面偏多 ━━ 一、公司概况 ━━ 行业: 白酒 | 市值: 2.1万亿 | 上市: 2001年 核心产品: 飞天茅台、茅台1935、茅台王子 竞争优势: 品牌壁垒、产能稀缺、提价能力 ━━ 二、财务分析 ━━ [财务数据表格: 5年营收/利润/现金流/ROE趋势] [杜邦分析分解] [财务健康度评分: 92/100] ━━ 三、估值分析 ━━ [PE/PB/PEG/DCF 多维度估值] [历史估值分位图表] [估值评分: 65/100] ━━ 四、技术分析 ━━ [K线走势分析] [关键指标信号] [技术评分: 72/100] ━━ 五、行业对标 ━━ [vs 五粮液/泸州老窖/山西汾酒 对比表格] [竞争力雷达图数据] ━━ 六、风险提示 ━━ 1. 消费降级风险 2. 行业政策风险 3. 估值回调风险 ━━ 七、投资建议 ━━ [综合研判 + 操作建议 + 关键价位] ⚠️ 免责声明: ... 报告生成时间: 2026-04-06 16:00 数据截止日: 2026-04-06 ``` #### 1D. 周度总结 ```bash python3 {baseDir}/tools/report_generator.py --type weekly --week-end today ``` --- ### 模块二：可视化图表系统 本模块利用 OpenClaw 的 **Canvas 工具** + Python `mplfinance`/`plotly` 生成图表。 #### 2A. 支持的图表类型 | 图表类型 | 工具命令 | 输出方式 | |---------|---------|---------| | K线+均线+成交量 | `chart_renderer.py --type kline` | Canvas / PNG 文件 | | MACD 指标图 | `chart_renderer.py --type macd` | Canvas / PNG 文件 | | 综合技术面板 (K线+MACD+KDJ+VOL) | `chart_renderer.py --type dashboard` | Canvas | | 估值分位数图 | `chart_renderer.py --type valuation-band` | PNG 文件 | | 行业对比雷达图 | `chart_renderer.py --type radar` | PNG 文件 | | 财务趋势图 | `chart_renderer.py --type financial-trend` | PNG 文件 | | 资金流向热力图 | `chart_renderer.py --type capital-heatmap` | Canvas | | 板块轮动图 | `chart_renderer.py --type sector-rotation` | Canvas | | 持仓组合饼图 | `chart_renderer.py --type portfolio-pie` | PNG 文件 | | 回测收益曲线 | `chart_renderer.py --type backtest-curve` | PNG 文件 | #### 2B. Canvas 交互式仪表盘 利用 OpenClaw Canvas 能力构建实时交互式看盘页面: ``` 使用 canvas 工具: action: present target: {baseDir}/canvas/dashboard.html Canvas 页面内嵌: - 实时指数行情面板 - 自选股涨跌一览 - 板块热力图 - 资金流向可视化 - 用户可点击切换不同指标/周期 ``` #### 2C. 图表渲染器实现 ```bash # 完整用法 python3 {baseDir}/tools/chart_renderer.py \ --symbol 600519 \ --type dashboard \ --period daily \ --count 120 \ --indicators MA,MACD,KDJ,VOL \ --output /tmp/chart_600519.png \ --style dark \ --annotations "2026-03-15:买入,2026-04-01:加仓" ``` --- ### 模块三：自然语言投资问答系统 这是交互层的核心——让用户用自然语言提问，Agent 理解意图后调度合适的分析技能作答。 #### 3A. 意图分类体系 ```bash python3 {baseDir}/tools/nlp_intent_parser.py --query "<用户原始输入>" ``` 意图分类树: ``` 用户输入 ├── 行情查询类 │ ├── 实时行情 → "XX现在多少钱" "XX涨了吗" │ ├── 指数行情 → "大盘多少点了" "创业板怎么样" │ └── 板块行情 → "AI板块今天怎么样" │ ├── 分析请求类 │ ├── 技术分析 → "XX技术面怎么看" "MACD金叉了吗" │ ├── 基本面分析 → "XX基本面如何" "PE高不高" │ ├── 估值分析 → "XX贵不贵" "值这个价吗" │ └── 综合分析 → "XX值得买吗" "帮我分析下XX" │ ├── 决策咨询类 │ ├── 买卖建议 → "能买吗" "该卖了吗" "止损位多少" │ ├── 选股请求 → "推荐几只" "有什么好股票" │ ├── 仓位建议 → "买多少合适" "仓位怎么配" │ └── 策略咨询 → "定投好还是一把买" "该长线还是短线" │ ├── 报告请求类 │ ├── 定期报告 → "盘前简报" "收盘总结" "周报" │ ├── 专题报告 → "深度研报" "行业对比" │ └── 图表请求 → "画个K线图" "看看走势" │ ├── 管理操作类 │ ├── 自选股管理 → "加自选" "删自选" "自选列表" │ ├── 预警设置 → "XX跌到100提醒我" "涨停板提醒" │ ├── 日志记录 → "记一下买了XX" "今天的操作" │ └── 回顾复盘 → "上周操作回顾" "这个月收益多少" │ └── 知识问答类 ├── 概念解释 → "什么是MACD" "PE和PB有什么区别" ├── 市场知识 → "打新怎么操作" "融资融券是什么" └── 策略学习 → "什么是价值投资" "趋势交易怎么做" ``` #### 3B. 多轮对话管理 ```bash python3 {baseDir}/tools/dialogue_manager.py --session-id <会话ID> --query "<用户输入>" ``` 多轮对话状态机: ``` 状态1: 初始分析 用户: "帮我分析一下贵州茅台" Agent: [输出综合分析报告] → 保存上下文: {symbol: 600519, analysis_type: comprehensive} 状态2: 追问深入 用户: "估值是不是有点高了" Agent: [识别追问，补充详细估值分析] → 上下文: {symbol: 600519, focus: valuation} 状态3: 对比扩展 用户: "和五粮液比呢" Agent: [识别对比意图，输出对标分析] → 上下文: {symbol: [600519, 000858], mode: compare} 状态4: 决策收敛 用户: "那现在能买吗" Agent: [综合所有已分析维度，给出建议] → 上下文: {symbol: 600519, decision_requested: true} 状态5: 操作跟进 用户: "好，帮我记一下，今天打算在1650附近买入" Agent: [写入投资日志] → 调用 journal_manager 持久化 ``` 对话管理规则 (写入 AGENTS.md): ```markdown ### 投资问答对话规则 1. **记住上下文**: 同一会话中用户追问时，自动关联之前讨论的股票 2. **分层回答**: - 一句话问题 → 一段话回答 - 分析请求 → 结构化报告 - "详细说说" → 展开完整分析 3. **主动追问**: 当信息不足以给出建议时，主动问清楚: - "您是短线操作还是中长线持有？" - "您的风险承受能力如何？" - "目前已有仓位吗？" 4. **不确定性表达**: - 高置信度: "从XX指标来看，明确显示..." - 中置信度: "综合来看，倾向于认为..." - 低置信度: "目前信号比较混乱，建议观望..." 5. **永远不要**: - 承诺收益或保证不亏 - 给出具体的买卖指令（只提供分析视角） - 忽略风险提示 ``` --- ### 模块四：数据叙事化引擎 将枯燥的数字和指标转化为人类易理解的故事性表达。 ```bash python3 {baseDir}/tools/data_narrator.py --data <分析结果JSON> --style <叙事风格> ``` #### 4A. 叙事风格 | 风格 | 适用场景 | 示例 | |------|---------|------| | `concise` | 聊天消息、快问快答 | "茅台今天+2.1%，放量突破20日线，MACD金叉在即，短线偏多。" | | `professional` | 研报、正式报告 | "贵州茅台（600519）今日收报1680元，涨幅2.1%。成交量较前一交易日放大35%，价格成功突破20日均线阻力位（1655元），MACD指标DIF线上穿DEA线形成金叉形态，短期技术面转为偏多格局。" | | `educational` | 新手引导、概念解释 | "茅台今天涨了2.1%——这其实挺有意思的。你看它的成交量比昨天多了35%，这说明有更多资金在这个价位愿意买入。而且它突破了20日均线，这在技术分析中通常是一个积极信号..." | | `actionable` | 决策建议 | "🟢 茅台短线看多。关键信号：放量突破MA20+MACD金叉。操作建议：可在1660-1670区间轻仓试多，止损1640，目标1720。" | #### 4B. 数据叙事化规则 ```python # 核心转换逻辑 NARRATIVE_RULES = { # 涨跌幅描述 "change": { (5, float('inf')): "大涨 / 强势拉升", (3, 5): "明显上涨", (1, 3): "小幅上涨", (-1, 1): "窄幅震荡", (-3, -1): "小幅下跌", (-5, -3): "明显下跌", (float('-inf'), -5): "大跌 / 急挫", }, # 成交量描述 "volume_ratio": { (3, float('inf')): "巨量（异常放大）", (2, 3): "显著放量", (1.3, 2): "温和放量", (0.8, 1.3): "量能平稳", (0.5, 0.8): "缩量", (0, 0.5): "极度缩量（地量）", }, # PE 估值描述 "pe_percentile": { (0, 0.1): "估值极低（历史底部区域）", (0.1, 0.3): "估值偏低", (0.3, 0.7): "估值合理", (0.7, 0.9): "估值偏高", (0.9, 1.0): "估值极高（历史顶部区域）", }, } ``` --- ### 模块五：投资日志系统 利用 OpenClaw 的 **Memory 机制**（`memory/YYYY-MM-DD.md` + `MEMORY.md`）构建持久化投资日志。 #### 5A. 日志类型 ```bash python3 {baseDir}/tools/journal_manager.py --action <操作> [--params ...] ``` | 操作 | 命令 | 说明 | |------|------|------| | 记录交易 | `--action log-trade --symbol 600519 --direction buy --price 1660 --shares 100 --reason "放量突破MA20"` | 记录买卖操作 | | 记录观察 | `--action log-observation --content "AI板块回调，关注低吸机会"` | 记录市场观察 | | 记录决策 | `--action log-decision --content "决定减仓半导体，增持消费"` | 记录仓位决策 | | 查看日志 | `--action view --date today` | 查看当日日志 | | 搜索日志 | `--action search --query "茅台 买入"` | 搜索历史日志 | | 操作复盘 | `--action review --period 30d` | 30天操作回顾 | | 盈亏统计 | `--action pnl --period 30d` | 30天盈亏统计 | #### 5B. 日志存储格式（memory/YYYY-MM-DD.md 投资区） ```markdown ## 📈 投资日志 ### 交易记录 | 时间 | 操作 | 代码 | 名称 | 价格 | 数量 | 原因 | |------|------|------|------|------|------|------| | 09:35 | 买入 | 600519 | 贵州茅台 | 1660 | 100 | 放量突破MA20，MACD金叉 | | 14:20 | 卖出 | 300750 | 宁德时代 | 185 | 200 | 触及止盈位，缩量滞涨 | ### 市场观察 - AI算力板块持续强势，中际旭创3连板 - 北向资金连续4日流入，偏好消费+科技 - PMI数据超预期，周期股有反弹 ### 操作反思 - ✅ 茅台买入时机不错，放量突破确认后入场 - ⚠️ 宁德卖早了一点，但纪律优先，止盈不是错 - 📝 教训：板块轮动加快，不宜恋战，控制持仓周期 ``` #### 5C. 长期记忆（MEMORY.md 投资区） 通过 OpenClaw Memory Dreaming 机制自动提炼: ```markdown ## 📊 投资偏好与记录 ### 风险偏好 - 类型: 稳健型 - 单只最大仓位: 15% - 止损纪律: -8% 强制止损 ### 关注板块 - 长期看好: AI算力、新能源、消费 - 回避: 地产、教育 ### 自选股 | 代码 | 名称 | 加入日期 | 加入理由 | 关注价位 | |------|------|---------|---------|---------| | 600519 | 贵州茅台 | 2026-03-01 | 价值投资标的 | 支撑1600，阻力1800 | | 300750 | 宁德时代 | 2026-03-15 | 新能源龙头 | 支撑170，阻力200 | ### 历史操作统计 - 2026年3月: 操作12次，胜率58%，总收益+3.2% - 最佳操作: 3/10买入茅台 +5.2% - 最差操作: 3/22追高半导体 -6.1% - 教训总结: 追高成功率低于30%，优先在支撑位附近入场 ``` --- ### 模块六：预警与推送系统 利用 OpenClaw **Cron Jobs** + **Channel 分发** 实现多渠道推送。 #### 6A. 预警类型 ```bash python3 {baseDir}/tools/alert_dispatcher.py --action set --type <类型> --params <参数JSON> ``` | 预警类型 | 触发条件 | 推送内容 | |---------|---------|---------| | 价格预警 | 股价突破/跌破指定价位 | "⚠️ 茅台已跌破1600，当前1595，触及你设置的预警价" | | 涨跌幅预警 | 日涨跌幅超过阈值 | "🔔 宁德时代今日涨幅已达+7.2%，注意是否止盈" | | 技术信号预警 | MACD金叉/死叉、均线突破等 | "📈 比亚迪MACD日线金叉，可关注" | | 资金异动预警 | 北向资金/主力资金大幅变动 | "🔔 北向资金今日净卖出超100亿，注意风险" | | 财报公告预警 | 关注股票发布财报/重大公告 | "📋 茅台发布2026Q1财报，营收同比+15%" | | 持仓浮亏预警 | 持仓浮亏达到止损线 | "🔴 你持有的XX浮亏已达-8%，建议执行止损" | | 大盘风险预警 | 大盘急跌/情绪指标极端 | "⚠️ 上证指数跌破3200，跌幅-2.5%，市场恐慌" | #### 6B. Cron Job 配置 ```bash # 盘前报告 — 每个交易日 08:30 openclaw cron add \ --name stock-premarket-report \ --cron "30 8 * * 1-5" \ --tz Asia/Shanghai \ --timeout-seconds 120 \ --announce \ --message "执行盘前简报生成。按照 stock_reporting_interaction 技能的盘前报告流程执行。" # 盘后报告 — 每个交易日 15:30 openclaw cron add \ --name stock-postmarket-report \ --cron "30 15 * * 1-5" \ --tz Asia/Shanghai \ --timeout-seconds 180 \ --announce \ --message "执行盘后复盘报告生成。按照 stock_reporting_interaction 技能的盘后报告流程执行。" # 预警扫描 — 交易时段每5分钟 openclaw cron add \ --name stock-alert-scanner \ --cron "*/5 9-15 * * 1-5" \ --tz Asia/Shanghai \ --timeout-seconds 60 \ --message "扫描所有活跃预警规则，检查是否有触发条件满足。仅报告触发的预警。" # 周报 — 每周五 16:00 openclaw cron add \ --name stock-weekly-report \ --cron "0 16 * * 5" \ --tz Asia/Shanghai \ --timeout-seconds 300 \ --announce \ --message "生成本周投资周报。汇总本周大盘走势、操作记录、盈亏统计、下周展望。" ``` #### 6C. 多渠道分发 利用 OpenClaw 的 Channel 系统（Discord/Telegram/WhatsApp/Feishu）: ``` 报告分发策略: ├── 即时消息 (Telegram/WhatsApp/Discord) │ ├── 预警通知 → 即时推送，简短格式 │ ├── 盘前/盘后简报 → 结构化消息，可读性优先 │ └── 问答回复 → 自适应长度 │ ├── Canvas (桌面端) │ ├── 交互式仪表盘 → dashboard.html │ ├── K线图 → kline-chart.html │ └── 持仓视图 → portfolio-view.html │ ├── 文件导出 │ ├── Markdown → 日常报告 │ ├── HTML → 带图表的研报 │ └── PNG → 图表单独导出 │ └── Memory 持久化 ├── 日志 → memory/YYYY-MM-DD.md └── 长期记忆 → MEMORY.md (Dreaming 自动提炼) ``` --- ### 模块七：回答质量控制系统 #### 7A. 分层表达引擎 同一份分析数据，根据上下文自动选择表达粒度: ``` Level 1 — 一句话 (适合预警、快速问答) ┌─────────────────────────────────────────────────┐ │ "茅台短线偏多，MACD金叉+放量突破MA20，评分72分" │ └─────────────────────────────────────────────────┘ Level 2 — 摘要段落 (适合聊天回复) ┌─────────────────────────────────────────────────┐ │ 贵州茅台(600519)短线技术面偏多。今日放量上涨 │ │ 2.1%，成功突破20日均线阻力位，MACD日线形成金叉， │ │ KDJ指标处于中性区间尚有上行空间。上方阻力关注 │ │ 1720元（前高），下方支撑1640元（MA20）。综合技术 │ │ 评分72/100。 │ │ ⚠️ 仅供参考，不构成投资建议 │ └─────────────────────────────────────────────────┘ Level 3 — 完整报告 (适合研报请求) ┌─────────────────────────────────────────────────┐ │ [完整结构化报告，含所有维度分析] │ │ [数据表格 + 图表 + 风险提示 + 操作建议] │ │ [5000-10000字] │ └─────────────────────────────────────────────────┘ ``` 选择逻辑: ``` if 用户问题 < 10字 且 是简单查询 → Level 1 elif 用户明确要求"详细" or "深度" or "研报" → Level 3 elif 多轮对话中的追问 → Level 2 else → Level 2 (默认) ``` #### 7B. 免责声明系统 ```python DISCLAIMERS = { "standard": "⚠️ 以上分析仅供参考，不构成投资建议。股市有风险，投资需谨慎。", "decision": "⚠️ 以上分析基于公开数据和量化模型，仅供学习和参考。\n" "任何投资决策请独立判断并承担相应风险。\n" "历史表现不代表未来收益。", "alert": "⚠️ 预警触发不代表必须操作，请结合自身判断。", "backtest": "⚠️ 回测结果基于历史数据，存在过拟合风险，不代表未来表现。\n" "实盘交易还需考虑滑点、手续费、冲击成本等因素。", } # 根据内容类型自动附加 def attach_disclaimer(content: str, content_type: str) -> str: disclaimer = DISCLAIMERS.get(content_type, DISCLAIMERS["standard"]) return f"{content}\n\n---\n{disclaimer}" ``` #### 7C. 置信度标注体系 每个分析结论都必须标注置信度: | 置信度 | 标记 | 使用条件 | |-------|------|---------| | 🟢 高 | `[置信度: 高]` | 多个维度信号一致，数据充分，历史规律明确 | | 🟡 中 | `[置信度: 中]` | 部分维度一致，存在某些不确定因素 | | 🔴 低 | `[置信度: 低]` | 信号冲突，数据不足，或处于市场极端情况 |


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