← 返回
未分类

Banker Slides Pptx

Turn a banker-memo analysis.md + data-provenance.md into an investment-banker-craft .pptx (real tables, bar/line charts, risk heatmap, scenario grid — NOT pa...
jackdark425
未分类 clawhub v0.9.7 100000 Key: 无需
★ 0
Stars
📥 358
下载
💾 0
安装

概述

Banker Slides PPTX

Step 2 of the banker pipeline: analysis.md + data-provenance.md → slides-outline.md (structured) → .pptx with real banker visual primitives.

Pipeline position

banker-memo-md (Step 1) → analysis.md + data-provenance.md
                              │
                              ▼
                    banker-slides-pptx (THIS SKILL)
                              │
                    ┌─────────┴─────────┐
                    ▼                   ▼
           slides-outline.md    (rendered by)
           (structured YAML     build_outline_deck_v2.py
            blocks per slide)        │
                                     ▼
                                   .pptx

What makes this different from a generic "write some slides" prompt

Most LLM-written slide outlines are prose ("Slide 4: Key takeaway is X"). That's useless — the renderer can only emit a paragraph.

This skill forces the agent to write structured layout data the renderer can parse into real pptxgenjs primitives:

  • stat-cardsaddShape + big-number addText cards
  • 3y-table / peer-table / scenario-table → real addTable() with column widths + cell fill
  • bar-chart / line-chart → real addChart() with X-axis + Y-series data
  • risk-heatmap → 3×3 colored grid with risk items placed by (severity, likelihood)
  • callout-box → full-width gold-bordered box + large-font verdict text

The prompt reads analysis.md already written by banker-memo-md, extracts the numbers, and emits structured outline blocks. The renderer does no LLM work — it's a deterministic layout emitter.

Outline schema (what the agent writes)

Each slide uses a ## Slide N — </code> heading followed by <code>Layout:</code> + type-specific YAML-style fields.</p><h3><code>cover</code></h3><pre><code>## Slide 1 — Cover Layout: cover English-title: China Vanke Co., Ltd. Chinese-subtitle: 万科A · 房地产开发 · 投行深度研究 Ticker: 000002.SZ Date: 2026-04 </code></pre><h3><code>divider</code> (section divider between parts)</h3><pre><code>## Slide N — Section Divider Layout: divider Chinese-title: 财务深度诊断 English-subtitle: Financial Deep-Dive </code></pre><h3><code>stat-cards</code> (3-4 big-number cards)</h3><pre><code>## Slide N — Executive Summary Stats Layout: stat-cards Cards: - label: 2024 营收 value: "3,431.76" unit: 亿元 - label: 归母净亏损 value: "-494.78" unit: 亿元 highlight: red - label: ROE 2024 value: "-21.82" unit: "%" highlight: red - label: 资产负债率 value: "73.66" unit: "%" highlight: amber </code></pre><h3><code>table</code> (3Y YoY / peer / any matrix)</h3><pre><code>## Slide N — 3Y Financial Trend Layout: table Headers: ["指标", "2022", "2023", "2024", "YoY 24v23"] Rows: - ["营收(亿元)", "5,038.4", "4,657.4", "3,431.8", "-26.3%"] - ["归母净利(亿元)", "226.2", "67.7", "-494.8", "N/M"] - ["ROE(%)", "9.45", "4.93", "-21.82", "-26.75pp"] - ["毛利率(%)", "19.55", "15.31", "10.17", "-5.14pp"] - ["资产负债率(%)", "76.14", "75.29", "73.66", "-1.63pp"] Note: YoY 计算: 2024 值 - 2023 值 </code></pre><h3><code>bar-chart</code> / <code>line-chart</code></h3><pre><code>## Slide N — Revenue & Profit Trend Layout: bar-chart X-axis: ["2022", "2023", "2024"] Y-series: - name: 营收(亿元) values: [5038, 4657, 3432] color: "C9A84C" - name: 归母净利(亿元) values: [226, 68, -495] color: "D4AF37" Note: 营收 3 年 -32%,净利 2024 转负 </code></pre><h3><code>risk-heatmap</code> (3×3 severity × likelihood)</h3><pre><code>## Slide N — Risk Heatmap Layout: risk-heatmap Risks: - name: 存量减值压力 severity: 高 likelihood: 高 - name: 美元债重组 severity: 高 likelihood: 中 - name: 交付延期 severity: 中 likelihood: 中 - name: 数据口径风险 severity: 中 likelihood: 低 </code></pre><h3><code>scenario-table</code> (valuation scenarios)</h3><pre><code>## Slide N — Valuation Scenarios Layout: scenario-table Scenarios: - name: 悲观 assumption: "PE 10x · EPS -4.48 → N/M; 2025 仍巨亏" target: "2.0 元" upside: "-49%" color: red - name: 基础 assumption: "化债方案落地 + 2025 净利回正" target: "3.0 元" upside: "-24%" color: amber - name: 乐观 assumption: "政府背书 + OLED 转型兑现(类比 BOE)" target: "5.5 元" upside: "+40%" color: green </code></pre><h3><code>callout-box</code> (large verdict stamp)</h3><pre><code>## Slide N — Credit View Layout: callout-box Title: 授信建议 Tags: ["拒绝承做", "Sell", "Target 2-3 元"] Message: ROE -21.82% + 资产负债率 73.66% + 经营现金流持续失血(估算)+ 2025 多个项目公司贷款逾期 → 当前节点无法给予新增授信。深圳市政府化债方案落地前,仅密切关注,不入授信池。 </code></pre><h3><code>bullets</code> (fallback, sparingly)</h3><pre><code>## Slide N — Key Points Layout: bullets Points: - 论点 1 + 数据支撑 (src: ...) - 论点 2 </code></pre><h2>Deck composition (required structure)</h2><p>The prompt enforces this structure (12-15 slides typical):</p><ol><li><strong>Cover</strong> (1 slide)</li><li><strong>Executive Summary</strong> (1 slide, <code>stat-cards</code> layout)</li><li><strong>Section Divider: Company</strong> (1 slide, <code>divider</code>)</li><li><strong>Company Profile</strong> (1 slide, <code>table</code>)</li><li><strong>Section Divider: Industry</strong> (1 slide, <code>divider</code>)</li><li><strong>Industry Position</strong> (1 slide, <code>bar-chart</code> or <code>table</code> with peer share)</li><li><strong>Section Divider: Financial</strong> (1 slide, <code>divider</code>)</li><li><strong>3Y Trend</strong> (1 slide, <code>table</code>)</li><li><strong>Profitability Chart</strong> (1 slide, <code>bar-chart</code> or <code>line-chart</code>)</li><li><strong>Section Divider: Valuation & Risk</strong> (1 slide, <code>divider</code>)</li><li><strong>Peer Comparison</strong> (1 slide, <code>table</code>)</li><li><strong>Valuation Scenarios</strong> (1 slide, <code>scenario-table</code>)</li><li><strong>Risk Heatmap</strong> (1 slide, <code>risk-heatmap</code>)</li><li><strong>Credit / Investment View</strong> (1 slide, <code>callout-box</code>)</li><li><strong>Data Sources</strong> (1 slide, <code>bullets</code> listing raw-data files)</li></ol><p>Agent may merge divider slides into adjacent content when narrative is tight, but target stays 13-15.</p><h2>Hard constraints</h2><ol><li><strong>Every number in outline must already be in analysis.md</strong> — the renderer will run <code>slide_data_audit</code> against provenance; numbers not in provenance will fail the gate</li><li><strong>Use rounded banker notation for stat cards</strong>: "3,431.76 亿元" → display as <code>"3,432"</code> + unit <code>"亿"</code> (the underlying analysis.md has the exact value; cards round for visual)</li><li><strong>Peer comp numbers stay <code>[EST]</code></strong> — the table cells for peer rows should include <code>[EST]</code> suffix in value string</li><li><strong>Chart Y-series values must be numeric</strong> (not strings), color codes 6-char hex without <code>#</code></li><li><strong>Heatmap severity/likelihood must be one of 高/中/低</strong> — renderer maps to 3×3 grid</li></ol><h2>Usage</h2><pre><code># Pre-flight: analysis.md + data-provenance.md already written by banker-memo-md ls <deliverable>/{analysis.md,data-provenance.md} # Build + dispatch prompt python3 scripts/build_pptx_prompt.py <deliverable> <ts_code> <name_cn> \ <name_en> > /tmp/prompt.md openclaw agent --agent main --thinking high --json --timeout 600 \ --message "$(cat /tmp/prompt.md)" # Agent writes slides-outline.md in the deliverable dir # Render the deck python3 scripts/build_outline_deck_v2.py <deliverable> <ts_code> <name_cn> <name_en> # Validate python3 <cn-ci-scripts>/sync_provenance.py <deliverable> python3 <cn-ci-scripts>/validate-delivery.py --strict-mcp <deliverable> </code></pre><h2>Quality checklist</h2><ul><li>[ ] slides-outline.md has 12-15 slides</li><li>[ ] Contains ≥1 each of: <code>stat-cards</code>, <code>table</code>, <code>bar-chart</code> or <code>line-chart</code>, <code>risk-heatmap</code>, <code>scenario-table</code>, <code>callout-box</code></li><li>[ ] NOT all <code>bullets</code> (that's the fallback layout — using it for > 2 slides means the prompt failed)</li><li>[ ] All numbers traceable to provenance (slide_data_audit PASS)</li><li>[ ] Compile passes cn_typo_scan</li><li>[ ] Rendered .pptx has actual charts (not placeholders) when outline specifies <code>bar-chart</code> / <code>line-chart</code></li></ul></div> </div> </div> <div id="tab-versions" class="detail-content"> <div class="detail-section"> <h2>版本历史</h2> <p style="margin-bottom:12px;font-size:14px;color:#94a3b8;">共 1 个版本</p> <ul class="version-list"> <li> <div> <span class="version-tag">v0.9.7</span> <span style="font-size:11px;color:#5b6abf;margin-left:8px;background:#eef0ff;padding:1px 8px;border-radius:10px;">当前</span> </div> <div style="font-size:12px;color:#94a3b8;"> 2026-05-07 09:57 安全 安全 </div> </li> </ul> </div> </div> <div id="tab-security" class="detail-content"> <div class="detail-section"> <h2>安全检测</h2> <p style="color:#94a3b8;">暂无安全检测报告</p> </div> </div> <!-- Recommended Skills --> </div> <script> document.addEventListener('DOMContentLoaded',function(){ document.querySelectorAll('.detail-tab').forEach(function(btn){ btn.addEventListener('click',function(e){ var tab = this.getAttribute('data-tab'); document.querySelectorAll('.detail-tab').forEach(function(b){b.classList.remove('active')}); document.querySelectorAll('.detail-content').forEach(function(c){c.classList.remove('active')}); this.classList.add('active'); var el = document.getElementById('tab-'+tab); if(el) el.classList.add('active'); }); }); }); </script> <div class="footer"> <p>Skill工具集 © 2026</p> </div></body> </html>