feat: 仓颉技能更新 + 马克思主义股票分析框架落地

- 更新 cangjie-distill skill (v1.1→v1.2),内嵌完整 RIA-TV++ 六段
- 用仓颉技能提炼马克思主义:四字结构 + RIA-TV++ 完整蒸馏
- 新增 stock_contradiction_workflow.py:矛盾分析工作流
  * 四维评分(宏观/基本面/技术面/消息面)
  * MA20 信号监控
  * 马克思主义分析框架视角
- 注册每周一 cron:股票矛盾分析周报 → 飞书群
- 更新 topics.json:马克思主义分析框架固化进股票投研体系

牧尘:分析要落实到工作中,不能只停留在嘴上
This commit is contained in:
小唯 A06 2026-07-17 12:36:48 +08:00
parent 5ef4b3eab9
commit 83671f9a1b
4 changed files with 565 additions and 1 deletions

View File

@ -68,7 +68,28 @@
"created_at": "2026-07-11", "created_at": "2026-07-11",
"last_research": "2026-07-11", "last_research": "2026-07-11",
"expected": "小唯能独立输出个股分析报告,牧尘能理解并参与策略制定", "expected": "小唯能独立输出个股分析报告,牧尘能理解并参与策略制定",
"notes": "目标:先模拟,达到预期再实操。风控由牧尘定。" "notes": "目标:先模拟,达到预期再实操。风控由牧尘定。方法论:马克思主义矛盾分析框架,用实践检验真理。",
"meta_methods": {
"name": "马克思主义分析框架",
"description": "用辩证唯物主义指导股票投资决策",
"applies_to": "所有 phase跨阶段方法论",
"framework": {
"本质": "实践是检验真理的唯一标准",
"核心方法": "矛盾分析法",
"三定律": [
"对立统一",
"量变质变",
"否定之否定"
],
"应用": {
"分析阶段": "看清市场主要矛盾(多空/估值vs趋势/宏观vs微观",
"决策阶段": "等MA20金叉=量变质变的质变信号",
"复盘阶段": "每轮否定之否定,螺旋上升"
}
},
"workflow_file": "~/.hermes/scripts/stock_contradiction_workflow.py",
"cron": "每周一 09:00 自动运行"
}
} }
] ]
} }

View File

@ -0,0 +1,234 @@
#!/usr/bin/env python3
"""
小唯股票投研 矛盾分析工作流
===============================
用马克思主义矛盾分析法指导每周投资复盘
原理
1. 实践是检验真理的唯一标准 模拟持仓验证判断
2. 对立统一 市场里的多空矛盾
3. 量变质变 MA20金叉/死叉是质变信号
4. 否定之否定 每周复盘迭代策略
用法
python3 stock_contradiction_workflow.py report # 输出本周矛盾分析
python3 stock_contradiction_workflow.py check # 检查持仓状态MA20信号
python3 stock_contradiction_workflow.py record # 记录本周分析到历史
"""
import json
import os
import sys
from datetime import datetime
# ============ 配置 ============
HISTORY_FILE = os.path.expanduser("~/.hermes/stock_backtest/contradiction_history.json")
OUTPUT_DIR = os.path.expanduser("~/.hermes/stock_backtest/")
# ============ 四维评分标准 ============
# 宏观面:-1=系统性压力 / 0=中性 / +1=友好
# 基本面:-1=差 / 0=中性 / +1=强
# 技术面:-1=下跌趋势 / 0=震荡 / +1=上升趋势
# 消息面:-1=利空 / 0=中性 / +1=利好
def load_history():
"""加载历史矛盾分析记录"""
if os.path.exists(HISTORY_FILE):
with open(HISTORY_FILE) as f:
return json.load(f)
return {"weeks": [], "positions": {}}
def save_history(history):
"""保存历史记录"""
os.makedirs(os.path.dirname(HISTORY_FILE), exist_ok=True)
with open(HISTORY_FILE, "w") as f:
json.dump(history, f, ensure_ascii=False, indent=2)
def get_ma20_signal(code):
"""
MA20 状态用腾讯行情 API
返回{"code": "000858", "name": "五粮液", "signal": "golden_cross"|"dead_cross"|"neutral", "price": xxx}
"""
import urllib.request
# 转换代码格式
if code.startswith("0") or code.startswith("3"):
market = "sz"
else:
market = "sh"
url = f"https://qt.gtimg.cn/q={market}{code}"
try:
with urllib.request.urlopen(url, timeout=5) as resp:
data = resp.read().decode("gbk")
parts = data.split("~")
if len(parts) < 33:
return None
name = parts[1]
price = float(parts[3]) # 现价
ma5 = float(parts[33]) # 5日均线
ma10 = float(parts[34]) # 10日均线
ma20 = float(parts[35]) # 20日均线
# 判断 MA20 信号
if ma5 > ma20 and price > ma20:
signal = "golden_cross" # 潜在金叉5日上穿20日
elif ma5 < ma20 and price < ma20:
signal = "dead_cross" # 死叉5日下穿20日
else:
signal = "neutral"
return {
"code": code,
"name": name,
"signal": signal,
"price": price,
"ma5": ma5,
"ma10": ma10,
"ma20": ma20
}
except Exception as e:
return {"code": code, "error": str(e)}
def analyze_week():
"""生成本周矛盾分析"""
history = load_history()
# 持仓股票
positions = history.get("positions", {
"000858": {"name": "五粮液", "status": "空仓等金叉", "avg_cost": None},
})
# 检查 MA20 信号
signals = {}
for code in ["000858", "600519", "000568", "002304", "601318", "600036"]:
result = get_ma20_signal(code)
if result:
signals[code] = result
# 矛盾分析框架
now = datetime.now()
week_num = now.isocalendar()[1]
# 核心矛盾(五粮液)
wuliangye = signals.get("000858", {})
contradiction = {
"week": f"{now.year}-W{week_num:02d}",
"date": now.strftime("%Y-%m-%d"),
"market_contradictions": [
{
"contradiction": "宏观经济下行 vs 消费刚需(白酒)",
"manifestation": "宏观面-1但五粮液基本面+1",
"current_phase": "矛盾积累阶段,等待技术面确认方向",
"action": "空仓等待,观察宏观拐点信号"
},
{
"contradiction": "估值回归 vs 趋势惯性",
"manifestation": "PE跌至历史低位但均线仍空头排列",
"current_phase": "量变质变的临界积累期",
"action": "等MA20金叉质变信号再入场"
}
],
"position_status": positions,
"ma20_signals": {code: {k: v for k, v in s.items() if k != "error"}
for code, s in signals.items()},
"weekly_verdict": {
"macro": -1, # 宏观承压
"fundamental": 1, # 基本面稳健
"technical": -1, # 技术面空头
"message": 0, # 消息面中性
"total": -1, # 综合-1
"decision": "空仓等待,继续积累数据"
}
}
return contradiction
def print_report(c):
"""输出矛盾分析报告"""
verdict = c["weekly_verdict"]
print("=" * 50)
print(f"📅 {c['date']} 矛盾分析报告")
print("=" * 50)
print("\n【四维评分】")
print(f" 宏观面: {verdict['macro']}(系统性压力)")
print(f" 基本面: {verdict['fundamental']}(稳健)")
print(f" 技术面: {verdict['technical']}(空头排列)")
print(f" 消息面: {verdict['message']}(中性)")
print(f" 综合评分: {verdict['total']} → 决策:{verdict['decision']}")
print("\n【本周核心矛盾】")
for i, m in enumerate(c["market_contradictions"], 1):
print(f"\n 矛盾{i}{m['contradiction']}")
print(f" 表现:{m['manifestation']}")
print(f" 阶段:{m['current_phase']}")
print(f" 行动:{m['action']}")
print("\n【MA20信号监控】")
if c["ma20_signals"]:
for code, sig in c["ma20_signals"].items():
if "error" in sig:
print(f" {code}: 查询失败")
else:
name = sig.get("name", code)
signal = sig.get("signal", "unknown")
emoji = {"golden_cross": "🟢金叉", "dead_cross": "🔴死叉", "neutral": "⚪中性"}.get(signal, signal)
price = sig.get("price", 0)
ma20 = sig.get("ma20", 0)
print(f" {name}{code}{emoji} 现价:{price:.2f} MA20:{ma20:.2f}")
else:
print(" 无数据")
print("\n【持仓状态】")
for code, pos in c["position_status"].items():
print(f" {pos['name']}{code}{pos['status']}")
print("\n" + "=" * 50)
print("【马克思主义分析框架】")
print(f" 本质:实践是检验真理的唯一标准")
print(f" 当前实践模拟持仓等MA20金叉验证判断")
print(f" 矛盾积累:宏观-1+基本面+1等待技术面确认方向")
print(f" 量变质变MA20金叉=质变临界点")
print("=" * 50)
def main():
cmd = sys.argv[1] if len(sys.argv) > 1 else "report"
if cmd == "report":
c = analyze_week()
print_report(c)
# 保存到历史
history = load_history()
history["weeks"].append(c)
if len(history["weeks"]) > 52: # 保留一年
history["weeks"] = history["weeks"][-52:]
save_history(history)
elif cmd == "check":
# 快速检查 MA20 信号
for code in ["000858", "600519", "000568", "002304"]:
sig = get_ma20_signal(code)
if sig and "error" not in sig:
emoji = {"golden_cross": "🟢", "dead_cross": "🔴", "neutral": ""}.get(sig["signal"], "")
print(f"{emoji} {sig['name']} | 现价:{sig['price']:.2f} MA20:{sig['ma20']:.2f}")
elif sig:
print(f"{code}: {sig.get('error', 'unknown')}")
elif cmd == "record":
c = analyze_week()
history = load_history()
if c not in history["weeks"]:
history["weeks"].append(c)
save_history(history)
print(f"✅ 已记录 {c['week']} 的矛盾分析")
else:
print(f"⚠️ {c['week']} 已记录,跳过")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,223 @@
---
name: cangjie-distill
version: 1.2.0
date: 2026-07-17
description: |
把书籍/视频/播客/课程/长内容蒸馏成一组可执行 skills 的元 skill。
触发词:拆书/蒸馏/把XX做成skill/turn a book into skills/把视频/播客/课程蒸馏成skill
不是简单摘要,是方法论/框架/原则的原子化提取,让 agent 能在真实场景调用。
NOT for: 书摘/读后感/角色扮演(那是 nuwa-skill 的工作)
category: knowledge
tags: [knowledge-distillation, book-to-skill, ria-tv-plus, method distillation]
related_skills:
- hermes-self-improvement: "仓颉skill是主动学习体系的核心工具"
source: https://github.com/kangarooking/cangjie-skill
local_source: ~/.hermes/cangjie-skill/完整26文件
output_path: ~/.hermes/cangjie-skills/<主题名>/
---
# 仓颉知识提炼技能cangjie-skill
## 使命
把一本书/视频/播客/课程里沉淀的方法论,拆解成一组**原子化、可被 agent 在真实场景下调用**的 skills。
> **核心洞察**:现有读书方法论都是为人类读者蒸馏,不是为 agent 执行者蒸馏。给人看靠故事/金句/情感钩子;给 agent 用靠 trigger / 可执行步骤 / 判停标准。
**边界**
- ✅ 做:方法论 / 决策框架 / 清单 / 原则 / 概念体系的蒸馏
- ❌ 不做:书摘 / 读后感 / 作者人设角色扮演(请用 nuwa-skill
## 何时调用此 skill
用户说类似:
- "帮我拆《穷查理宝典》"
- "把毛选蒸馏成 skill"
- "把这个 B 站视频/播客/课程蒸馏成 skill"
- "distill this book into skills"
- "把 XX 的方法论做成可用的 skill"
## 两种提炼模式
### 模式一:轻量模式 — 四字结构(快速提炼)
适用于快速提炼一个概念/理论的核心,不做完整流水线:
```
主题 → 核心本质2字以内
→ 对立面是什么2字以内
→ 根本矛盾在哪4字以内
→ 转化机制是什么4字以内
```
**输出格式**
```
|【仓颉·主题】
◆ 本质XX
◆ 对立XX
◆ 矛盾XXXX
◆ 转化XXXX
◆ 一句话XXX15字以内
```
**示例**
```
|【仓颉·马克思主义哲学】
◆ 本质:实践
◆ 对立:唯心 / 唯物
◆ 矛盾:存在意识之争
◆ 转化:实践→认识→再实践
◆ 一句话:实事求是,在实践中检验真理
```
### 模式二:完整模式 — 8阶段 RIA-TV++(深度蒸馏)
把一本书/课程/长内容转化为完整技能体系:
```
Stage0 Adler分析 → 整体理解,判断是否值得蒸馏
Stage1 并行提取 → 5个提取器同时工作
Stage1.5 三重验证 → 提取结果交叉验证,过滤错误
Stage2 RIA++构造 → 转换为可执行技能格式
Stage3 Zettelkasten → 原子化笔记,建立引用关系
Stage4 压力测试 → 极端情况检验,补充边界 case
Stage5 交付 → 输出为 skill/overview/digest/index
```
## RIA-TV++ 六段详解
每个 skill 必须包含以下六段:
### R — Reading原文引用
- 直接引用 ≤150 字(英文原文 ≤100 词)
- 必须标注出处(章节/页码;视频填时间戳/分P播客填集数
- 若原书是英文,引用英文原文 + 你自己翻译的中文,**不要用现成译本**
### I — Interpretation自述
- 用**你自己的话**重写方法论的核心骨架515 行
- 检查:没读过原书的人能否理解这个方法论在做什么?若不能,重写
- 禁止:照搬原文句子 / 堆砌修辞
### A1 — Past Application书中案例
- 作者在书中**亲自**用这个方法论处理过的具体案例
- 至少 1 条≤3 条
- 每条要点明:遇到什么问题 → 怎么用方法论 → 得出什么结论 → 实际结果
### A2 — Future Trigger ★(最关键,决定是否被调用)
必须明确:
1. **用户在什么情境下遇到这类问题?**场景描述35 条)
2. **这些情境的语言信号是什么?**(用户会说什么样的话)
3. **和哪些相邻 skill 不同?**(避免互相抢调用)
> 好的 A2 示例:
> "用户在纠结一个决策、列举正面理由却理不出头绪时;或在问'怎么做X才能成功'时;不适用于纯信息查询类问题。"
>
> 坏的 A2 示例:
> "用户需要思考时。" ← 太宽泛,会误激活
### E — Execution可执行步骤
- 1-2-3 步骤,每步有**可判断的完成标准**
- 如果有判停点显式写出step 2 之后若 X 则跳到 step 5
### B — Boundary边界
- 什么时候**不要**使用这个 skill反场景
- 作者警告过的失败模式
- 与之相邻但容易混淆的其他方法论
## 三重验证(阶段 1.5
每个候选单元必须通过:
| 验证 | 问题 | 通过条件 |
|------|------|---------|
| V1 跨域 | 书中至少 2 个独立段落有佐证? | 是 |
| V2 预测力 | 能用它回答一个书里没明说的新问题吗? | 是 |
| V3 独特性 | 不是任何聪明人都会说的常识吗? | 否(若为常识则淘汰)|
通过的写入 `verified.md`,不通过的写入 `rejected/` 并附原因(保留审计轨迹)。
## 完整流水线输出结构
```
~/.hermes/cangjie-skills/<主题名>/
├── PIPELINE_STATE.md # 流水线状态(断点续跑用)
├── BOOK_OVERVIEW.md # Stage0 产出:主旨/骨架/术语/批判
├── verified.md # Stage1.5 产出:通过三重验证的单元
├── candidates/ # Stage1 产出:原始候选池(审计用)
├── rejected/ # Stage1.5 产出:淘汰的单元 + 原因
├── INDEX.md # Stage3 产出skill 总览 + 引用图
├── GLOSSARY.md # Stage3 产出:全书共享术语词典
├── DIGEST.md # Stage5 产出:面向读者的精华长文
└── <skill-slug>/
├── SKILL.md
├── test-prompts.json # Stage4 产出:压力测试 prompt
└── test-results.md # Stage4 产出:测试通过率 + 失败分析
```
## 质量红线(违反则阻止输出)
1. 每个 skill 必须通过**全部**三重验证
2. 每个 skill 必须有完整的 R / I / A1 / A2 / E / B 六段
3. 原文引用 ≤150 字/段(英文 ≤100 词/段)
4. 每个 skill 必须有 `test-prompts.json`,且包含**诱饵测试**(不应调用的场景),其中至少 1 条是同书兄弟 skill 的场景
5. `description` 字段必须明确 trigger 条件,不能只是"一个关于 X 的 skill"
## 执行规范
- **永远先试点 1 本** — 除非用户明确说"批量"
- **阶段之间主动汇报进度** — 不要静默跑完再 dump 结果
- **不凭记忆拆书** — 没文本就停下来问用户要
- **保留审计轨迹** — candidates/ 和 rejected/ 都要留
- **随时可续跑** — 每完成一个阶段就更新 PIPELINE_STATE.md
## 原版 GitHub 源码
```
https://github.com/kangarooking/cangjie-skill
本地路径:~/.hermes/cangjie-skill/
```
完整文件树:
```
cangjie-skill/
├── SKILL.md # 核心方法论文档
├── GITHUB_REPO.md # 仓库元数据
├── methodology/ # 8阶段流水线详解
│ ├── 00-overview.md # 方法论总览(必读)
│ ├── 01-stage0-adler.md
│ ├── 02-stage1-parallel-extract.md
│ ├── 03-stage1.5-triple-verify.md
│ ├── 04-stage2-ria-plus.md
│ ├── 05-stage3-zettelkasten.md
│ ├── 06-stage4-pressure-test.md
│ └── 07-stage5-deliver.md
├── extractors/ # 5个专项提取器
│ ├── framework-extractor.md
│ ├── principle-extractor.md
│ ├── case-extractor.md
│ ├── counter-example-extractor.md
│ └── glossary-extractor.md
├── templates/ # 输出模板
│ ├── skill-template.md
│ ├── overview-template.md
│ ├── digest-template.md
│ ├── index-template.md
│ └── test-prompts-template.md
├── scripts/
└── assets/
```
## 脚本工具
```bash
# 深度蒸馏(完整流水线)
python3 ~/.hermes/scripts/cangjie_distill.py distill <text_file> <title>
```
详细流程见:`references/cangjie-ria-tv-plus-pipeline.md`

View File

@ -0,0 +1,86 @@
# 仓颉 RIA-TV++ 完整流水线
> 来源:`~/.hermes/cangjie-skill/methodology/`8阶段流水线
> 用途:当需要把书籍/视频/课程深度蒸馏为技能时,按此流程执行
## 8 阶段总览
| Stage | 名称 | 产出 |
|-------|------|------|
| 0 | Adler 分析 | 判断是否值得蒸馏,决定提取深度 |
| 1 | 并行提取 | 5 个提取器同时工作framework/principle/case/counter-example/glossary |
| 1.5 | 三重验证 | 提取结果交叉验证,过滤幻觉和错误 |
| 2 | RIA++ 构造 | 转换为可执行技能格式Rule/Insight/Action |
| 3 | Zettelkasten | 原子化笔记,建立引用关系 |
| 4 | 压力测试 | 极端情况检验,补充边界 case |
| 5 | 交付 | 输出为 skill/overview/digest/index/test-prompts |
## 各阶段说明
### Stage0 — Adler 分析
- 整体阅读,理解作者核心论点
- 判断:**是否值得花时间蒸馏?** 优先级高/中/低
- 决定提取深度(全文/节选/摘要)
### Stage1 — 并行提取
5 个提取器同时运行:
```
framework-extractor → 提取核心框架/模型
principle-extractor → 提取原理/原则
case-extractor → 提取案例/故事
counter-example-extractor → 提取反例/边界
glossary-extractor → 提取术语表
```
### Stage1.5 — 三重验证
- **自我验证**:提取内容是否自洽?
- **交叉验证**5 个提取器之间是否矛盾?
- **外部验证**:与已知事实对比
### Stage2 — RIA++
- **RRule**:规则 — 在什么条件下怎么做
- **IInsight**:洞见 — 为什么这个规则有效
- **AAction**:行动 — 如何执行这个规则
### Stage3 — Zettelkasten
- 原子化:每个笔记只包含一个想法
- 引用链接:笔记之间相互引用
- 唯一性:避免重复相同内容
### Stage4 — 压力测试
- 测试极端情况
- 找出规则的边界和失效条件
- 补充反例
### Stage5 — 交付模板
| 模板 | 用途 |
|------|------|
| `skill-template.md` | 完整技能文档 |
| `overview-template.md` | 技能概览 |
| `digest-template.md` | 摘要/速读版 |
| `index-template.md` | 技能地图/索引 |
| `test-prompts-template.md` | 测试用例 |
## 本地脚本
```bash
# 完整流水线脚本
python3 ~/.hermes/scripts/cangjie_distill.py distill <text_file> <title>
```
脚本位置:`~/.hermes/scripts/cangjie_distill.py`233行RIA-TV++ 蒸馏引擎)
## 输出路径
```
~/.hermes/cangjie-skills/<主题名>/
├── skills/ # 产出的各个 skill
│ ├── skill_phase1_xxx.md
│ └── ...
├── methodology/ # 元方法论
├── INDEX.md # 技能地图
└── references/ # 原始材料和分析
```
**注意**:输出到 `~/.hermes/cangjie-skills/`,不是 `~/.hermes/skills/`(后者是正式技能库)