
Tougu Writer Factory
- 5 installs
- 5 repo stars
- Updated April 7, 2026
- cyhzzz/finance_aigc_skills
Trains a bespoke investment-advisor writing skill from 3-5 sample articles using an 8-dimension style extraction method.
About
This meta-skill ingests 3-5 sample advisor articles and extracts their style across 8 dimensions to output a ready-to-use custom writing skill with data modules and references. A financial advisor uses it to produce a personalized market-commentary writing template.
- 8-dimension style extraction from sample articles
- Outputs a full SKILL.md with data modules and self-evaluation loop
Tougu Writer Factory by the numbers
- 5 all-time installs (skills.sh)
- Ranked #837 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cyhzzz/finance_aigc_skills --skill tougu-writer-factoryAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 5 |
|---|---|
| repo stars | ★ 5 |
| Last updated | April 7, 2026 |
| Repository | cyhzzz/finance_aigc_skills ↗ |
What it does
Trains a bespoke investment-advisor writing skill from 3-5 sample articles using an 8-dimension style extraction method.
Files
投顾写作Skill工厂
从3-5篇满意文章中训练专属投顾写作Skill的完整元技能
核心定位
本Skill是一个"工厂"——接收投顾提交的3-5篇满意文章,输出可直接使用的专属写作Skill。
核心能力
| 能力 | 说明 |
|---|---|
| 8维深度提取 | 标题/段落/句式/词汇/分析逻辑/数据规范/固定表达/数据需求 |
| 固化模块 | 市场数据获取 + 合规红线(通用模块,不需提取) |
| 自测评循环 | 生成 → 对比 → 修复 → 循环,确保Skill效果达标 |
| 完整输出 | SKILL.md + 固化模块 + references/ + scripts/ |
---
快速开始
触发方式
对助手说:
- "帮我建一个收评skill"
- "训练一个专属写作模板"
- "提取我的写作风格建个skill"
- "这个是我的写作风格,帮我封装成skill"
操作流程
Phase 1: 文章采集存档(需用户确认样本)
↓
Phase 2: 8维深度提取
↓
Phase 3: 对比整合 → 风格画像(需用户确认风格)
↓
Phase 4: Skill组装
↓
Phase 5: 自测评循环(自动执行,无需用户介入)
↓
✅ 完成 → 触发安装检查输出目录
output/{文章类型}-writer/(相对路径,跨平台兼容Windows/Mac/Linux)
---
任务目标
本Skill工厂的目标是: 1. 接收投顾提交的3-5篇满意文章 2. 通过8维深度提取分析法提取写作特征 3. 生成可直接使用的专属写作Skill 4. 通过自测评循环确保生成质量
---
完整工作流程
Phase 1:文章采集存档 ✋
输入:3-5篇同类型满意文章
要求:
- 同类型文章(收评/开盘前瞻/行业解读等)
- Markdown或纯文本,保留完整段落结构
- 注明作者姓名和满意原因
操作: 1. 保存文章到临时目录 2. 验证文章数量是否足够 3. 记录文章基本信息
输出:存档确认报告
详细指南:见 references/phase1.md
---
Phase 2:8维深度提取
核心提取阶段,从样本文章中提取8个维度的特征
| 序号 | 维度 | 提取内容 | 权重 |
|---|---|---|---|
| 1 | 标题格式 | 主标题结构、副标题格式、栏目名称 | 20% |
| 2 | 段落结构 | 段落数量、每段功能定位、段落间衔接逻辑 | 20% |
| 3 | 句式特征 | 句子长度、条件判断句、概率表达 | 15% |
| 4 | 词汇特征 | 专业术语库、特色比喻词、谨慎词 | 15% |
| 5 | 分析逻辑 | 数据→事件→逻辑→结论→建议框架 | 20% |
| 6 | 数据规范 | 数据类型、精确度要求、对比表达 | 参考 |
| 7 | 固定表达 | 段落开头固定语、结尾固定格式 | 10% |
| 8 | 数据需求 | 必需数据、可选数据、资讯需求 | 参考 |
详细指南:见 references/phase2.md
---
Phase 3:对比整合 → 风格画像 ✋
将3-5篇文章的8个维度提取结果进行交叉对比:
| 一致率 | 处理方式 |
|---|---|
| ≥80% | 核心模式,进入风格画像 |
| 50-79% | 标准模式,标记为可选变体 |
| <50% | 个人偏好,作为个性化选项 |
输出:
{风格名}创作风格.md- 风格指南(含段落示例+完整案例){风格名}创作风格_微观特征.md- 微观特征详细说明
详细指南:见 references/phase3.md
---
Phase 4:Skill组装
将生成的资源组装成完整的Skill:
output/{文章类型}-writer/
├── SKILL.md # 可直接使用的写作Skill
├── 固化模块/
│ ├── compliance.md # 合规红线
│ └── market_data.py # 市场数据获取脚本
├── scripts/
│ ├── fetch_market_data.py # 可执行脚本
│ └── market_data.md # LLM数据获取驱动指南
└── references/
├── {风格名}创作风格.md
├── {风格名}创作风格_微观特征.md
├── {风格名}html海报模板.html
├── {风格名}合规检查.md
├── step1.md ~ step4.md
└── self_eval.md固化模块(通用,直接复制):
固化模块/compliance.md→ 合规红线固化模块/market_data.py→ 市场数据获取脚本
详细指南:见 references/phase4.md
---
Phase 5:自测评循环
目的:确保生成的Skill真正符合案例标准
流程:
初始生成
↓
随机选题测试(自动)
↓
Skill执行:生成测试文章
↓
格式校验(skill-creator规范或内置校验)
↓
7维对比分析
↓
差距识别
↓
修复优化(如需要)
↓
循环直到达标(≥80%)或达3轮上限达标标准:
- 整体匹配度 ≥ 80% → 通过
- 单维度匹配度 ≥ 60% → 可接受
- 任何维度 < 50% → 必须修复
详细指南:见 references/phase5.md
---
质量检查清单
生成完成后,必须验证:
文件完整性检查
- [ ] SKILL.md 包含完整workflow
- [ ] 固化模块/ 包含 compliance.md 和 market_data.py
- [ ] scripts/ 包含 fetch_market_data.py
- [ ] references/ 包含 step1-4.md 和 self_eval.md
内容完整性检查
- [ ] 创作风格.md 包含所有段落类型的写作示例
- [ ] 创作风格.md 包含至少2个完整案例片段
- [ ] 微观特征.md 包含句式特征、词汇特征、润色检查清单
风格一致性检查
- [ ] 标题格式与样本一致
- [ ] 段落数量与样本一致
- [ ] 固定开头语全部提取
- [ ] 特色词汇全部纳入
- [ ] 分析逻辑框架正确
---
技术依赖
| 组件 | 用途 |
|---|---|
| Python 3 | 运行环境 |
| akshare | 市场数据获取 |
| pandas | 数据处理 |
| markdown | 文本处理 |
| skill-creator | 格式校验(可选,未安装时使用内置校验) |
---
注意事项
1. 固化模块是通用的 - 直接复制,不需要从样本提取 2. SKILL.md必须详细 - 包含完整的操作步骤、检查清单、注意事项 3. 风格文档必须丰满 - 创作风格.md和微观特征.md内容详尽完整 4. 自测评需要生成文章 - 先调用生成的Skill生成测试文章,再进行对比 5. 样本质量决定Skill质量 - 提交最满意的版本,3-5篇同类型文章
---
参考文档索引
| 文件 | 内容 |
|---|---|
references/phase1.md | Phase 1 详细指南:文章采集存档 |
references/phase2.md | Phase 2 详细指南:8维深度提取 |
references/phase3.md | Phase 3 详细指南:对比整合 |
references/phase4.md | Phase 4 详细指南:Skill组装 |
references/phase5.md | Phase 5 详细指南:自测评循环 |
references/self_eval.md | 自评估检查表(LLM驱动) |
固化模块/compliance.md | 合规红线(固化) |
固化模块/market_data.py | 市场数据获取脚本(固化) |
投顾写作Skill工厂 - 快速开始指南
什么是投顾写作Skill工厂?
一个"Skill工厂"——你提供3-5篇满意的投顾文章,我帮你训练出一个专属的写作Skill,可复用于日常撰写。
---
快速使用
触发命令
对我(助手)说:
- "帮我建一个收评skill"
- "训练一个专属写作模板"
- "提取我的写作风格"
提供材料
3-5篇你满意的同类型文章(收评/开盘前瞻/行业解读等),直接发给我。
等待输出
我自动完成: 1. 存档 + 8维深度提取 2. 风格画像整合 3. 组装专属Skill(含数据获取+合规模块) 4. 自测评循环确保质量
你获得一个可直接使用的写作Skill。
---
输出物
生成后输出到 output/{文章类型}-writer/(相对路径,跨平台兼容),并提示用户是否安装:
output/{文章类型}-writer/
├── SKILL.md # 专属写作Skill
├── 固化模块/
│ ├── compliance.md # 合规红线
│ └── market_data.py # 市场数据脚本
├── scripts/
│ ├── fetch_market_data.py # 可执行脚本
│ └── market_data.md # LLM数据获取指南
└── references/
├── {风格名}创作风格.md
├── {风格名}创作风格_微观特征.md
├── {风格名}html海报模板.html
├── {风格名}合规检查.md
├── step1.md ~ step4.md
└── self_eval.md生成后:✅ Skill已生成到 output/{文章类型}-writer/,是否安装?
---
适用场景
| 场景 | 说明 |
|---|---|
| 每日收评 | 训练后一键生成收评初稿 |
| 开盘前瞻 | 快速产出盘前分析 |
| 行业解读 | 标准化行业分析框架 |
| 产品话术 | 提取话术风格模板 |
---
质量保障
自测评循环:
- 生成后自动对比原始案例
- 多轮修复直到达标
- 确保风格一致
---
注意事项
1. 文章质量决定Skill质量——提交你最满意的版本 2. 同类型文章——收评就都选收评,不要混搭 3. 固化模块是通用的——市场数据获取和合规红线不需要你提取,直接用 4. 自测评会多轮修复——自动进行,不需要你介入
合规红线模块(固化)
本模块为通用合规规则,所有生成的Skill均强制集成
不需要从案例中提取,直接使用
---
禁止表达清单
市场预测类(绝对禁止)
- ❌ 必将大涨、必将大跌
- ❌ 确定上涨、确定下跌
- ❌ 一定涨、一定跌
- ❌ 必然会、必定会
操作承诺类(绝对禁止)
- ❌ 推荐买入、推荐卖出
- ❌ 赶紧买、赶紧卖
- ❌ 满仓梭哈
- ❌ 抄底、逃顶
绝对化词汇(谨慎使用)
- ❌ 暴涨、暴跌
- ❌ 极好、极差
- ❌ 完全、彻底
- ❌ 只能、必须(操作建议中)
---
谨慎表达规则
概率性表达(推荐使用)
- ✅ 大概率
- ✅ 或
- ✅ 可能
- ✅ 倾向于
- ✅ 值得关注
操作建议表达
- ✅ 建议关注
- ✅ 可以考虑
- ✅ 逢低布局
- ✅ 控制仓位
- ✅ 分散风险
---
风险提示格式
每篇文章结尾必须包含:
本内容仅供参考,不构成投资建议。投资者据此操作,风险自担。
市场有风险,投资需谨慎。---
数据来源标注
必须标注来源的数据
- 指数行情:✅ "根据官方行情数据显示"
- 资金流向:✅ "根据官方行情数据显示"
- 政策文件:✅ "根据证监会XX文件"
- 新闻报道:✅ "根据XX媒体报道"
禁止
- ❌ 模糊来源:"据悉"、"有消息称"(必须核实)
- ❌ 无来源数据
---
合规检查清单
生成内容后自检:
- [ ] 无绝对化市场预测词汇
- [ ] 无操作承诺性语句
- [ ] 有风险提示
- [ ] 关键数据有来源标注
- [ ] 使用概率性表达(大概率/或/可能)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{BRAND_NAME}}·{{ARTICLE_TYPE}} | {{AUTHOR_NAME}}</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;600;700;900&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<script>
tailwind.config = {
theme: {
extend: {
colors: {
'rice-paper': '#F7F5F0',
'daiqing': '#2C4A3E',
'cinnabar': '#B85450',
'bronze-gold': '#C9A961',
'ink-black': '#1A1A1A',
'charcoal': '#4A4A4A',
'silver-gray': '#8A8A8A',
'light-gray': '#E8E6E1'
},
fontFamily: {
'serif-cn': ['"Noto Serif SC"', 'serif'],
'sans-cn': ['"Noto Sans SC"', 'sans-serif'],
'mono': ['"Roboto Mono"', 'monospace']
}
}
}
}
</script>
<style>
/* 传统纹样背景 */
.wave-pattern {
background-image: url("data:image/svg+xml,%3Csvg width='100' height='20' viewBox='0 0 100 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 10 Q 25 20 50 10 T 100 10' stroke='%23C9A961' stroke-width='0.5' fill='none' opacity='0.3'/%3E%3C/svg%3E");
background-repeat: repeat-x;
}
/* 竖排文字支持 */
.vertical-text {
writing-mode: vertical-rl;
text-orientation: upright;
}
/* 细线装饰 */
.gold-line {
background: linear-gradient(to right, transparent, #C9A961, transparent);
height: 1px;
}
/* 数据卡片悬停效果 */
.data-card {
transition: all 0.3s ease;
}
.data-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(44, 74, 62, 0.1);
}
/* 打印优化 */
@media print {
body { background: white; }
.no-print { display: none; }
.shadow-lg { box-shadow: none; }
}
/* 滚动条美化 */
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: #F7F5F0;
}
::-webkit-scrollbar-thumb {
background: #C9A961;
border-radius: 3px;
}
</style>
</head>
<body class="bg-rice-paper min-h-screen font-sans-cn text-charcoal antialiased">
<!-- 主容器 -->
<div class="max-w-4xl mx-auto p-6 md:p-12">
<!-- 顶部栏 -->
<header class="flex justify-between items-start mb-8 border-b border-bronze-gold/30 pb-4">
<div class="flex items-center gap-4">
<!-- 栏目标识 -->
<div class="relative">
<h1 class="font-serif-cn text-3xl font-bold text-daiqing tracking-wider">
产品名称
</h1>
<div class="absolute -top-2 -right-4 w-6 h-6 opacity-20">
<svg viewBox="0 0 24 24" fill="#C9A961">
<path d="M12 2C8 2 5 5 5 9c0 2 1 4 3 5v2c0 2-1 3-2 4 2 1 4-1 6-3 2 2 4 4 6 3-1-1-2-2-2-4v-2c2-1 3-3 3-5 0-4-3-7-7-7z"/>
</svg>
</div>
</div>
<div class="h-8 w-px bg-bronze-gold/50"></div>
<div class="text-sm">
<p class="font-serif-cn text-daiqing font-semibold">盘前展望</p>
<p class="text-silver-gray text-xs mt-0.5">{{AUTHOR_NAME}} · {{ARTICLE_TYPE}}</p>
</div>
</div>
<div class="text-right text-xs text-silver-gray space-y-1">
<p class="font-mono">2026年2月7日</p>
<p>星期五</p>
<p class="text-bronze-gold">农历正月初十</p>
</div>
</header>
<!-- 核心观点区(视觉锚点) -->
<section class="mb-10 text-center py-8 relative">
<div class="absolute top-0 left-1/2 -translate-x-1/2 w-24 h-px bg-gradient-to-r from-transparent via-bronze-gold to-transparent"></div>
<h2 class="font-serif-cn text-3xl md:text-4xl font-bold text-ink-black mb-4 leading-relaxed">
节前最后一周,态势竟然如此
</h2>
<div class="inline-block bg-daiqing/5 border-l-4 border-bronze-gold px-6 py-3 rounded-r-lg">
<p class="font-serif-cn text-xl text-daiqing font-semibold">
窄幅震荡格局,大概率延续全周
</p>
</div>
<div class="absolute bottom-0 left-1/2 -translate-x-1/2 w-24 h-px bg-gradient-to-r from-transparent via-bronze-gold to-transparent"></div>
</section>
<!-- 主内容区:左右分栏 -->
<div class="grid md:grid-cols-12 gap-8">
<!-- 左侧正文区(7列) -->
<main class="md:col-span-8 space-y-6">
<!-- 市场综述 -->
<article class="prose prose-stone max-w-none">
<div class="flex items-center gap-2 mb-3">
<div class="w-1.5 h-6 bg-daiqing rounded-full"></div>
<h3 class="font-serif-cn text-lg font-bold text-daiqing">市场综述</h3>
</div>
<div class="bg-white/50 rounded-lg p-5 border border-light-gray leading-relaxed text-justify">
<p class="mb-3">
2月6日,市场呈现<strong class="text-daiqing">低开高走、午后回落</strong>的震荡格局。上证指数收于<span class="font-mono font-bold text-daiqing text-lg">4065点</span>,是非常标准的震荡市延续走势,指数层面的信号很清晰。
</p>
<p>
两市成交额约<span class="font-mono font-bold">2.15万亿元</span>,较前日缩量约<span class="text-cinnabar font-mono">300亿元</span>,<span class="bg-cinnabar/10 px-1 rounded">流动性降级明显</span>。
</p>
</div>
</article>
<!-- 政策解读 -->
<article>
<div class="flex items-center gap-2 mb-3">
<div class="w-1.5 h-6 bg-daiqing rounded-full"></div>
<h3 class="font-serif-cn text-lg font-bold text-daiqing">政策解读</h3>
<span class="text-xs bg-bronze-gold/20 text-bronze-gold px-2 py-0.5 rounded-full">证监会1号文</span>
</div>
<div class="bg-white/50 rounded-lg p-5 border border-light-gray">
<p class="leading-relaxed mb-3">
证监会于2026年2月6日发布《关于境内资产境外发行资产支持证券代币的监管指引》,旨在为现实世界资产(RWA)代币化建立明确的监管框架。
</p>
<div class="bg-daiqing/5 border-l-3 border-daiqing pl-4 py-2 rounded-r text-sm">
<p class="font-semibold text-daiqing mb-1">核心原则:境内严禁、境外严管</p>
<p class="text-charcoal/80">具备跨境证券化、ABS经验的头部券商和投行有业务增量预期,<span class="text-daiqing font-medium">非银金融板块受益</span>,但大概率会冲击区块链概念股。</p>
</div>
</div>
</article>
<!-- 贵金属动向 -->
<article>
<div class="flex items-center gap-2 mb-3">
<div class="w-1.5 h-6 bg-cinnabar rounded-full"></div>
<h3 class="font-serif-cn text-lg font-bold text-daiqing">贵金属动向</h3>
<span class="text-xs bg-cinnabar/10 text-cinnabar px-2 py-0.5 rounded-full">央行增持</span>
</div>
<div class="bg-white/50 rounded-lg p-5 border border-light-gray">
<p class="leading-relaxed mb-3">
2月7日,央行公布数据显示,1月末黄金储备为<span class="font-mono font-bold text-cinnabar text-lg">7419万盎司</span>,较上月末增加<span class="font-mono font-bold text-cinnabar">4万盎司</span>。
</p>
<div class="flex gap-4 text-sm">
<div class="flex-1 bg-rice-paper p-3 rounded border border-bronze-gold/30 text-center">
<p class="text-silver-gray text-xs mb-1">连续增持</p>
<p class="font-mono font-bold text-daiqing">15个月</p>
</div>
<div class="flex-1 bg-rice-paper p-3 rounded border border-bronze-gold/30 text-center">
<p class="text-silver-gray text-xs mb-1">占储备比重</p>
<p class="font-mono font-bold text-daiqing">9.7%</p>
</div>
<div class="flex-1 bg-rice-paper p-3 rounded border border-bronze-gold/30 text-center">
<p class="text-silver-gray text-xs mb-1">全球平均</p>
<p class="font-mono font-bold text-silver-gray">~15%</p>
</div>
</div>
<p class="text-sm text-charcoal/80 mt-3 italic">
后续市场公开操作仍有增持黄金、适度减持美债的预期。
</p>
</div>
</article>
<!-- 外围市场 -->
<article>
<div class="flex items-center gap-2 mb-3">
<div class="w-1.5 h-6 bg-daiqing rounded-full"></div>
<h3 class="font-serif-cn text-lg font-bold text-daiqing">外围市场</h3>
</div>
<div class="bg-white/50 rounded-lg p-5 border border-light-gray">
<p class="leading-relaxed mb-3">
2月6日美股三大指数涨幅明显,<span class="font-medium">道指创历史新高</span>:
</p>
<div class="grid grid-cols-3 gap-3 mb-3">
<div class="text-center p-3 bg-daiqing/5 rounded-lg">
<p class="text-xs text-silver-gray mb-1">道琼斯</p>
<p class="font-mono font-bold text-daiqing">历史新高</p>
</div>
<div class="text-center p-3 bg-daiqing/5 rounded-lg">
<p class="text-xs text-silver-gray mb-1">纳斯达克</p>
<p class="font-mono font-bold text-daiqing">+2.18%</p>
</div>
<div class="text-center p-3 bg-daiqing/5 rounded-lg">
<p class="text-xs text-silver-gray mb-1">标普500</p>
<p class="font-mono font-bold text-daiqing">+1.97%</p>
</div>
</div>
<p class="text-sm text-charcoal/80">
主要得益于美联储降息预期升温、地缘政治风险缓和以及科技巨头巨额AI支出计划。美股大涨通过情绪传导和外盘带动效应,或对今日A股开盘形成提振,特别是<span class="text-daiqing font-medium">AI算力、芯片</span>等科技板块有望跟随回暖。
</p>
</div>
</article>
<!-- 板块热点 -->
<article>
<div class="flex items-center gap-2 mb-3">
<div class="w-1.5 h-6 bg-bronze-gold rounded-full"></div>
<h3 class="font-serif-cn text-lg font-bold text-daiqing">鱼群动向</h3>
<span class="text-xs bg-bronze-gold/20 text-bronze-gold px-2 py-0.5 rounded-full">固态电池异动</span>
</div>
<div class="bg-white/50 rounded-lg p-5 border border-light-gray">
<p class="leading-relaxed mb-3">
边际变化明显的是<strong class="text-daiqing">固态电池板块</strong>。2月6日,板块成交额<span class="font-mono font-bold">610亿元</span>,占两市总成交额比重的<span class="font-mono font-bold text-bronze-gold">2.85%</span>,较前一交易日提升<span class="text-bronze-gold font-bold">0.8个百分点</span>。
</p>
<div class="bg-bronze-gold/5 border border-bronze-gold/20 rounded-lg p-3 text-sm">
<div class="flex justify-between items-center">
<span class="text-charcoal/70">板块市值</span>
<span class="font-mono font-bold text-daiqing">~4万亿元</span>
</div>
<div class="flex justify-between items-center mt-1">
<span class="text-charcoal/70">占两市总市值</span>
<span class="font-mono font-bold text-daiqing">3.26%</span>
</div>
</div>
<p class="text-sm text-charcoal/80 mt-3">
体现出市场在缩量的情况下,有活跃资金涌入该板块,还是有些许分量的。
</p>
</div>
</article>
<!-- 本周策略 -->
<article class="bg-daiqing/5 rounded-lg p-6 border border-daiqing/20">
<div class="flex items-center gap-2 mb-4">
<div class="w-1.5 h-6 bg-daiqing rounded-full"></div>
<h3 class="font-serif-cn text-xl font-bold text-daiqing">本周策略</h3>
</div>
<div class="space-y-3 text-charcoal leading-relaxed">
<p>
回到A股市场,重点说本周的整体判断:<span class="font-bold text-daiqing">窄幅震荡格局,大概率会延续全周</span>。
</p>
<p>
虽然我们不倾向做过于消极的预判,但春节前的资金行为规律很明确,上周两市流动性已经明显降级。一方面是行情本身震荡所致,另一方面,本周市场的春节氛围会明显加重,量能低迷或逐步成为常态。
</p>
<div class="bg-white/70 rounded-lg p-4 my-4 border-l-4 border-bronze-gold">
<p class="font-medium text-daiqing mb-2">关键判断</p>
<p class="text-sm">若没有增量资金,指数就很难走出趋势性行情,大概率就是在当前区间内反复震荡。只要没有重大利好/利空消息刺激,整个震荡区间很难被有效打破。</p>
</div>
<p>
<span class="font-medium text-cinnabar">这里要提醒一个细节:</span>不同指数的震荡强弱是分化的。深圳成指、中证500/1000,整体更偏向弱势震荡;而上证指数在这个位置,结构上更接近强势震荡,板块与指数的节奏差异,要区分开。
</p>
<p class="font-medium text-daiqing">
操作与应对上,继续验证此前的震荡判断即可,重点盯紧两点:一是震荡区间的延续性,二是如果出现突破,一定要看清突破的方向、量能配合与级别有效性,不要盲目追涨杀跌。
</p>
</div>
</article>
</main>
<!-- 右侧数据栏(5列) -->
<aside class="md:col-span-4 space-y-4">
<!-- 市场速览卡片 -->
<div class="bg-white rounded-lg shadow-sm border border-light-gray p-5">
<h4 class="font-serif-cn text-bronze-gold font-bold mb-4 flex items-center gap-2">
<span class="w-2 h-2 bg-bronze-gold rounded-full"></span>
市场速览
</h4>
<div class="space-y-3">
<div class="data-card bg-rice-paper rounded-lg p-3 border border-light-gray">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-silver-gray">上证指数</span>
<span class="text-xs text-silver-gray">2月6日</span>
</div>
<div class="font-mono text-2xl font-bold text-daiqing">4065</div>
<div class="text-xs text-silver-gray mt-1">震荡延续</div>
</div>
<div class="data-card bg-rice-paper rounded-lg p-3 border border-light-gray">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-silver-gray">两市成交额</span>
<span class="text-xs text-cinnabar">↓缩量</span>
</div>
<div class="font-mono text-2xl font-bold text-daiqing">2.15<span class="text-sm">万亿</span></div>
<div class="text-xs text-cinnabar mt-1">-300亿元</div>
</div>
<div class="data-card bg-rice-paper rounded-lg p-3 border border-light-gray">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-silver-gray">纳斯达克</span>
<span class="text-xs text-daiqing">隔夜</span>
</div>
<div class="font-mono text-2xl font-bold text-daiqing">+2.18%</div>
<div class="text-xs text-silver-gray mt-1">道指创历史新高</div>
</div>
<div class="data-card bg-rice-paper rounded-lg p-3 border border-light-gray">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-silver-gray">黄金储备</span>
<span class="text-xs text-cinnabar">+4万盎司</span>
</div>
<div class="font-mono text-2xl font-bold text-cinnabar">7419<span class="text-sm">万盎司</span></div>
<div class="text-xs text-silver-gray mt-1">连续15个月增持</div>
</div>
<div class="data-card bg-bronze-gold/10 rounded-lg p-3 border border-bronze-gold/30">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-bronze-gold font-medium">固态电池成交占比</span>
<span class="text-xs text-bronze-gold">↑0.8%</span>
</div>
<div class="font-mono text-2xl font-bold text-bronze-gold">2.85%</div>
<div class="text-xs text-bronze-gold/70 mt-1">资金涌入明显</div>
</div>
</div>
<!-- 策略提示 -->
<div class="mt-5 pt-4 border-t border-light-gray">
<div class="bg-daiqing/5 rounded-lg p-3 text-center">
<p class="text-xs text-silver-gray mb-1">本周基调</p>
<p class="font-serif-cn font-bold text-daiqing">窄幅震荡</p>
<p class="text-xs text-charcoal/70 mt-1">适应震荡,不追涨杀跌</p>
</div>
</div>
</div><!-- /市场速览卡片 -->
<!-- 快速导航(本期要点)-->
<div class="bg-white rounded-lg shadow-sm border border-light-gray p-4">
<h4 class="text-xs font-bold text-silver-gray uppercase tracking-wider mb-3">本期要点</h4>
<nav class="space-y-2 text-sm">
<a href="#" class="block text-charcoal hover:text-daiqing transition-colors py-1 border-b border-light-gray/50">市场综述</a>
<a href="#" class="block text-charcoal hover:text-daiqing transition-colors py-1 border-b border-light-gray/50">RWA监管新政</a>
<a href="#" class="block text-charcoal hover:text-daiqing transition-colors py-1 border-b border-light-gray/50">央行增持黄金</a>
<a href="#" class="block text-charcoal hover:text-daiqing transition-colors py-1 border-b border-light-gray/50">美股创新高</a>
<a href="#" class="block text-charcoal hover:text-daiqing transition-colors py-1">固态电池异动</a>
</nav>
</div>
</aside>
</div>
<!-- 底部区域 -->
<footer class="mt-12 pt-8 border-t border-bronze-gold/30">
<!-- 订阅引导 -->
<div class="bg-daiqing rounded-lg p-6 text-white mb-6 relative overflow-hidden">
<div class="absolute top-0 right-0 w-32 h-32 bg-white/5 rounded-full -translate-y-1/2 translate-x-1/2"></div>
<div class="relative z-10 flex justify-between items-center">
<div>
<h4 class="font-serif-cn text-xl font-bold mb-2">签约【{{BRAND_NAME}}】股票池</h4>
<p class="text-white/80 text-sm">{{SUBSCRIPTION_TAGLINE}}</p>
</div>
<div class="text-right">
<div class="bg-white/20 backdrop-blur rounded-lg p-3 inline-block">
<svg class="w-16 h-16 text-white" fill="currentColor" viewBox="0 0 24 24">
<path d="M3 3h18v18H3V3zm2 2v14h14V5H5zm4 4h6v2H9V9zm0 4h6v2H9v-2z"/>
</svg>
</div>
<p class="text-xs text-white/60 mt-2">{{SUBSCRIPTION_CTA}}</p>
</div>
</div>
</div>
<!-- 风险提示 -->
<div class="text-xs text-silver-gray leading-relaxed space-y-2 border-t border-light-gray pt-4">
<p class="font-bold text-charcoal">风险提示:</p>
<p>{{RISK_DISCLOSURE}}</p>
<p class="text-center text-bronze-gold font-medium pt-2">市场有风险,投资需谨慎</p>
</div>
<!-- 品牌页脚 -->
<div class="flex justify-between items-center mt-6 pt-4 border-t border-light-gray text-xs text-silver-gray">
<div class="flex items-center gap-2">
<span class="font-serif-cn font-bold text-daiqing">{{BRAND_NAME}}</span>
<span>|</span>
<span>{{AUTHOR_NAME}}</span>
</div>
<div class="font-mono">
{{BRAND_NAME}} · 第{{ISSUE_NUMBER}}期
</div>
</div>
</footer>
</div>
<!-- 装饰元素:底部水波纹 -->
<div class="wave-pattern h-4 opacity-30 mt-8"></div>
</body>
</html>
#!/usr/bin/env python3
"""
投顾写作Skill工厂 - 市场数据获取固化模块
功能:
1. 获取A股市场主要指数数据(上证、深证、创业板)
2. 获取板块行情数据
3. 获取资金流向数据
4. 格式化输出供写作使用
用法:
python market_data.py [日期]
python market_data.py 2026-03-25
依赖:
pip install akshare pandas requests
"""
import argparse
import json
import sys
from datetime import datetime, timedelta
from typing import Dict, Any, Optional, List
# 尝试导入akshare,如果失败则使用模拟数据
try:
import akshare as ak
HAS_AKSHARE = True
except ImportError:
HAS_AKSHARE = False
print("⚠️ 警告: akshare未安装,将使用模拟数据")
print(" 安装命令: pip install akshare")
# ============ 数据获取函数 ============
def get_previous_trading_day(date_str: Optional[str] = None) -> str:
"""获取指定日期的前一个交易日"""
if date_str:
target = datetime.strptime(date_str, "%Y-%m-%d")
else:
target = datetime.now()
# 简单实现:如果是周末,往前找
while target.weekday() >= 5: # 5=Saturday, 6=Sunday
target -= timedelta(days=1)
return target.strftime("%Y-%m-%d")
def fetch_index_data(symbol: str, name: str, date: str) -> Dict[str, Any]:
"""获取单个指数数据"""
result = {
"name": name,
"symbol": symbol,
"date": date,
"status": "unknown",
}
if not HAS_AKSHARE:
result["status"] = "mock"
result["close"] = 3000.0 + hash(date) % 1000
result["change"] = 0.5
result["change_pct"] = 0.5
result["volume"] = 250000000000
result["amount"] = 2500000000000
return result
try:
if symbol == "000001": # 上证指数
df = ak.index_zh_a_hist(symbol="000001", period="daily", start_date=date, end_date=date)
elif symbol == "399001": # 深证成指
df = ak.index_zh_a_hist(symbol="399001", period="daily", start_date=date, end_date=date)
elif symbol == "399006": # 创业板指
df = ak.index_zh_a_hist(symbol="399006", period="daily", start_date=date, end_date=date)
else:
df = ak.index_zh_a_hist(symbol=symbol, period="daily", start_date=date, end_date=date)
if df is not None and len(df) > 0:
row = df.iloc[-1]
result["close"] = float(row.get("收盘", row.get("close", 0)))
result["open"] = float(row.get("开盘", row.get("open", 0)))
result["high"] = float(row.get("最高", row.get("high", 0)))
result["low"] = float(row.get("最低", row.get("low", 0)))
result["volume"] = float(row.get("成交量", row.get("volume", 0)))
result["amount"] = float(row.get("成交额", row.get("amount", 0)))
# 计算涨跌幅
prev_close = float(row.get("前收盘", row.get("pre_close", result["close"])))
if prev_close > 0:
result["change"] = result["close"] - prev_close
result["change_pct"] = (result["change"] / prev_close) * 100
result["status"] = "success"
else:
result["status"] = "no_data"
except Exception as e:
result["status"] = "error"
result["error"] = str(e)
return result
def fetch_market_data(date: Optional[str] = None) -> Dict[str, Any]:
"""获取市场数据主函数"""
if not date:
date = get_previous_trading_day()
else:
date = get_previous_trading_day(date)
result = {
"date": date,
"indices": {},
"market_summary": {},
"status": "unknown",
}
# 获取三大指数
indices = [
("000001", "上证指数"),
("399001", "深证成指"),
("399006", "创业板指"),
]
for symbol, name in indices:
result["indices"][symbol] = fetch_index_data(symbol, name, date)
# 计算市场整体情况
all_success = all(idx.get("status") == "success" for idx in result["indices"].values())
if all_success:
# 上涨/下跌/平盘计数
rises = sum(1 for idx in result["indices"].values() if idx.get("change_pct", 0) > 0)
falls = sum(1 for idx in result["indices"].values() if idx.get("change_pct", 0) < 0)
total_amount = sum(idx.get("amount", 0) for idx in result["indices"].values())
avg_change = sum(idx.get("change_pct", 0) for idx in result["indices"].values()) / len(indices)
result["market_summary"] = {
"rise_count": rises,
"fall_count": falls,
"total_amount": total_amount,
"avg_change_pct": avg_change,
"market_type": "普涨" if rises > falls else ("普跌" if falls > rises else "分化"),
}
result["status"] = "success"
else:
result["status"] = "partial"
result["market_summary"] = {
"rise_count": 0,
"fall_count": 0,
"market_type": "数据获取失败",
}
return result
def format_market_report(data: Dict[str, Any]) -> str:
"""格式化市场数据为可读报告"""
if data.get("status") == "error":
return f"❌ 数据获取失败: {data.get('error', '未知错误')}"
date = data.get("date", "未知日期")
lines = [
f"=== A股市场数据 ({date}) ===",
"",
"【主要指数】",
]
for symbol, idx in data.get("indices", {}).items():
name = idx.get("name", symbol)
status = idx.get("status", "unknown")
if status == "success":
close = idx.get("close", 0)
change = idx.get("change", 0)
change_pct = idx.get("change_pct", 0)
amount = idx.get("amount", 0)
direction = "▲" if change > 0 else ("▼" if change < 0 else "―")
change_str = f"{direction}{abs(change):.2f}点({change_pct:+.2f}%)"
# 格式化成交额
if amount >= 100000000000:
amount_str = f"{amount/100000000000:.2f}万亿元"
else:
amount_str = f"{amount/100000000:.2f}亿元"
lines.append(f" {name}: {close:.2f} {change_str} 成交额{amount_str}")
else:
lines.append(f" {name}: 数据获取失败({status})")
summary = data.get("market_summary", {})
if summary:
lines.extend([
"",
"【市场概况】",
f" 整体态势: {summary.get('market_type', '未知')}",
])
return "\n".join(lines)
# ============ CLI入口 ============
def main():
parser = argparse.ArgumentParser(description="获取A股市场数据")
parser.add_argument("date", nargs="?", default=None, help="交易日期(YYYY-MM-DD),默认为上一交易日")
parser.add_argument("--json", action="store_true", help="输出JSON格式")
parser.add_argument("--format", choices=["report", "json", "raw"], default="report", help="输出格式")
args = parser.parse_args()
# 获取数据
data = fetch_market_data(args.date)
# 根据格式输出
if args.format == "json" or args.json:
print(json.dumps(data, ensure_ascii=False, indent=2))
elif args.format == "raw":
for symbol, idx in data.get("indices", {}).items():
print(f"{symbol}: {idx}")
else:
print(format_market_report(data))
# 返回状态码
return 0 if data.get("status") == "success" else 1
if __name__ == "__main__":
sys.exit(main())
投顾写作Skill工厂
从3-5篇满意文章中训练专属投顾八股文写作Skill的完整元技能
---
📦 完整结构
tougu-writer-factory/
├── SKILL.md # 主Skill文件
├── AGENTS.md # 快速开始指南
├── README.md # 本文件
│
├── 固化模块/ # 通用固化模块(直接复制)
│ ├── compliance.md # 合规红线
│ └── market_data.py # 市场数据获取脚本
│
├── assets/ # 资产文件
│ ├── compliance.md # 合规红线源文件
│ ├── market_data.py # 市场数据获取源文件
│ └── html_template.html # HTML海报模板
│
├── scripts/ # 工具脚本
│ ├── self_eval.py # 自测评脚本
│ └── market_data.md # LLM数据获取驱动指南
│
└── references/ # 参考模板
├── phase1.md ~ phase5.md # 各Phase详细指南
├── step1.md ~ step4.md # 操作步骤模板
├── self_eval.md # 自评估检查表
├── analysis_logic.md # 分析逻辑框架
├── style_profile.md # 风格画像模板
└── format_guide.md # 格式指南---
🚀 快速开始
触发方式
对助手说:
- "帮我建一个收评skill"
- "训练一个专属写作模板"
- "提取我的写作风格建个skill"
操作流程
1. 提交材料:发送3-5篇满意的投顾文章 2. 自动执行:
- 8维深度提取
- 风格画像整合
- 组装专属Skill(含固化模块)
- 自测评循环确保质量
3. 获得输出:可直接使用的专属写作Skill
---
✨ 核心能力
| 能力 | 说明 |
|---|---|
| 8维提取 | 标题/段落/句式/词汇/分析逻辑/数据/固定表达/数据需求 |
| 固化模块 | 市场数据获取 + 合规红线(通用,不用提取) |
| 自测评循环 | LLM驱动+Python辅助,格式校验(skill-creator规范)+ 7维度对比 |
| 完整输出 | SKILL.md + 6个references + 固化模块 + 自测评指南 |
| skill-creator集成 | 生成Skill的格式校验依赖skill-creator规范 |
---
📊 自测评机制
初始生成
↓
随机选题测试
↓
7维对比分析
↓
差距识别
↓
修复优化
↓
循环直到达标(≥80%)或达3轮上限---
📝 输出示例
生成的专属Skill输出到 output/ 目录:
output/收评writer/
├── SKILL.md (详细版)
├── 固化模块/
│ ├── compliance.md # 合规红线
│ └── market_data.py # 市场数据脚本
├── scripts/
│ ├── fetch_market_data.py # 可执行脚本
│ └── market_data.md # LLM数据获取指南
└── references/
├── 收评创作风格.md
├── 收评创作风格_微观特征.md
├── 收评html海报模板.html
├── 收评合规检查.md
├── step1.md ~ step4.md
└── self_eval.md生成后:自动提示是否安装生成的skill
---
⚙️ 技术要求
- Python 3
- markdown解析能力
- 文件系统操作
- skill-creator(可选,用于格式校验)
---
📌 注意事项
1. 文章质量决定Skill质量——提交你最满意的版本 2. 同类型文章——收评就都选收评,不要混搭 3. 固化模块是通用的——市场数据和合规不需要提取 4. 自测评自动进行——不需要人工介入
---
分析逻辑框架
本文档由投顾写作Skill工厂自动生成
记录文章的分析框架、论证结构、逻辑链条等
---
核心分析框架
投顾文章的分析逻辑遵循"数据→事件→逻辑→结论→建议"的五段式框架:
数据事实 → 事件影响 → 逻辑推理 → 趋势结论 → 操作建议各环节详解
1. 数据事实
内容:客观陈述市场数据
- 指数表现(涨跌幅、点位)
- 成交额变化(放量/缩量)
- 资金流向(净流入/净流出)
- 板块表现(涨跌排行)
要求:
- 具体数值,精确到小数点后两位
- 对比数据(环比、同比)
- 数据来源标注
2. 事件影响
内容:分析影响市场的重大事件
- 国内政策(证监会、央行、统计局)
- 国际事件(美联储、地缘政治)
- 行业政策(产业规划、监管政策)
要求:
- 说明事件本身
- 分析对不同板块的影响
- 区分短期和长期影响
3. 逻辑推理
内容:基于数据和事件进行因果推演
- 数据→原因的推理
- 事件→市场反应的推理
- 当前→未来的推演
要求:
- 因果链条清晰
- 概率表达(大概率、或、可能)
- 转折处理(然而、但)
4. 趋势结论
内容:对市场走势的判断
- 短期趋势(当日/本周)
- 中期趋势(月度/季度)
- 关键支撑压力位
要求:
- 明确但不绝对
- 附带概率判断
- 技术面与基本面结合
5. 操作建议
内容:具体的投资操作建议
- 仓位建议(高/中/低)
- 板块配置(进攻/防御)
- 操作策略(高抛低吸/持股待涨)
要求:
- 明确但不承诺
- 风险提示同步给出
- 适合不同风险偏好投资者
---
论证结构
时间序列结构
昨日市场 → 今日预期 → 未来展望示例:
昨日(已发生):上证指数微涨0.09%
今日(正在发生):成交量维持低位
未来(预期):大概率维持震荡空间并列结构
A股市场 → 港股市场 → 美股市场
上证 → 深证 → 创业板
主板 → 科创板 → 北交所示例:
上证指数偏强,而创业板指走弱,呈现明显的分化格局。重要性递进结构
重要事件 → 次要事件 → 补充信息示例:
证监会政策是本次市场调整的主因,其次是外围扰动,成交量萎缩则是伴随现象。---
因果链条模式
常见因果链
政策→资金→股价:
政策出台 → 资金预期变化 → 板块轮动 → 股价变动数据→情绪→市场:
成交额萎缩 → 观望情绪 → 市场震荡外围→传导→A股:
美股下跌 → 情绪传导 → A股跟跌转折处理
当因果链出现反转时,使用转折词:
| 转折词 | 含义 | 用法 |
|---|---|---|
| 然而 | 重大的不利转折 | 预期上涨,但实际下跌 |
| 但 | 补充说明 | 整体向好,但存在问题 |
| 不过 | 轻微转折 | 机会存在,但需谨慎 |
| 虽然/尽管 | 让步转折 | 虽有不利,但可控 |
---
结论推导路径
从数据推导结论
[数据] 成交额跌破2万亿
[观察] 资金观望情绪浓厚
[结论] 市场大概率维持缩量震荡从事件推导结论
[事件] 美联储3月降息预期骤降
[影响] 外部利率环境收紧
[传导] 对科技成长股估值形成压制
[结论] 短期内科技股大概率承压综合推导
[数据] 成交额萎缩、指数分化
[事件] 政策面积极但外围扰动
[历史] 过往类似情况市场走势
[概率] 大概率维持震荡,结构分化---
逻辑检查清单
撰写完成后,请检查:
因果链完整性
- [ ] 数据→原因→影响→结论链条完整
- [ ] 没有跳跃性推理
- [ ] 概率表达与结论匹配
转折处理
- [ ] 转折词使用恰当
- [ ] 转折后的分析与转折前逻辑一致
- [ ] 转折不颠覆整体判断
结论可靠性
- [ ] 结论有数据支撑
- [ ] 结论不过于绝对
- [ ] 操作建议与结论匹配
逻辑一致性
- [ ] 段落间逻辑连贯
- [ ] 前后判断不矛盾
- [ ] 整体立场一致
格式规范指南
本文档由投顾写作Skill工厂自动生成
记录文章格式规范,包括标题格式、段落结构、结尾格式等
---
标题格式
主标题规范
【{栏目名称}·{文章类型}】{核心观点标题}示例:
【年年有鱼·市场评论】节前收官在即,鱼群高低切换待春归
【XX投顾·盘前展望】今日市场或将延续震荡格局副标题规范
——本栏目为"{作者/栏目}"观点{早评/收评}示例:
——本栏目为"于晴于理"观点收评
——本栏目为"XX投顾"观点早评标题字数
- 主标题(不含【】和栏目名):8-16字为宜
- 核心观点应简洁有力
- 避免过于直白或过于晦涩
---
段落结构
标准段落数量
根据文章类型,段落数量有所不同:
| 文章类型 | 段落数量 | 说明 |
|---|---|---|
| 收评 | 5-6段 | 市场概述→事件→外围→技术→资金→操作 |
| 盘前展望 | 5-6段 | 同上 |
| 行业解读 | 4-5段 | 行业概况→政策影响→竞争格局→投资建议 |
| 产品话术 | 3-4段 | 产品介绍→优势→适用场景→风险提示 |
每段功能定位
第1段:市场/行业概述
- 开门见山,直述当日/当前市场表现
- 包含关键数据(指数涨跌幅、成交额)
- 定调整篇分析基调
第2段:事件/政策分析
- 分析影响市场的重大事件
- 逻辑清晰:事件→影响→市场反应
- 数据支撑
第3段:关联市场/竞争分析
- 外部市场联动(如美股、港股)
- 或行业竞争格局
第4段:技术/走势分析
- 技术面分析
- 支撑压力位
- 趋势判断
第5段:资金/板块分析
- 资金流向
- 板块轮动
- 特色比喻运用
第6段:操作建议
- 具体投资建议
- 仓位建议
- 风险提示
段落长度
- 每段:100-200字为宜
- 第2、5段可根据内容重要性适当扩展至250-300字
- 整体文章:800-1200字
---
固定表达
段落开头语
以下是常见的段落开头固定语模式:
昨日A股市场...
近期事件层面...
关联市场方面...
走势结构上...
鱼群方面...
操作思路上...结尾固定格式
风险提示:
本内容仅供参考,不构成投资建议。投资者据此操作,风险自担。
市场有风险,投资需谨慎。品牌呼号(如适用):
签约【年年有"鱼"】股票池解锁更多内容
年年有鱼——让投资像呼吸一样简单。---
数据格式规范
指数数据
上证指数{涨跌幅}({点数}点)
深证成指{涨跌幅}({点数}点)
创业板指{涨跌幅}({点数}点)成交额数据
两市成交额{金额}亿元,{环比变化}
成交额{放量/缩量}{具体数值}资金流向
北向资金{净流入/净流出}{金额}亿元
资金有{高低切换/持续流入/持续流出}动作---
格式检查清单
撰写完成后,请检查:
- [ ] 标题格式完整(主标题 + 副标题)
- [ ] 段落数量符合类型要求
- [ ] 每段有明确的功能定位
- [ ] 段落开头语符合规范
- [ ] 结尾包含风险提示
- [ ] 数据格式规范
- [ ] 整体篇幅在800-1200字范围内
微观特征指南
本文档由投顾写作Skill工厂自动生成
记录句式、词汇、修辞、节奏等微观写作特征
---
句式特征
句式类型分布
| 句式类型 | 占比 | 示例 |
|---|---|---|
| 陈述句 | 70% | 上证指数微涨0.09% |
| 条件判断句 | 15% | 若没有增量资金,指数将维持震荡 |
| 概率表达句 | 10% | 大概率维持震荡格局 |
| 转折句 | 5% | 然而,市场情绪有所转弱 |
条件判断句式
常用结构:
若{条件},则{结果}
若没有{条件},{结果}
{条件}情况下,{结果}示例:
若没有增量资金配合,指数将维持震荡
若成交量不能有效放大,突破前高难度较大
外围市场若持续走弱,A股大概率跟随调整概率性表达句式
常用词汇:大概率、或、可能、倾向于、值得关注、有望
示例:
大概率维持震荡格局
市场或将延续分化走势
短期内可能面临调整压力
投资者倾向于观望为主---
词汇特征
高频专业术语
| 类别 | 词汇 |
|---|---|
| 市场描述 | 缩量、放量、震荡、轮动、催化、避险、分化、高低切换 |
| 技术分析 | 突破、支撑、压力、趋势、均线、背离、量价齐升 |
| 资金流向 | 净流入、净流出、防御性调仓、进攻性布局 |
| 操作建议 | 逢低布局、控制仓位、高抛低吸、分散风险 |
谨慎词使用
必须使用的谨慎词:
- 大概率
- 或
- 可能
- 建议
- 值得关注
- 倾向于
避免使用的绝对词:
- ❌ 暴涨、暴跌
- ❌ 肯定、绝对
- ❌ 必然、必将
- ❌ 推荐买入、满仓梭哈
特色比喻词
金融领域常用比喻(根据文章风格选择使用):
| 比喻 | 含义 | 示例 |
|---|---|---|
| 鱼群 | 资金流向 | 科技板块鱼群活跃 |
| 鲸鱼 | 大资金/机构 | 北向资金(鲸鱼)净流出 |
| 压舱石 | 稳健板块 | 银行股作为压舱石 |
| 跷跷板 | 板块轮动 | 科技与消费呈跷跷板效应 |
| 风向标 | 领先指标 | 北向资金成为市场风向标 |
| 领头羊 | 领先板块 | 科技股成为反弹领头羊 |
---
修辞手法
排比句式
操作建议排比:
一是...二是...三是...
一是不盲目追高...二是不过于悲观...三是不纠结短期...数据分析排比:
成交额...,涨跌幅...,资金流向...转折句式
常见转折词:然而、但、不过、虽然、尽管
示例:
然而,市场情绪有所转弱
但整体下跌空间有限
不过,结构性机会仍存
虽然外围扰动加大,但国内政策托底有力数据引导句式
来源标注:
根据东方财富数据显示...
根据Wind数据显示...
根据证监会政策文件...数据陈述:
昨日成交额达8753亿元,环比下降12%
上证指数微涨0.09%,实现七连阳---
节奏控制
句子节奏
- 短句为主:每句不超过25字
- 分号分隔:用分号连接相关但独立的信息
- 逗号停顿:在主语后、修饰语前适当停顿
示例:
上证指数微涨0.09%,实现七连阳,而深证成指与创业板指分别下跌0.35%和1.08%,两市成交额跌破2万亿元,呈现清晰的缩量格局。段落节奏
- 首句点题:每段首句直接点明该段核心观点
- 数据支撑:紧随首句后给出具体数据
- 逻辑展开:用2-3句展开分析
- 小结收尾:段尾可用一句话总结
示例段落结构:
[首句] 昨日市场延续节前特征。
[数据] 上证指数微涨0.09%,深证成指下跌0.35%。
[分析] 成交额缩量至2万亿以下,显示资金观望情绪浓厚。
[小结] 整体呈现缩量震荡格局。---
情感与语气
情感强度控制
| 强度 | 描述 | 适用场景 |
|---|---|---|
| 低 | 冷静理性,数据说话 | 日常分析、风险提示 |
| 中 | 有所倾向但不极端 | 操作建议、市场展望 |
| 高 | 明显乐观或悲观 | 不推荐,易违规 |
语气特点
- 客观陈述:用数据和市场事实说话
- 谨慎表达:避免极端化判断
- 专业但易懂:不过于学术化
- 有立场但不固执:有明确观点,但留有余地
---
正式度评估
本风格指南的正式度评估:
| 维度 | 评分 | 说明 |
|---|---|---|
| 用词 | 4/5 | 专业术语为主,偶尔口语化 |
| 句式 | 4/5 | 书面语为主,条件句专业 |
| 格式 | 5/5 | 严格遵循格式规范 |
| 整体 | 4/5 | 专业但易懂 |
评分标准:1=非常口语化,5=非常正式
Phase 1:文章采集存档
本文档为 Phase 1 的详细操作指南
---
目标
将用户提交的3-5篇满意文章采集存档,为后续8维提取做准备。
---
输入要求
| 要求 | 说明 |
|---|---|
| 数量 | 3-5篇同类型文章 |
| 类型 | 收评/开盘前瞻/行业解读/产品话术等 |
| 标准 | 本人撰写或高度认可的满意版本 |
| 格式 | Markdown或纯文本,保留完整段落结构 |
---
操作步骤
Step 1:接收文章
接收用户发送的文章,记录:
- 文章类型(收评?开盘前瞻?)
- 作者姓名
- 满意原因(可选)
Step 2:验证文章
1. 检查文章数量是否 ≥3 2. 检查文章是否为同类型 3. 检查格式是否可处理
Step 3:保存存档
将文章保存到临时目录,文件命名规范:
./skill_factory_input/
├── article_1.md
├── article_2.md
└── article_3.mdStep 4:生成存档报告
输出存档确认报告:
✅ Phase 1 完成:文章采集存档
存档摘要:
- 文章类型:收评
- 作者:张三
- 文章数量:3篇
- 存档目录:./skill_factory_input/
文章列表:
1. 【年年有鱼】节前收官在即,鱼群高低切换待春归
2. 【年年有鱼】缩量震荡待指引,节后行情可期
3. 【年年有鱼】政策暖风频吹,市场信心待修复---
用户确认 ✋
必须向用户确认以下内容:
✅ 文章采集完成,请确认:
📁 存档摘要:
- 文章类型:{类型}
- 作者:{作者}
- 文章数量:{数量}篇
📋 文章列表:
{列表}
1️⃣ 确认样本 - 这些文章是否都是您满意的版本?
2️⃣ 如需替换或添加文章,请现在提出
3️⃣ 确认后,输入"确认"继续 Phase 2---
常见问题
| 问题 | 解决方案 |
|---|---|
| 文章数量不足 | 提示用户补充至少3篇 |
| 文章类型混杂 | 建议选择同类型文章 |
| 格式不统一 | 转换为Markdown格式 |
---
下一步
用户确认后,进入 Phase 2:8维深度提取
Phase 2:8维深度提取
本文档为 Phase 2 的详细操作指南
---
目标
从样本文章中提取8个维度的特征,为后续风格画像提供数据基础。
---
维度定义
| 序号 | 维度 | 提取内容 | 权重 |
|---|---|---|---|
| 1 | 标题格式 | 主标题结构、副标题格式、栏目名称、字数范围 | 20% |
| 2 | 段落结构 | 段落数量、每段功能定位、段落间衔接逻辑、长度范围 | 20% |
| 3 | 句式特征 | 句子长度偏好、标点使用规律、条件判断句、概率表达 | 15% |
| 4 | 词汇特征 | 专业术语库、特色比喻词、谨慎词使用 | 15% |
| 5 | 分析逻辑 | 数据→事件→逻辑→结论→建议框架、因果链条、转折处理 | 20% |
| 6 | 数据规范 | 数据类型、精确度要求、对比表达方式、来源标注格式 | 参考 |
| 7 | 固定表达 | 段落开头固定语、结尾固定格式,品牌/栏目呼号 | 10% |
| 8 | 数据需求 | 必需数据(固化模块接口)、可选数据、资讯需求 | 参考 |
---
各维度提取指南
维度1:标题格式
提取内容:
- 主标题结构(符号规范、字数范围、创作方法)
- 副标题格式(如"——本栏目为xxx观点收评")
- 栏目名称(如"XX投顾")
示例格式:
【年年有鱼·市场评论】节前收官在即,鱼群高低切换待春归
——本栏目为"于晴于理"观点收评维度2:段落结构
提取内容:
- 段落数量与排序
- 每段功能定位(第1段市场概述、第2段事件分析...)
- 段落间衔接逻辑
- 段落长度范围
维度3:句式特征
提取内容:
- 句子长度偏好
- 标点使用规律(分号、冒号使用频率)
- 条件判断句式(若...则...、大概率...)
- 概率性表达(或许、可能、倾向于)
维度4:词汇特征
提取内容:
- 专业术语库(从样本中高频提取)
- 特色比喻词(如"压舱石"等,从样本中提取)
- 谨慎词使用(大概率、或、可能、建议)
维度5:分析逻辑 ← 【核心】
提取内容:
- 分析框架:数据→事件→逻辑→结论→建议
- 因果链条模式
- 转折处理方式
- 结论推导路径
维度6:数据使用规范
提取内容:
- 数据类型(指数、成交额、资金等)
- 精确度要求
- 对比表达方式
- 数据来源标注格式
维度7:固定表达
提取内容:
- 段落开头固定语
- 结尾固定格式
- 品牌/栏目呼号
维度8:数据获取需求
提取内容:
- 必需数据(固化模块接口)
- 可选数据
- 资讯需求
---
提取输出格式
# 8维提取报告
## 维度1:标题格式
- 主标题:【】格式,{字数}字
- 副标题:——格式
- 栏目:{栏目名}
## 维度2:段落结构
- 段落数量:{数量}段
- 各段功能:{列表}
- 段落长度:{范围}
## 维度3:句式特征
- 平均句长:{长度}
- 条件句:{数量}处
- 概率表达:{数量}处
## 维度4:词汇特征
- 专业术语:{列表}
- 比喻词:{列表}
- 谨慎词:{列表}
## 维度5:分析逻辑
- 框架:{描述}
- 因果链:{模式}
- 转折词:{列表}
## 维度6:数据规范
- 数据类型:{列表}
- 精确度:{要求}
- 来源标注:{格式}
## 维度7:固定表达
- 开头语:{列表}
- 结尾格式:{格式}
- 品牌呼号:{格式}
## 维度8:数据需求
- 必需数据:{列表}
- 可选数据:{列表}---
操作建议
1. 逐篇分析:先逐篇提取,再交叉对比 2. 重点标注:对维度5(分析逻辑)投入更多精力 3. 示例保留:每个维度都要保留具体示例
---
下一步
Phase 2 完成后,进入 Phase 3:对比整合
Phase 3:对比整合 → 风格画像
本文档为 Phase 3 的详细操作指南
---
目标
将3-5篇文章的8个维度提取结果进行交叉对比,生成风格画像。
---
对比规则
| 一致率 | 处理方式 | 输出 |
|---|---|---|
| ≥80% | 核心模式 | 进入风格画像 |
| 50-79% | 标准模式 | 标记为可选变体 |
| <50% | 个人偏好 | 作为个性化选项 |
---
风格画像输出要求
每个段落必须提取的内容
1. 完整写作示例(必须)
从样本文章中选取每个段落的典型写法:
- 字数:100-200字
- 要求:保留原始的表达方式、数据、句式
- 标注:必须标注"(此片段直接来自样本文章第X段)"
2. 段落结构说明
- 首句如何点题
- 数据如何呈现
- 分析如何展开
- 小结如何收尾
3. 完整案例片段(至少2个)
- 至少从2篇样本中提取完整案例片段
- 包括亮点分析和片段参考
- 案例片段必须包含所有段落
---
输出文件规范
文件1:{风格名}创作风格.md
必须包含:
| 内容 | 要求 |
|---|---|
| 风格核心定义 | 500字以上 |
| 文章类型与时态 | 类型定义+时态规则 |
| 标题格式要求 | 格式模板+示例(至少3个) |
| 数据使用原则 | 具体性要求+对比要求 |
| {段落数量}段式结构 | 每段功能+示例(100-200字) |
| 固定结尾 | 结尾固定格式 |
| 常用表达方式 | 格局描述+概率性表达+动态描述 |
| 行文节奏与篇幅控制 | 整体节奏+篇幅分配 |
| 语言风格要求 | 句式特征+词汇偏好+避免词汇 |
| 思维模式 | 核心思维+论证结构+切入角度 |
| 真实案例对照 | 2-3个完整案例+亮点分析+片段参考 |
| 模仿步骤 | 详细写作步骤(步骤0-N) |
| 常见模仿误区 | 常见错误+纠正方法(至少5个) |
| 质量检查清单 | 表格形式 |
文件2:{风格名}创作风格_微观特征.md
必须包含:
| 内容 | 要求 |
|---|---|
| 句式特征 | 句式类型分布+条件判断句式(至少3个)+概率性表达(至少3个) |
| 词汇特征 | 高频专业术语表(至少10个)+谨慎词使用表+特色比喻词表(至少5个) |
| 修辞手法 | 排比句式+转折句式+数据引导句式 |
| 节奏控制 | 句子节奏+段落节奏+情感与语气 |
| 润色检查清单 | 句式检查项+词汇检查项+标志性表达检查项+情感语气检查项 |
| 正式度评估 | 各维度评分+评分标准 |
---
质量检查清单
生成风格文档时,必须检查:
- [ ] 每个段落的写作示例(100-200字)已提取
- [ ] 写作示例已标注来源
- [ ] 至少2个完整案例已提取
- [ ] 每个案例包含亮点分析和片段参考
- [ ] 内容详尽完整,无省略或截断
---
用户确认 ✋
风格画像生成完成后,必须向用户确认:
✅ Phase 3 完成:风格画像生成
📋 风格摘要:
- 风格名称:{风格名}
- 段落数量:{数量}段
- 核心特征:{列表}
📁 输出文件:
- {风格名}创作风格.md
- {风格名}创作风格_微观特征.md
请确认:
1️⃣ 风格画像是否符合您的写作风格?
2️⃣ 是否有需要调整或补充的内容?
3️⃣ 确认后,输入"确认"继续 Phase 4---
下一步
用户确认后,进入 Phase 4:Skill组装
Phase 4:Skill组装
本文档为 Phase 4 的详细操作指南
---
目标
将风格画像和固化模块组装成完整的、可直接使用的写作Skill。
---
组装流程
Step 1:创建输出目录
import os
from pathlib import Path
# 跨平台兼容的输出目录(使用相对路径)
OUTPUT_BASE = Path("output") # 不用 /output/,兼容Windows/Mac/Linux
output_dir = OUTPUT_BASE / f"{文章类型}-writer"
output_dir.mkdir(parents=True, exist_ok=True)Step 2:生成SKILL.md
必须包含的内容:
---
name: {风格名}-writer
description: 基于{风格名}风格撰写{文章类型},包含{核心能力描述}
dependency:
python:
- akshare>=1.18.0
- pandas>=1.3.0
---
# {风格名}{文章类型}撰写
## 任务目标
- 本Skill用于:{具体描述}
- 能力包含:{列出核心能力}
- 触发条件:{具体触发场景}
## 前置准备
- 依赖说明:akshare>=1.18.0, pandas>=1.3.0, requests>=2.22.0
## 操作步骤
### 标准流程
1. **获取市场数据**
- 调用 scripts/fetch_market_data.py 获取指定日期的A股市场数据
- 支持默认获取上一个交易日数据
2. **撰写{文章类型}(初稿)**
- 严格遵循"{风格名}"创作风格
- 必须包含完整的标题格式
- 采用{段落数量}段式结构
- 数据使用要求:精确数值、数据对比、来源标注
3. **文案润色**
- 严格按照微观特征.md进行润色
- 句式特征检查、核心词汇检查、标志性表达检查
4. **合规检查**
- 调用合规检查.md进行合规检查
5. **输出终稿**
- 保存为Markdown格式
- 可选:使用HTML模板渲染可视化输出
## 注意事项
- 标题格式:{具体格式要求}
- 固定表达:{从样本提取的开头语、结尾格式}
- 概率性表达:使用{谨慎词列表}Step 3:复制固化模块
固化模块是通用模块,直接复制即可:
| 源文件 | 目标文件 |
|---|---|
| 固化模块/compliance.md | output/{类型}-writer/固化模块/compliance.md |
| 固化模块/market_data.py | output/{类型}-writer/固化模块/market_data.py |
| 固化模块/market_data.py | output/{类型}-writer/scripts/fetch_market_data.py |
Step 4:复制风格文档
| 源文件 | 目标文件 |
|---|---|
| {风格名}创作风格.md | output/{类型}-writer/references/{风格名}创作风格.md |
| {风格名}创作风格_微观特征.md | output/{类型}-writer/references/{风格名}创作风格_微观特征.md |
Step 5:生成step文件
复制step模板到目标skill的references/目录:
references/
├── step1.md → output/{类型}-writer/references/step1.md
├── step2.md → output/{类型}-writer/references/step2.md
├── step3.md → output/{类型}-writer/references/step3.md
├── step4.md → output/{类型}-writer/references/step4.md
└── self_eval.md → output/{类型}-writer/references/self_eval.mdStep 6:生成HTML模板
从 assets/html_template.html 复制并定制化:
assets/html_template.html → output/{类型}-writer/references/{风格名}html海报模板.htmlStep 7:生成合规检查
从 固化模块/compliance.md 定制化:
固化模块/compliance.md → output/{类型}-writer/references/{风格名}合规检查.md---
最终输出结构
output/{文章类型}-writer/
├── SKILL.md # 可直接使用的写作Skill
├── 固化模块/
│ ├── compliance.md # 合规红线
│ └── market_data.py # 市场数据脚本
├── scripts/
│ ├── fetch_market_data.py # 可执行脚本
│ └── market_data.md # LLM数据获取驱动指南
└── references/
├── {风格名}创作风格.md
├── {风格名}创作风格_微观特征.md
├── {风格名}html海报模板.html
├── {风格名}合规检查.md
├── step1.md
├── step2.md
├── step3.md
├── step4.md
└── self_eval.md---
完整性检查
组装完成后,验证以下文件是否存在:
- [ ] SKILL.md
- [ ] 固化模块/compliance.md
- [ ] 固化模块/market_data.py
- [ ] scripts/fetch_market_data.py
- [ ] scripts/market_data.md
- [ ] references/step1.md
- [ ] references/step2.md
- [ ] references/step3.md
- [ ] references/step4.md
- [ ] references/self_eval.md
- [ ] references/{风格名}创作风格.md
- [ ] references/{风格名}创作风格_微观特征.md
- [ ] references/{风格名}html海报模板.html
- [ ] references/{风格名}合规检查.md
---
下一步
组装完成后,自动进入 Phase 5:自测评循环
Phase 5:自测评循环
本文档为 Phase 5 的详细操作指南
---
目标
确保生成的Skill真正符合案例标准。采用 LLM驱动 + Python辅助 的自测评模式。
---
核心机制
MD评估指南(LLM执行)
LLM按照 references/self_eval.md 的评估检查表逐Phase执行。
Python辅助工具
scripts/self_eval.py 负责: 1. 特征提取:从样本和生成文章中提取7维度特征 2. 结构对比:计算各维度的匹配度得分 3. 格式校验:调用skill-creator规范或内置校验
---
自测评流程
初始生成
↓
Step 1: 随机选题(自动选择测试主题,如"今日收评")
↓
Step 2: Skill执行(调用生成的Skill生成测试文章)
↓
Step 3: 格式校验 ← LLM按 self_eval.md 检查
↓
Step 4: 7维对比分析 ← Python辅助
↓
Step 5: 差距识别(输出结构差异清单)
↓
├── 达标(≥80%)→ 结束循环
│
└── 未达标 → 修复优化 → 循环(最多3轮)---
达标标准
| 指标 | 标准 | 处理 |
|---|---|---|
| 整体匹配度 | ≥80% | 通过 |
| 单维度匹配度 | ≥60% | 可接受 |
| 任何维度 | <50% | 必须修复 |
| 循环次数 | 最多3轮 | 2轮未达标输出警告 |
---
7维对比权重
| 维度 | 权重 | 说明 |
|---|---|---|
| 标题格式 | 20% | 符号规范、字数、结构 |
| 段落结构 | 20% | 段落数量、功能定位 |
| 分析逻辑 | 20% | 框架、因果、转折 |
| 句式特征 | 15% | 条件句、概率表达 |
| 特色词汇 | 15% | 比喻词、谨慎词 |
| 固定表达 | 10% | 开头语、品牌呼号 |
---
自测评执行方式
自动执行(格式校验 + 文件完整性)
这部分由 Python 脚本自动执行:
# 格式校验 + 文件完整性检查(自动)
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--validate-format-only手动执行(内容质量 + 风格对比)
这部分需要用户提供生成的测试文章:
# 1. 使用生成的Skill生成测试文章(用户手动执行)
# 调用生成的skill,传入测试主题,生成文章
# 2. 7维度风格对比(Python辅助 + LLM判断)
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--reference-samples {案例路径} \
--compare-style-only \
--generated-article {用户生成的测试文章} \
--output style_report.json完整流程
# 完整自测评
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--reference-samples {案例路径} \
--test-topic "今日收评" \
--generated-article {文章内容或文件路径} \
--output eval_report.json注意:完整自测评需要用户提供生成的测试文章,因为自测评的目的是验证Skill在真实场景下能否正常工作。
---
skill-creator 集成
如果 skill-creator 已安装,自测评的格式校验阶段会: 1. 自动调用 skill-creator 的格式校验接口 2. 使用 skill-creator 规范进行 frontmatter 和章节结构检查 3. 如果未安装,则使用内置校验逻辑(等效)
格式校验项
- [ ] YAML frontmatter 存在且包含 name、description、dependency
- [ ] name 字段使用小写字母、数字、连字符
- [ ] name 字段以
-writer或-skill结尾 - [ ] description 不超过200字符
- [ ] 包含"任务目标"、"操作步骤"、"注意事项"章节
- [ ] 文件结构符合 Skill 标准布局
---
输出报告格式
{
"timestamp": "ISO时间戳",
"skill_path": "Skill路径",
"overall_pass": true/false,
"phases": {
"format_validation": {
"passed": true/false,
"issues": []
},
"file_completeness": {
"passed": true/false,
"missing_files": []
},
"content_quality": {
"passed": true/false,
"issues": []
},
"style_comparison": {
"passed": true/false,
"overall_score": 0.85,
"dimension_scores": {}
}
},
"final_verdict": "PASS/NEED_FIX/FAIL",
"recommendations": []
}---
完成后的操作
自测评完成后,必须自动触发一次skill安装检查:
✅ 自测评完成!
📁 生成目录:output/{文章类型}-writer/
🔔 是否安装生成的skill?
运行:/install-skill output/{文章类型}-writer/
或说:"安装这个skill"---
下一步
安装检查完成后,整个流程结束。
投顾写作Skill自评估指南
本文档为投顾写作Skill工厂的自评估检查表
由LLM驱动执行,用于验证生成的Skill是否符合质量标准
---
评估流程总览
Phase 1: 格式校验(skill-creator规范)
↓
Phase 2: 文件完整性检查
↓
Phase 3: 内容质量检查
↓
Phase 4: 7维度风格对比(≥80%通过)
↓
Phase 5: 综合判定与修复建议
↓
Phase 6: Skill安装检查(输出到output/ + 触发安装提示)---
Phase 1:格式校验(skill-creator规范)
使用 skill-creator 的格式标准检查生成的Skill
1.1 YAML Frontmatter 检查
验证 SKILL.md 开头是否包含正确的YAML frontmatter:
---
name: {风格名}-writer
description: 基于{风格名}风格撰写{文章类型}...
dependency:
python:
- akshare>=1.18.0
- pandas>=1.3.0
---检查项:
- [ ] SKILL.md 以
---开头 - [ ] frontmatter 包含
name字段(小写字母、数字、连字符) - [ ] frontmatter 包含
description字段(不超过200字符) - [ ] frontmatter 包含
dependency字段(python依赖) - [ ] name 字段以
-writer或-skill结尾
1.2 章节结构检查
检查项:
- [ ] 包含"任务目标"或"## 任务目标"章节
- [ ] 包含"操作步骤"或"## 操作步骤"章节
- [ ] 包含"注意事项"或"## 注意事项"章节
- [ ] 包含质量检查清单
1.3 文件结构检查
检查项:
- [ ]
SKILL.md存在 - [ ]
scripts/目录存在 - [ ]
references/目录存在 - [ ]
scripts/fetch_market_data.py存在 - [ ]
references/step1.md存在 - [ ]
references/step2.md存在 - [ ]
references/step3.md存在 - [ ]
references/step4.md存在
---
Phase 2:文件完整性检查
逐个检查每个文件的内容是否完整
2.1 SKILL.md 内容检查
检查项:
- [ ] frontmatter 完整(name, description, dependency)
- [ ] "任务目标"章节有明确描述
- [ ] "操作步骤"章节包含完整流程(Phase1→Phase4)
- [ ] "注意事项"章节有实质内容
- [ ] 质量检查清单完整
2.2 {风格名}创作风格.md 内容检查
检查项:
- [ ] 风格核心定义(500字以上)
- [ ] 标题格式说明(含示例)
- [ ] 6段式结构说明(含每段功能定位)
- [ ] 数据使用原则
- [ ] 每个段落类型的写作示例(100-200字,直接来自样本)
- [ ] 至少2个完整案例片段(包含亮点分析和片段参考)
- [ ] 常用表达方式(格局描述、概率性表达、动态描述)
- [ ] 行文节奏与篇幅控制说明
- [ ] 语言风格要求
- [ ] 思维模式说明
- [ ] 常见模仿误区(至少5个)
- [ ] 质量检查清单
2.3 {风格名}创作风格_微观特征.md 内容检查
检查项:
- [ ] 句式特征说明
- [ ] 条件判断句式示例(至少3个)
- [ ] 概率性表达句式示例(至少3个)
- [ ] 高频专业术语表(至少10个)
- [ ] 谨慎词使用表
- [ ] 特色比喻词表及含义(至少5个)
- [ ] 排比句式示例
- [ ] 转折句式示例
- [ ] 数据引导句式示例
- [ ] 润色检查清单(句式、词汇、标志性表达、情感语气)
- [ ] 正式度评估
2.4 step1-4.md 内容检查
每个step文件检查项:
- [ ] 包含章节标题(##)
- [ ] 目标说明清晰
- [ ] 具体操作步骤完整
- [ ] 输出格式说明
- [ ] 下一步预告
2.5 合规检查.md 内容检查
检查项:
- [ ] 禁止表达清单(市场预测类)
- [ ] 禁止表达清单(操作承诺类)
- [ ] 谨慎表达规则
- [ ] 风险提示格式
- [ ] 数据来源标注规范
- [ ] 合规检查清单
---
Phase 3:内容质量检查
基于原始样本,检查生成Skill的内容质量
3.1 风格一致性检查
对比原始样本:
- [ ] 标题格式与样本一致
- [ ] 段落数量与样本一致
- [ ] 固定开头语全部提取
- [ ] 特色词汇全部纳入
- [ ] 分析逻辑框架正确
3.2 自洽性检查
- [ ] SKILL.md 中的格式要求与 创作风格.md 一致
- [ ] 微观特征.md 的检查项与 SKILL.md 的润色步骤一致
- [ ] step1-4 的流程与 SKILL.md 的操作步骤一致
---
Phase 4:7维度风格对比
使用Python辅助工具提取特征,对比生成质量
4.1 运行特征提取
cd {生成的Skill路径}
python scripts/self_eval.py --extract-features --samples {样本路径}4.2 维度评分
| 维度 | 权重 | 通过标准 | 得分 |
|---|---|---|---|
| 标题格式 | 20% | 格式完全一致 | /20 |
| 段落结构 | 20% | 数量和功能一致 | /20 |
| 分析逻辑 | 20% | 框架完整 | /20 |
| 句式特征 | 15% | 条件句/概率表达足够 | /15 |
| 特色词汇 | 15% | 比喻词/谨慎词齐全 | /15 |
| 固定表达 | 10% | 开头语/结尾格式一致 | /10 |
整体匹配度 = Σ(各维度得分) / 100
4.3 通过标准
- 整体匹配度 ≥ 80% → 通过
- 单维度匹配度 ≥ 60% → 可接受
- 任何维度 < 50% → 必须修复
- 最大3轮循环,2轮未达标输出警告
---
Phase 5:综合判定与修复建议
5.1 格式校验结果
- [ ] 通过 → ✅ 格式正确
- [ ] 未通过 → ❌ 列出具体问题
5.2 文件完整性结果
- [ ] 通过 → ✅ 所有文件完整
- [ ] 未通过 → ❌ 列出缺失文件
5.3 内容质量结果
- [ ] 通过 → ✅ 内容质量达标
- [ ] 未通过 → ❌ 列出具体问题
5.4 风格对比结果
| 维度 | 得分 | 状态 |
|---|---|---|
| 标题格式 | /20 | ✅/⚠️/❌ |
| 段落结构 | /20 | ✅/⚠️/❌ |
| 分析逻辑 | /20 | ✅/⚠️/❌ |
| 句式特征 | /15 | ✅/⚠️/❌ |
| 特色词汇 | /15 | ✅/⚠️/❌ |
| 固定表达 | /10 | ✅/⚠️/❌ |
| 整体 | /100 | ✅/❌ |
5.5 最终判定
综合结果:
- ✅ 全部通过 → Skill可交付
- ⚠️ 部分通过 → 需要修复后重新评估
- ❌ 未通过 → 需要重大修改
5.6 修复建议
针对每个❌/⚠️项,给出具体修复建议:
【问题1】描述
修复建议:具体操作步骤
【问题2】描述
修复建议:具体操作步骤---
Phase 6:Skill安装检查
评估通过后,必须执行此步骤
6.1 确认输出目录
确认生成的Skill已输出到指定目录:
output/{文章类型}-writer/6.2 触发安装检查
评估通过后,自动提示用户是否安装:
✅ Skill评估通过,已生成到 `output/{文章类型}-writer/`
🔔 是否安装生成的skill?
运行:/install-skill output/{文章类型}-writer/
或说:"安装这个skill"6.3 安装后验证
Skill安装后,验证:
- [ ] Skill可被 Skill 工具识别
- [ ] 执行一次试运行验证可用性
---
评估执行命令
完整评估
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--reference-samples {样本路径} \
--test-topic "今日收评" \
--output eval_report.json仅格式校验
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--validate-format-only仅风格对比
python scripts/self_eval.py \
--skill-path {生成的Skill路径} \
--reference-samples {样本路径} \
--compare-style-only---
输出报告格式
评估完成后,生成报告:
{
"timestamp": "ISO时间戳",
"skill_path": "Skill路径",
"overall_pass": true/false,
"phases": {
"format_validation": {
"passed": true/false,
"issues": []
},
"file_completeness": {
"passed": true/false,
"missing_files": []
},
"content_quality": {
"passed": true/false,
"issues": []
},
"style_comparison": {
"passed": true/false,
"overall_score": 0.85,
"dimension_scores": {}
}
},
"final_verdict": "PASS/NEED_FIX/FAIL",
"recommendations": []
}Step 1:获取基础素材
本文档为具体Skill(如"收评writer")的操作Phase 1
当具体Skill执行时,按此步骤获取市场数据和热点资讯
元skill生成具体Skill时,将此步骤复制到生成物的 references/step1.md---
目标
获取撰写文章所需的全部基础素材,包括市场行情数据和影响市场的热点资讯。
---
素材清单
| 素材类型 | 内容 | 来源 |
|---|---|---|
| 指数行情 | 上证/深证/创业板当日收盘数据 | akshare/东方财富 |
| 成交额 | 两市总成交额及环比变化 | akshare |
| 热点资讯 | 重大政策、事件快讯 | 同花顺/东方财富 |
| 板块表现 | 行业/概念板块涨跌幅排行 | 东方财富 |
| 资金流向 | 北向资金、主力资金动向 | Wind/东方财富 |
---
操作命令
获取市场数据
# 获取上一交易日市场数据(默认)
python scripts/fetch_market_data.py
# 获取指定日期数据
python scripts/fetch_market_data.py 2026-03-25
# 输出JSON格式(用于后续处理)
python scripts/fetch_market_data.py --json数据输出
{
"date": "2026-03-25",
"indices": {
"000001": {"name": "上证指数", "close": 4065.0, "change_pct": 0.09, "amount": 2.5},
"399001": {"name": "深证成指", "close": 11500.0, "change_pct": -0.35, "amount": 3.2},
"399006": {"name": "创业板指", "close": 2300.0, "change_pct": -1.08, "amount": 1.5}
},
"market_summary": {
"rise_count": 1,
"fall_count": 2,
"total_amount": 7.2,
"market_type": "分化"
}
}---
热点资讯获取
热点资讯需要人工/AI从以下来源收集:
1. 政策面:证监会官网、央行官网、统计局 2. 资金面:北向资金公开数据、主力资金流向 3. 事件面:重要财经新闻、公告
收集维度:
- 事件名称
- 官方来源
- 影响板块(利好/利空)
- 影响时长(短期/中期/长期)
---
素材准备检查清单
- [ ] 三大指数收盘数据完整(上证、深证、创业板)
- [ ] 成交额数据获取
- [ ] 重大政策/事件已收集(至少2-3条)
- [ ] 板块表现数据(如有)
- [ ] 资金流向数据(如有)
---
下一步
进入 Step 2:撰写文章初稿
基础素材准备完毕后,基于分析框架和数据撰写文章初稿。
Step 2:撰写文章初稿
本文档为具体Skill(如"收评writer")的操作Phase 2
当具体Skill执行时,按此步骤基于分析框架和数据撰写初稿
元skill生成具体Skill时,将此步骤复制到生成物的 references/step2.md---
目标
基于Step 1获取的市场数据和分析框架,撰写出符合格式规范的评论文章初稿。
---
分析框架(数据→事件→逻辑→结论→建议)
Step 1数据 → 事件影响分析 → 逻辑推理 → 结论判断 → 操作建议---
文章结构规范
标准6段式结构
| 段落 | 功能 | 固定开头语 | 字数 |
|---|---|---|---|
| 第1段 | 市场概述 | 昨日A股市场... | 100-150字 |
| 第2段 | 事件分析 | 近期事件层面... | 150-200字 |
| 第3段 | 外围传导 | 关联市场方面... | 100-150字 |
| 第4段 | 技术分析 | 走势结构上... | 100-150字 |
| 第5段 | 资金板块 | 鱼群方面... | 150-200字 |
| 第6段 | 操作建议 | 操作思路上... | 100-150字 |
标题格式
【{栏目名称}·{文章类型}】{核心观点标题}
——本栏目为"{作者}"观点{收评/早评}示例:
【年年有鱼·市场评论】节前收官在即,鱼群高低切换待春归
——本栏目为"于晴于理"观点收评---
数据使用规范
必须遵循的原则
1. 精确数值:指数涨跌幅精确到小数点后两位(如+0.09%) 2. 对比表达:使用"环比""较前一日""占比"等对比词 3. 来源标注:关键数据标注来源(如"根据东方财富数据显示") 4. 具体而非模糊:用"2.15万亿"而非"约2万亿"
数据表达模板
上证指数微涨0.09%,深证成指下跌0.35%,创业板指下跌1.08%
两市成交额2.15万亿元,较前一日缩量约300亿元
北向资金净流出约50亿元---
句式规范
条件判断句(必须使用)
若没有增量资金配合,指数将维持震荡
若成交量不能有效放大,突破前高难度较大
外围市场若持续走弱,A股大概率跟随调整概率性表达(必须使用)
大概率、或、可能、倾向于、值得关注禁止使用
- ❌ 暴涨、暴跌、肯定、绝对、必然
- ❌ 推荐买入、赶紧买、满仓梭哈
- ❌ 抄底、逃顶
---
初稿撰写检查清单
- [ ] 标题格式正确(含【】主标题 + ——副标题)
- [ ] 第1段包含市场概述(指数+成交额)
- [ ] 第2段包含事件/政策分析
- [ ] 第3段包含外围市场传导
- [ ] 第4段包含技术走势分析
- [ ] 第5段包含资金/板块分析(含特色比喻"鱼群")
- [ ] 第6段包含操作建议
- [ ] 每段开头语符合固定格式
- [ ] 使用条件判断句(如"若...则...")
- [ ] 使用概率性表达(大概率/或/可能)
- [ ] 整体篇幅在800-1200字范围内
- [ ] 无绝对化表达
---
下一步
进入 Step 3:写作风格润色
初稿完成后,基于提取的写作风格进行精细润色。
Step 3:写作风格润色
本文档为具体Skill(如"收评writer")的操作Phase 3
当具体Skill执行时,按此步骤基于微观特征进行风格润色
元skill生成具体Skill时,将此步骤复制到生成物的 references/step3.md---
目标
严格按照提取的写作风格(微观特征),对初稿进行润色,确保风格一致性。
---
润色工具
{风格名}创作风格_微观特征.md— 微观特征详细说明{风格名}创作风格.md— 完整风格指南
---
句式特征检查
表达规范化
| 原始表达 | 润色后 | 原因 |
|---|---|---|
| 涨了 | 微涨 | 更专业 |
| 跌了 | 下跌 | 更规范 |
| 有动作 | 呈现...动作 | 更准确 |
| 涨了很多 | 大幅上涨 | 避免绝对化 |
| 跌了很多 | 大幅下跌 | 避免绝对化 |
数据引导句式
必须添加数据来源引导:
根据东方财富数据显示...
根据Wind数据显示...
根据证监会XX文件...条件判断句式
确保每段至少有一处条件判断:
若没有增量资金,指数将维持震荡
若成交量不能有效放大,突破前高难度较大---
词汇特征检查
专业术语使用
必须使用的专业术语:
缩量、放量、震荡、轮动、催化、避险、分化、高低切换
突破、支撑、压力、趋势、均线、背离
净流入、净流出、防御性调仓、进攻性布局
逢低布局、控制仓位、高抛低吸、分散风险谨慎词使用
必须使用的谨慎词:
大概率、或、可能、倾向于、值得关注、有望、建议特色比喻词
根据风格配置使用(如有):
鱼群(资金流向)、鲸鱼(大资金)、压舱石(稳健板块)
跷跷板(板块轮动)、风向标(领先指标)、领头羊(领先板块)禁止用词
❌ 暴涨、暴跌(改为:大幅上涨/下跌)
❌ 肯定、绝对、必然(改为:大概率、或)
❌ 推荐买入、赶紧买、满仓梭哈
❌ 抄底、逃顶---
标志性表达检查
确保使用风格特有的标志性表达:
| 段落 | 标志性表达 |
|---|---|
| 市场概述 | 昨日A股市场... |
| 事件分析 | 近期事件层面... |
| 外围市场 | 关联市场方面... |
| 技术分析 | 走势结构上... |
| 资金板块 | 鱼群方面... |
| 操作建议 | 操作思路上... |
| 结尾 | 风险提示固定格式 + 品牌呼号 |
---
情感语气检查
情感强度控制
- 低情感强度:冷静理性,数据说话
- 中性偏稳健:避免乐观或悲观极端
- 间接传递情绪:通过数据和分析体现态度
语气特点
- 客观陈述:用数据和市场事实说话
- 谨慎表达:避免极端化判断
- 专业但易懂:不过于学术化
- 有立场但不固执:有明确观点,但留有余地
---
润色检查清单
句式特征
- [ ] "涨了" → "微涨"
- [ ] "跌了" → "下跌"
- [ ] "有动作" → "呈现...动作"
- [ ] 添加数据引导句("根据...数据显示")
- [ ] 使用条件判断句("若...则...")
核心词汇
- [ ] 使用专业术语(缩量、震荡、轮动、催化、避险)
- [ ] 使用谨慎词(大概率、或、可能、倾向于)
- [ ] 使用特色比喻(如风格配置有)
- [ ] 移除绝对化表达(暴涨、暴跌、肯定、绝对)
标志性表达
- [ ] "走势结构上"引入技术分析段
- [ ] "鱼群方面"作为资金流向段开头
- [ ] "操作思路上"引入操作建议段
- [ ] 固定结尾格式(风险提示 + 品牌呼号)
情感语气
- [ ] 保持低情感强度,冷静理性
- [ ] 中性偏稳健,避免极端
- [ ] 通过数据和分析间接传递情绪
---
润色禁止事项
- ❌ 改变核心观点和判断逻辑
- ❌ 改变段落结构
- ❌ 删除或修改数据信息
- ❌ 增加新的观点或分析内容
- ❌ 大幅重组段落顺序
---
下一步
进入 Step 4:HTML可视化输出
润色完成后,使用HTML模板生成可视化海报。
Step 4:HTML可视化输出
本文档为具体Skill(如"收评writer")的操作Phase 4
当具体Skill执行时,按此步骤使用HTML模板生成可视化海报
元skill生成具体Skill时,将此步骤复制到生成物的 references/step4.md---
目标
将润色后的文章内容填充到HTML模板中,生成可分享的视觉化海报。
---
HTML模板
模板文件:references/{风格名}html海报模板.html
模板使用 Tailwind CSS 构建,无需额外安装。
---
模板变量说明
必填变量
| 变量名 | 说明 | 示例 |
|---|---|---|
{{BRAND_NAME}} | 品牌/栏目名称 | 年年有鱼 |
{{AUTHOR_NAME}} | 作者姓名 | 于晴于理 |
{{ARTICLE_TYPE}} | 文章类型 | 收评/早评 |
{{HEADLINE}} | 主标题 | 节前收官在即,鱼群高低切换待春归 |
{{SUBTITLE}} | 副标题(——本栏目为...) | ——本栏目为"于晴于理"观点收评 |
{{PUBLISH_DATE}} | 发布日期 | 2026年3月25日 |
{{RISK_DISCLOSURE}} | 风险提示文字 | 本内容仅供参考,不构成投资建议... |
{{SUBSCRIPTION_CTA}} | 签约引导语 | 解锁更多内容 |
内容区变量(根据文章段落)
| 变量名 | 对应段落 |
|---|---|
{{MARKET_SUMMARY}} | 第1段:市场概述 |
{{EVENT_ANALYSIS}} | 第2段:事件分析 |
{{PERIPHERY_MARKET}} | 第3段:外围市场 |
{{TECH_ANALYSIS}} | 第4段:技术分析 |
{{FUND_FLOW}} | 第5段:资金板块 |
{{OPERATION_SUGGESTION}} | 第6段:操作建议 |
数据卡片变量
| 变量名 | 说明 | 示例 |
|---|---|---|
{{INDEX_DATA}} | 指数数据JSON | 见下方格式 |
{{FUND_DATA}} | 资金流向数据 | 见下方格式 |
---
数据卡片格式
指数数据
<div class="data-card bg-rice-paper rounded-lg p-3 border border-light-gray">
<div class="flex justify-between items-center mb-1">
<span class="text-xs text-silver-gray">上证指数</span>
<span class="text-xs text-silver-gray">2月6日</span>
</div>
<div class="font-mono text-2xl font-bold text-daiqing">4065</div>
<div class="text-xs text-silver-gray mt-1">震荡延续</div>
</div>JSON格式数据
如果使用JavaScript动态渲染:
const indexData = [
{ name: "上证指数", value: "4065", change: "+0.09%", date: "2月6日", status: "震荡" },
{ name: "深证成指", value: "11500", change: "-0.35%", date: "2月6日", status: "分化" },
{ name: "两市成交额", value: "2.15", unit: "万亿", subtext: "-300亿", trend: "↓缩量" }
];---
操作流程
方式一:手动替换
1. 打开 references/{风格名}html海报模板.html 2. 搜索 {{VARIABLE_NAME}} 3. 替换为实际内容 4. 保存为新文件(如 output_20260325.html)
方式二:脚本渲染
如果项目包含 render_html.py:
python scripts/render_html.py \
--template references/{风格名}html海报模板.html \
--data ./market_data_20260325.json \
--article ./article_final.md \
--output ./poster_20260325.html---
生成后检查
- [ ] 所有
{{VARIABLE_NAME}}已被替换(无遗留) - [ ] 标题显示正确
- [ ] 风险提示完整
- [ ] 品牌信息正确
- [ ] 日期正确
- [ ] 整体布局正常
---
输出
生成完成后,可:
1. 直接打开:在浏览器中查看效果 2. 截图分享:使用浏览器截图工具 3. 打印PDF:浏览器打印功能导出
---
完整流程结束
恭喜!文章从数据获取到可视化输出已完成。
最终输出物:
article_final.md— 文章终稿(Markdown)poster_YYYYMMDD.html— 可视化海报(HTML)
风格画像模板
本文档由投顾写作Skill工厂自动生成
模板文件,具体内容在训练时填充
---
基本信息
- 文章类型:{收评/开盘前瞻/...}
- 训练样本:{X}篇
- 训练日期:{YYYY-MM-DD}
- 作者:{姓名}---
核心模式(≥80%文章一致)
标题格式
{提取结果}段落结构
{提取结果}分析逻辑
{提取结果}固定表达
{提取结果}数据规范
{提取结果}---
标准模式(50-79%文章一致)
{提取结果}---
可选变体(<50%文章一致)
{个性化选项}---
训练样本清单
| 序号 | 日期 | 文章标题 | 核心亮点 |
|---|---|---|---|
| 1 | {date} | {title} | {highlight} |
| 2 | {date} | {title} | {highlight} |
| 3 | {date} | {title} | {highlight} |
市场数据获取固化模块
本模块为投顾写作Skill工厂的固化模块
提供A股市场数据获取的标准接口和LLM驱动指南
生成具体Skill时,本模块内容将复制到对应 scripts/market_data.md---
功能定位
投顾文章需要准确的市场数据作为撰写基础。本模块定义: 1. 必需数据:撰写文章必须获取的数据类型 2. API接口:akshare数据获取接口映射 3. 容错策略:多数据源fallback机制 4. 输出格式:标准化JSON输出格式
---
必需数据类型
撰写市场评论前,必须获取以下数据:
| 数据类型 | 用途 | 优先级 |
|---|---|---|
| 三大指数行情 | 市场概述段(涨跌幅、点位、成交额) | 必需 |
| 两市成交额 | 判断资金活跃度 | 必需 |
| 板块表现 | 鱼群/资金流向段 | 推荐 |
| 北向资金 | 资金流向参考(如可用) | 可选 |
| 热点资讯 | 事件分析段素材 | 推荐 |
---
akshare API 映射
指数行情
# 上证指数
ak.index_zh_a_hist(symbol="000001", period="daily", start_date=date, end_date=date)
# 返回字段:收盘、开盘、最高、最低、成交量、成交额、涨跌幅
# 深证成指
ak.index_zh_a_hist(symbol="399001", period="daily", start_date=date, end_date=date)
# 创业板指
ak.index_zh_a_hist(symbol="399006", period="daily", start_date=date, end_date=date)关键字段:
收盘/close- 收盘点位涨跌幅/change_pct- 涨跌幅百分比成交额/amount- 成交额(元)
北向资金
ak.stock_hsgt_north_net_flow_in_em(symbol="北向", start_date=date, end_date=date)重要限制:东方财富北向资金API通常仅支持获取当日或近期数据,查询历史日期可能返回空值。
处理规则:
- 若北向资金数据为null、0或unavailable,直接忽略该部分内容
- 不虚构北向资金数据
- 可用其他资金流向数据(如融资融券余额)作为替代
板块数据
# 行业板块涨跌排行
ak.stock_board_industry_name_em()
# 返回字段:板块名称、涨跌幅、成交额、上涨家数、下跌家数市场统计
# 个股涨跌统计
ak.stock_zh_a_spot_em()
# 可计算:涨停家数、跌停家数、上涨家数、下跌家数---
多数据源容错策略
当主数据源失败时,按以下顺序 fallback:
指数数据 fallback 链
东方财富EM (stock_zh_index_daily_em)
↓ 失败
腾讯股票API (stock_zh_index_daily_tx)
↓ 失败
中证指数 (index_zh_a_hist)
↓ 失败
返回 error 状态,文章中标注"数据获取失败"北向资金 fallback 链
东方财富EM (stock_hsgt_north_net_flow_in_em)
↓ 失败/无历史数据
返回 null,文章中直接忽略北向资金相关内容---
标准化输出格式
指数行情输出
{
"indices": [
{
"code": "000001",
"name": "上证指数",
"date": "2026-03-25",
"close": 4065.0,
"change": 3.65,
"change_pct": 0.09,
"amount": 2500000000000,
"amount_str": "2.50万亿",
"status": "success"
},
{
"code": "399001",
"name": "深证成指",
"close": 11500.0,
"change": -40.25,
"change_pct": -0.35,
"amount": 3200000000000,
"amount_str": "3.20万亿",
"status": "success"
},
{
"code": "399006",
"name": "创业板指",
"close": 2300.0,
"change": -25.08,
"change_pct": -1.08,
"amount": 1500000000000,
"amount_str": "1.50万亿",
"status": "success"
}
],
"market_summary": {
"rise_count": 1,
"fall_count": 2,
"market_type": "分化",
"total_amount": 7.2,
"total_amount_str": "7.20万亿",
"status": "success"
}
}板块表现输出
{
"sectors": {
"top_risers": [
{"name": "银行", "change_pct": 0.85, "amount": 320000000000},
{"name": "石油", "change_pct": 0.72, "amount": 180000000000}
],
"top_fallers": [
{"name": "科技", "change_pct": -2.15, "amount": 450000000000},
{"name": "新能源", "change_pct": -1.88, "amount": 380000000000}
]
},
"status": "success"
}资金流向输出
{
"north_bound": {
"net_flow": 5000000000,
"net_flow_str": "净流入50亿元",
"status": "success|unavailable|null"
},
"status": "success"
}---
LLM 驱动模式
当 akshare 不可用或需要快速获取数据时,LLM 可通过搜索获取数据:
搜索获取策略
1. 指数行情:搜索"上证指数 2026-03-25 收盘" 2. 板块排行:搜索"A股板块 2026-03-25 涨幅排行" 3. 资讯事件:搜索"2026年3月25日 A股重大消息"
搜索结果使用规范
- 搜索结果作为补充参考,优先使用 akshare 获取的精确数据
- 搜索获取的数据需标注来源(如"根据东方财富数据显示")
- 搜索结果可能存在延迟,重要数据需多源交叉验证
---
数据质量检查
获取数据后,撰写前必须验证:
1. 完整性:三大指数数据是否全部获取 2. 有效性:涨跌幅是否为有效数值(非NaN) 3. 一致性:指数点位与涨跌幅方向是否匹配(涨→点位上升) 4. 时效性:数据日期是否为指定交易日
异常处理
| 异常情况 | 处理方式 |
|---|---|
| 指数数据缺失 | 标注"数据获取失败",避免涉及该指数 |
| 涨跌幅为0或异常 | 检查数据源,更换数据接口 |
| 北向资金不可用 | 直接忽略,不虚构 |
| 节假日无数据 | 使用最近交易日数据,并标注 |
---
依赖
- 必需:akshare >= 1.18.0, pandas >= 1.3.0
- 可选:requests(用于搜索模式)
---
注意事项
1. 数据精度:指数涨跌幅精确到小数点后两位,成交额单位统一为"亿元"或"万亿元" 2. 历史查询:腾讯数据源仅支持当日快照,历史查询用东方财富EM源 3. 频率限制:东方财富API可能有访问频率限制,批量查询添加适当延迟 4. 容错优先:任何数据获取失败都不应阻断文章撰写,使用"数据获取失败"标注
合规红线模块(固化)
本模块为通用合规规则,所有生成的Skill均强制集成
不需要从案例中提取,直接使用
---
禁止表达清单
市场预测类(绝对禁止)
- ❌ 必将大涨、必将大跌
- ❌ 确定上涨、确定下跌
- ❌ 一定涨、一定跌
- ❌ 必然会、必定会
操作承诺类(绝对禁止)
- ❌ 推荐买入、推荐卖出
- ❌ 赶紧买、赶紧卖
- ❌ 满仓梭哈
- ❌ 抄底、逃顶
绝对化词汇(谨慎使用)
- ❌ 暴涨、暴跌
- ❌ 极好、极差
- ❌ 完全、彻底
- ❌ 只能、必须(操作建议中)
---
谨慎表达规则
概率性表达(推荐使用)
- ✅ 大概率
- ✅ 或
- ✅ 可能
- ✅ 倾向于
- ✅ 值得关注
操作建议表达
- ✅ 建议关注
- ✅ 可以考虑
- ✅ 逢低布局
- ✅ 控制仓位
- ✅ 分散风险
---
风险提示格式
每篇文章结尾必须包含:
本内容仅供参考,不构成投资建议。投资者据此操作,风险自担。
市场有风险,投资需谨慎。---
数据来源标注
必须标注来源的数据
- 指数行情:✅ "根据官方行情数据显示"
- 资金流向:✅ "根据官方行情数据显示"
- 政策文件:✅ "根据证监会XX文件"
- 新闻报道:✅ "根据XX媒体报道"
禁止
- ❌ 模糊来源:"据悉"、"有消息称"(必须核实)
- ❌ 无来源数据
---
合规检查清单
生成内容后自检:
- [ ] 无绝对化市场预测词汇
- [ ] 无操作承诺性语句
- [ ] 有风险提示
- [ ] 关键数据有来源标注
- [ ] 使用概率性表达(大概率/或/可能)
#!/usr/bin/env python3
"""
投顾写作Skill工厂 - 市场数据获取固化模块
功能:
1. 获取A股市场主要指数数据(上证、深证、创业板)
2. 获取板块行情数据
3. 获取资金流向数据
4. 格式化输出供写作使用
用法:
python market_data.py [日期]
python market_data.py 2026-03-25
依赖:
pip install akshare pandas requests
"""
import argparse
import json
import sys
from datetime import datetime, timedelta
from typing import Dict, Any, Optional, List
# 尝试导入akshare,如果失败则使用模拟数据
try:
import akshare as ak
HAS_AKSHARE = True
except ImportError:
HAS_AKSHARE = False
print("⚠️ 警告: akshare未安装,将使用模拟数据")
print(" 安装命令: pip install akshare")
# ============ 数据获取函数 ============
def get_previous_trading_day(date_str: Optional[str] = None) -> str:
"""获取指定日期的前一个交易日"""
if date_str:
target = datetime.strptime(date_str, "%Y-%m-%d")
else:
target = datetime.now()
# 简单实现:如果是周末,往前找
while target.weekday() >= 5: # 5=Saturday, 6=Sunday
target -= timedelta(days=1)
return target.strftime("%Y-%m-%d")
def fetch_index_data(symbol: str, name: str, date: str) -> Dict[str, Any]:
"""获取单个指数数据"""
result = {
"name": name,
"symbol": symbol,
"date": date,
"status": "unknown",
}
if not HAS_AKSHARE:
result["status"] = "mock"
result["close"] = 3000.0 + hash(date) % 1000
result["change"] = 0.5
result["change_pct"] = 0.5
result["volume"] = 250000000000
result["amount"] = 2500000000000
return result
try:
if symbol == "000001": # 上证指数
df = ak.index_zh_a_hist(symbol="000001", period="daily", start_date=date, end_date=date)
elif symbol == "399001": # 深证成指
df = ak.index_zh_a_hist(symbol="399001", period="daily", start_date=date, end_date=date)
elif symbol == "399006": # 创业板指
df = ak.index_zh_a_hist(symbol="399006", period="daily", start_date=date, end_date=date)
else:
df = ak.index_zh_a_hist(symbol=symbol, period="daily", start_date=date, end_date=date)
if df is not None and len(df) > 0:
row = df.iloc[-1]
result["close"] = float(row.get("收盘", row.get("close", 0)))
result["open"] = float(row.get("开盘", row.get("open", 0)))
result["high"] = float(row.get("最高", row.get("high", 0)))
result["low"] = float(row.get("最低", row.get("low", 0)))
result["volume"] = float(row.get("成交量", row.get("volume", 0)))
result["amount"] = float(row.get("成交额", row.get("amount", 0)))
# 计算涨跌幅
prev_close = float(row.get("前收盘", row.get("pre_close", result["close"])))
if prev_close > 0:
result["change"] = result["close"] - prev_close
result["change_pct"] = (result["change"] / prev_close) * 100
result["status"] = "success"
else:
result["status"] = "no_data"
except Exception as e:
result["status"] = "error"
result["error"] = str(e)
return result
def fetch_market_data(date: Optional[str] = None) -> Dict[str, Any]:
"""获取市场数据主函数"""
if not date:
date = get_previous_trading_day()
else:
date = get_previous_trading_day(date)
result = {
"date": date,
"indices": {},
"market_summary": {},
"status": "unknown",
}
# 获取三大指数
indices = [
("000001", "上证指数"),
("399001", "深证成指"),
("399006", "创业板指"),
]
for symbol, name in indices:
result["indices"][symbol] = fetch_index_data(symbol, name, date)
# 计算市场整体情况
all_success = all(idx.get("status") == "success" for idx in result["indices"].values())
if all_success:
# 上涨/下跌/平盘计数
rises = sum(1 for idx in result["indices"].values() if idx.get("change_pct", 0) > 0)
falls = sum(1 for idx in result["indices"].values() if idx.get("change_pct", 0) < 0)
total_amount = sum(idx.get("amount", 0) for idx in result["indices"].values())
avg_change = sum(idx.get("change_pct", 0) for idx in result["indices"].values()) / len(indices)
result["market_summary"] = {
"rise_count": rises,
"fall_count": falls,
"total_amount": total_amount,
"avg_change_pct": avg_change,
"market_type": "普涨" if rises > falls else ("普跌" if falls > rises else "分化"),
}
result["status"] = "success"
else:
result["status"] = "partial"
result["market_summary"] = {
"rise_count": 0,
"fall_count": 0,
"market_type": "数据获取失败",
}
return result
def format_market_report(data: Dict[str, Any]) -> str:
"""格式化市场数据为可读报告"""
if data.get("status") == "error":
return f"❌ 数据获取失败: {data.get('error', '未知错误')}"
date = data.get("date", "未知日期")
lines = [
f"=== A股市场数据 ({date}) ===",
"",
"【主要指数】",
]
for symbol, idx in data.get("indices", {}).items():
name = idx.get("name", symbol)
status = idx.get("status", "unknown")
if status == "success":
close = idx.get("close", 0)
change = idx.get("change", 0)
change_pct = idx.get("change_pct", 0)
amount = idx.get("amount", 0)
direction = "▲" if change > 0 else ("▼" if change < 0 else "―")
change_str = f"{direction}{abs(change):.2f}点({change_pct:+.2f}%)"
# 格式化成交额
if amount >= 100000000000:
amount_str = f"{amount/100000000000:.2f}万亿元"
else:
amount_str = f"{amount/100000000:.2f}亿元"
lines.append(f" {name}: {close:.2f} {change_str} 成交额{amount_str}")
else:
lines.append(f" {name}: 数据获取失败({status})")
summary = data.get("market_summary", {})
if summary:
lines.extend([
"",
"【市场概况】",
f" 整体态势: {summary.get('market_type', '未知')}",
])
return "\n".join(lines)
# ============ CLI入口 ============
def main():
parser = argparse.ArgumentParser(description="获取A股市场数据")
parser.add_argument("date", nargs="?", default=None, help="交易日期(YYYY-MM-DD),默认为上一交易日")
parser.add_argument("--json", action="store_true", help="输出JSON格式")
parser.add_argument("--format", choices=["report", "json", "raw"], default="report", help="输出格式")
args = parser.parse_args()
# 获取数据
data = fetch_market_data(args.date)
# 根据格式输出
if args.format == "json" or args.json:
print(json.dumps(data, ensure_ascii=False, indent=2))
elif args.format == "raw":
for symbol, idx in data.get("indices", {}).items():
print(f"{symbol}: {idx}")
else:
print(format_market_report(data))
# 返回状态码
return 0 if data.get("status") == "success" else 1
if __name__ == "__main__":
sys.exit(main())