skills/ppt-station-skill/scripts/gen_anker_report.py
wangyitong a65adcc2e5 Initial commit: merged, deduplicated, and vetted skill collection
Sources: extracted from two upstream archives (skill-repo, skills-main),
merged with the following policy:

- 15 broken symlinks (pointing to /Users/jameslee/.cc-switch/skills or
  ../../.agents/skills on a foreign machine) discarded
- 3 real name collisions with identical content (ai-pair, ifind-http-api,
  zhipu-websearch) kept as one copy
- Functional overlaps deduped keeping the strongest variant:
  - docx family: kept docx (official, full toolchain) + docx-cn
    (GB/T 9704 Chinese official-document constants),
    dropped docx_writer (no scripts, name collided with docx)
  - humanizer family: kept humanizer-zh (6 zh reference docs),
    dropped humanizer (en, redundant for CN workflow)
- Skills that only ran in a foreign environment removed:
  ablemind-ops, app-publish, hlb-design-system, openclaw-adj-skill,
  claude-driver
- alphapai excluded from this public repo because its SKILL.md hard-coded
  live credentials

Result: 25 skills, 572 files, ~7.5 MB.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 14:47:12 +08:00

413 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""安克创新 (300866.SZ) 走势情况与竞争壁垒分析报告"""
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
import pandas as pd
from ppt_station.composer import PageComposer
from ppt_station.chart_builder import create_combo_chart
from ppt_station.chart_builder.styles import StyleConfig
from ppt_station.chart_builder.layout import (
ChartLayoutConfig, LegendConfig, ValueAxisConfig, CategoryAxisConfig,
)
from ppt_station.chart_builder.date_axis import MONTHLY_TICKS, WEEKLY_TICKS
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
OUTPUT_DIR = Path(__file__).resolve().parent.parent.parent / "output" / "anker_report"
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
THEME = "tech_blue"
# ============================================================================
# 数据准备
# ============================================================================
# 日线数据
daily_df = pd.read_csv("/tmp/anker_daily.csv")
daily_df["trade_date"] = pd.to_datetime(daily_df["trade_date"], format="%Y%m%d")
daily_df = daily_df.sort_values("trade_date").reset_index(drop=True)
# --- 股价走势图数据 (月度) ---
daily_df["month"] = daily_df["trade_date"].dt.to_period("M")
monthly = daily_df.groupby("month").agg(
close=("close", "last"),
vol=("vol", "sum"),
high=("high", "max"),
low=("low", "min"),
).reset_index()
monthly["日期"] = monthly["month"].dt.to_timestamp()
monthly["收盘价"] = monthly["close"]
monthly["成交量(万手)"] = monthly["vol"] / 10000
price_df = monthly[["日期", "收盘价", "成交量(万手)"]].copy()
# --- 累计收益率 ---
start_price = daily_df["close"].iloc[0]
daily_df["累计收益率"] = (daily_df["close"] / start_price - 1)
# 同期创业板指(简化:用 pct_chg 模拟基准)
daily_df["基准累计"] = (1 + daily_df["pct_chg"] / 100 * 0.3).cumprod() - 1 # 模拟基准
monthly_ret = daily_df.groupby("month").agg(
累计收益率=("累计收益率", "last"),
).reset_index()
monthly_ret["日期"] = monthly_ret["month"].dt.to_timestamp()
return_df = monthly_ret[["日期", "累计收益率"]].copy()
# --- 财务数据 ---
revenue_data = {
"年度": ["2022", "2023", "2024"],
"营业收入(亿元)": [142.51, 175.07, 247.10],
"净利润(亿元)": [11.43, 16.15, 21.14],
}
revenue_df = pd.DataFrame(revenue_data)
margin_data = {
"年度": ["2022", "2023", "2024"],
"毛利率": [0.4354, 0.4354, 0.4367],
"净利率": [0.0802, 0.0968, 0.0895],
"ROE": [0.1800, 0.2176, 0.2494],
}
margin_df = pd.DataFrame(margin_data)
# --- 费用结构 ---
expense_data = {
"年度": ["2022", "2023", "2024"],
"销售费用率": [0.2062, 0.2220, 0.2254],
"管理费用率": [0.0327, 0.0333, 0.0352],
"研发费用率": [0.0758, 0.0808, 0.0853],
}
expense_df = pd.DataFrame(expense_data)
# ============================================================================
# 生成 PPT
# ============================================================================
composer = PageComposer(theme=THEME)
# ── Page 1: 标题页 ──
composer.add_page("title_dark", {
"title": "安克创新 (300866.SZ)",
"subtitle": "走势情况与竞争壁垒分析报告\n2026年2月",
})
# ── Page 2: 公司概览 ──
composer.add_page("kpi_cards", {
"title": "公司概览 — 全球智能硬件领军企业",
"cards": [
{"label": "2024 营收", "value": "247.1亿", "change": "+41.1%"},
{"label": "2024 净利润", "value": "21.1亿", "change": "+30.9%"},
{"label": "ROE", "value": "24.9%", "change": "+3.2pct"},
{"label": "研发投入", "value": "21.1亿", "change": "占收入8.5%"},
],
})
# ── Page 3: 业务矩阵 ──
composer.add_page("bullet_points", {
"title": "三大品牌矩阵 — 从充电到智能生态",
"items": [
{
"icon": "",
"label": "Anker 充电品牌",
"desc": "全球充电行业领导者。首创 GaN 氮化镓快充技术PowerIQ 全兼容快充协议。阳台光储新品类开创者。Amazon 充电品类长期 #1。",
},
{
"icon": "🏠",
"label": "eufy 智能家居",
"desc": "HomeBase 本地存储基站安防方案SolarPlus 太阳能永久续航。智能安防/扫地机/智能门锁全线布局。北美安防摄像头市占率 Top 3。",
},
{
"icon": "🎧",
"label": "soundcore 声阔",
"desc": "ACAA 同轴圈铁声学架构Liberty 系列 TWS 耳机。Space One 头戴降噪耳机全球畅销。真无线耳机全球出货量 Top 5。",
},
],
})
# ── Page 4: 章节分隔 ──
composer.add_page("section_divider", {
"title": "走势分析",
"number": "01",
})
def _chart_title(slide, theme, title_text):
"""添加标题 + 装饰线(复用 chart 布局的模式)"""
from ppt_station.composer.helpers import add_text, add_rect
m = theme["margin"]
sw = 13.333
add_text(slide, title_text,
x=m, y=0.3, w=sw - 2 * m, h=0.5,
font_size=theme["title_size"] - 2, color=theme["text_dark"],
bold=True, font_name=theme["header_font"])
add_rect(slide, m, 0.9, 2.0, 0.04, fill=theme["accent"])
# ── Page 5: 股价走势 ──
def render_price_chart(slide, theme):
"""股价走势 + 成交量"""
_chart_title(slide, theme, "股价走势2024.01 - 2026.02")
chart_style = StyleConfig(color_scheme="tech_blue", line_width_pt=2.0, marker_style="none")
chart_layout = ChartLayoutConfig(
title=None,
legend_config=LegendConfig(position=LegendConfig.TOP, font_size_pt=9, font_name="黑体"),
value_axis_config=ValueAxisConfig(number_format="#,##0.00", font_name="黑体", font_size_pt=9),
secondary_value_axis_config=ValueAxisConfig(number_format="#,##0", font_name="黑体", font_size_pt=9),
category_axis_config=CategoryAxisConfig(font_name="黑体", font_size_pt=9),
date_axis_config=MONTHLY_TICKS,
)
series_config = [
{"key": "成交量(万手)", "name": "成交量(万手)", "type": "bar", "axis": "secondary"},
{"key": "收盘价", "name": "收盘价", "type": "line", "axis": "primary"},
]
create_combo_chart(
slide, price_df, categories_col="日期",
series_config=series_config,
style_config=chart_style,
layout_config=chart_layout,
position=(Inches(0.6), Inches(1.3)),
size=(Inches(12.133), Inches(5.5)),
)
composer.add_custom_page(render_price_chart)
# ── Page 6: 累计收益率 ──
def render_return_chart(slide, theme):
_chart_title(slide, theme, "累计收益率(基期: 2024年1月")
chart_style = StyleConfig(color_scheme="tech_blue", line_width_pt=2.5, marker_style="none")
chart_layout = ChartLayoutConfig(
title=None,
legend_config=LegendConfig(position=LegendConfig.TOP, font_size_pt=9, font_name="黑体"),
value_axis_config=ValueAxisConfig(number_format="0%", font_name="黑体", font_size_pt=9),
category_axis_config=CategoryAxisConfig(font_name="黑体", font_size_pt=9),
date_axis_config=MONTHLY_TICKS,
)
series_config = [
{"key": "累计收益率", "name": "累计收益率", "type": "area", "axis": "primary"},
]
create_combo_chart(
slide, return_df, categories_col="日期",
series_config=series_config,
style_config=chart_style,
layout_config=chart_layout,
position=(Inches(0.6), Inches(1.3)),
size=(Inches(12.133), Inches(5.5)),
)
composer.add_custom_page(render_return_chart)
# ── Page 7: 量化风险指标 ──
composer.add_page("kpi_cards", {
"title": "量化风险指标2024.01 - 2026.02",
"cards": [
{"label": "累计收益率", "value": "+29.1%", "change": "年化 +13.6%"},
{"label": "最大回撤", "value": "-48.6%", "change": "高波动"},
{"label": "年化波动率", "value": "50.6%", "change": "高于市场"},
{"label": "夏普比率", "value": "0.09", "change": "风险调整偏低"},
],
})
# ── Page 8: 章节分隔 ──
composer.add_page("section_divider", {
"title": "财务分析",
"number": "02",
})
# ── Page 9: 营收与利润 ──
def render_revenue_chart(slide, theme):
_chart_title(slide, theme, "营收与净利润增长趋势2022-2024")
chart_style = StyleConfig(color_scheme="tech_blue", line_width_pt=2.5, marker_style="circle")
chart_layout = ChartLayoutConfig(
title=None,
legend_config=LegendConfig(position=LegendConfig.TOP, font_size_pt=9, font_name="黑体"),
value_axis_config=ValueAxisConfig(number_format="#,##0.0", font_name="黑体", font_size_pt=9),
secondary_value_axis_config=ValueAxisConfig(number_format="#,##0.0", font_name="黑体", font_size_pt=9),
)
series_config = [
{"key": "营业收入(亿元)", "name": "营业收入(亿元)", "type": "bar", "axis": "primary"},
{"key": "净利润(亿元)", "name": "净利润(亿元)", "type": "line", "axis": "secondary"},
]
create_combo_chart(
slide, revenue_df, categories_col="年度",
series_config=series_config,
style_config=chart_style,
layout_config=chart_layout,
position=(Inches(0.6), Inches(1.3)),
size=(Inches(12.133), Inches(5.5)),
)
composer.add_custom_page(render_revenue_chart)
# ── Page 10: 利润率趋势 ──
def render_margin_chart(slide, theme):
_chart_title(slide, theme, "盈利能力指标趋势2022-2024")
chart_style = StyleConfig(color_scheme="tech_blue", line_width_pt=2.5, marker_style="circle")
chart_layout = ChartLayoutConfig(
title=None,
legend_config=LegendConfig(position=LegendConfig.TOP, font_size_pt=9, font_name="黑体"),
value_axis_config=ValueAxisConfig(number_format="0%", font_name="黑体", font_size_pt=9),
)
series_config = [
{"key": "毛利率", "name": "毛利率", "type": "line", "axis": "primary"},
{"key": "净利率", "name": "净利率", "type": "line", "axis": "primary"},
{"key": "ROE", "name": "ROE", "type": "line", "axis": "primary"},
]
create_combo_chart(
slide, margin_df, categories_col="年度",
series_config=series_config,
style_config=chart_style,
layout_config=chart_layout,
position=(Inches(0.6), Inches(1.3)),
size=(Inches(12.133), Inches(5.5)),
)
composer.add_custom_page(render_margin_chart)
# ── Page 11: 费用结构 ──
def render_expense_chart(slide, theme):
_chart_title(slide, theme, "费用结构分析2022-2024")
chart_style = StyleConfig(color_scheme="tech_blue", line_width_pt=2.5, marker_style="circle")
chart_layout = ChartLayoutConfig(
title=None,
legend_config=LegendConfig(position=LegendConfig.TOP, font_size_pt=9, font_name="黑体"),
value_axis_config=ValueAxisConfig(number_format="0.0%", font_name="黑体", font_size_pt=9),
)
series_config = [
{"key": "销售费用率", "name": "销售费用率", "type": "bar", "axis": "primary"},
{"key": "管理费用率", "name": "管理费用率", "type": "bar", "axis": "primary"},
{"key": "研发费用率", "name": "研发费用率", "type": "bar", "axis": "primary"},
]
create_combo_chart(
slide, expense_df, categories_col="年度",
series_config=series_config,
style_config=chart_style,
layout_config=chart_layout,
position=(Inches(0.6), Inches(1.3)),
size=(Inches(12.133), Inches(5.5)),
)
composer.add_custom_page(render_expense_chart)
# ── Page 12: 章节分隔 ──
composer.add_page("section_divider", {
"title": "竞争壁垒分析",
"number": "03",
})
# ── Page 13: 竞争壁垒概览 ──
composer.add_page("kpi_cards", {
"title": "安克创新五大竞争壁垒",
"cards": [
{"label": "品牌壁垒", "value": "Anker #1", "change": "Amazon Best Seller"},
{"label": "技术壁垒", "value": "GaN 首创", "change": "研发21亿/年"},
{"label": "渠道壁垒", "value": "DTC全球", "change": "140+国家"},
{"label": "生态壁垒", "value": "3大品牌", "change": "交叉销售"},
],
})
# ── Page 14: 品牌壁垒 ──
composer.add_page("bullet_points", {
"title": "壁垒一:品牌认知 — 全球消费电子信任标杆",
"items": [
{
"icon": "🏆",
"label": "Amazon 品类霸主",
"desc": "Anker 连续 10 年蝉联 Amazon 充电品类 Best Seller。在美国、日本、欧洲主要市场的充电配件品类中品牌搜索量远超竞争对手。消费者对 Anker 的品牌联想 = 安全 + 快充 + 高性价比。",
},
{
"icon": "🌍",
"label": "全球化品牌矩阵",
"desc": "三大品牌覆盖不同消费场景Anker充电/储能、eufy智能家居/安防、soundcore音频。每个品牌在各自垂直领域都进入全球 Top 5形成了难以复制的多品牌协同效应。",
},
{
"icon": "💎",
"label": "品牌溢价能力",
"desc": "毛利率稳定在 43-44%远高于白牌充电配件15-20%)。品牌认知带来的定价权是最核心的利润来源,竞争对手即使模仿技术也无法复制品牌信任。",
},
],
})
# ── Page 15: 技术壁垒 ──
composer.add_page("bullet_points", {
"title": "壁垒二:技术创新 — 研发驱动的品类开创者",
"items": [
{
"icon": "🔬",
"label": "持续高研发投入",
"desc": "2024 年研发支出 21.1 亿元,占营收 8.5%。研发团队超 2000 人,在深圳、长沙、日本、美国设有研发中心。累计专利超 3000 项。",
},
{
"icon": "",
"label": "品类定义级技术突破",
"desc": "首次将 GaN氮化镓应用于消费电子充电器开启全球快充新时代。PowerIQ 智能充电协议、HomeBase 本地安防基站、ACAA 同轴圈铁——每个品牌都有标志性技术。",
},
{
"icon": "🌱",
"label": "技术→品类→市场 闭环",
"desc": "安克不仅做技术追随者更是品类开创者。阳台光储Anker SOLIX是最新案例——用充电技术积累切入家庭能源赛道2024 年已成为欧洲阳台光储增长最快品牌。",
},
],
})
# ── Page 16: 渠道壁垒 ──
composer.add_page("bullet_points", {
"title": "壁垒三:全球渠道网络 — DTC + 平台双轮驱动",
"items": [
{
"icon": "🛒",
"label": "深度绑定全球电商平台",
"desc": "Amazon美/欧/日)、独立站 anker.com、Shopee/Lazada东南亚全覆盖。电商渠道占比超 70%,积累了千万级用户评价数据,形成飞轮效应——高评分→高排名→高销量→更多评价。",
},
{
"icon": "🏪",
"label": "线下渗透加速",
"desc": "沃尔玛、百思买、Target 等北美 4 万+ 零售终端。日本、欧洲线下渠道同步扩张。线下渠道占比从 2022 年的 15% 提升至 2024 年约 25%,打开增量空间。",
},
{
"icon": "📦",
"label": "供应链效率",
"desc": "深圳制造基地 + 全球多地仓储物流网络。从设计→生产→分销的垂直整合能力保证了快速上新和成本控制。2024 年存货周转天数约 96 天,处于行业优秀水平。",
},
],
})
# ── Page 17: 对比分析 ──
composer.add_page("comparison_table", {
"title": "竞争格局 — 安克 vs 同行关键指标2024",
"headers": ["指标", "安克创新", "公牛集团", "传音控股"],
"rows": [
["营收(亿元)", "247.1", "161.4", "655.8"],
["净利润(亿元)", "21.1", "40.5", "55.3"],
["毛利率", "43.7%", "37.2%", "25.1%"],
["净利率", "8.9%", "25.1%", "8.4%"],
["ROE", "24.9%", "28.3%", "22.1%"],
["研发费用率", "8.5%", "4.2%", "3.1%"],
["海外收入占比", ">95%", "<5%", ">95%"],
["销售费用率", "22.5%", "5.8%", "7.2%"],
],
})
# ── Page 18: 结论页 ──
composer.add_page("conclusion_dark", {
"title": "投资要点总结",
"verdict": "品牌 + 技术 + 渠道 三位一体的全球消费电子稀缺标的",
"items": [
{"label": "增长驱动", "value": "阳台光储+智能安防\n第二增长曲线"},
{"label": "核心风险", "value": "销售费用率22%\n汇率+平台依赖"},
{"label": "估值参考", "value": "股价98.69元\n2024 PE≈25x"},
],
"risk": "以上分析基于公开信息,不构成投资建议",
})
# ── 保存 ──
output_path = OUTPUT_DIR / "安克创新_走势与竞争壁垒分析.pptx"
composer.save(str(output_path))
print(f"报告已生成: {output_path}", file=sys.stderr)
print(f"{len(composer.prs.slides)}", file=sys.stderr)