From 43736b211146be924f7bca716ee1169fc5e76547 Mon Sep 17 00:00:00 2001 From: xucheng Date: Sat, 3 Jan 2026 00:18:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAMarkdown=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E6=94=AF=E6=8C=81=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8A=A5?= =?UTF-8?q?=E5=91=8AHTML=E6=A0=B7=E5=BC=8F=EF=BC=8C=E5=B9=B6=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=8A=A5=E5=91=8A=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A0=87=E9=A2=98=E7=94=9F=E6=88=90=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Prompt/公司简介.md | 30 +++--- ...麟控股株式会社_20260102_基本面分析报告.html | 88 +++++++++--------- __pycache__/stock_analysis.cpython-313.pyc | Bin 0 -> 25072 bytes stock_analysis.py | 29 ++++-- 4 files changed, 87 insertions(+), 60 deletions(-) create mode 100644 __pycache__/stock_analysis.cpython-313.pyc diff --git a/Prompt/公司简介.md b/Prompt/公司简介.md index 5f99206..b5a186d 100644 --- a/Prompt/公司简介.md +++ b/Prompt/公司简介.md @@ -1,30 +1,38 @@ -您是一位专业的证券市场分析师。请为公司 {company_name} (股票代码: {ts_code}) 生成一份详细且专业的公司介绍。**请务必使用搜索工具查找并参考该公司最新的【定期报告】(如年报、半年报、季报)来获取业务结构和财务数据。不要仅依赖训练数据。**开头不要自我介绍,直接开始正文。正文用MarkDown输出,尽量说明信息来源,用斜体显示信息来源。在生成内容时,请严格遵循以下要求并采用清晰、结构化的格式: +您是一位专业的证券市场分析师。请为公司 {company_name} (股票代码: {ts_code}) 生成一份详细且专业的公司介绍。 -1. **公司概览**: +**核心要求**: +1. **标题格式**:请严格使用一级标题 `# {company_name} 公司简介` 作为报告的第一行。**严禁**在标题中包含"深度分析"、"详细报告"、"研报"等修饰词。 +2. **资料来源**:**请务必使用搜索工具查找并参考该公司最新的【定期报告】(如年报、半年报、季报)来获取业务结构和财务数据。不要仅依赖训练数据。** +3. **输出规范**:开头不要自我介绍,直接开始正文。正文用MarkDown输出,尽量说明信息来源,用斜体显示信息来源。 + +在生成内容时,请严格遵循以下要求并采用清晰、结构化的格式: + +## 一、 公司概览 * 简要介绍公司的性质、核心业务领域及其在行业中的定位。 * 提炼并阐述公司的核心价值理念。 -2. **主营业务**: +## 二、 主营业务 * 详细描述公司主要的**产品或服务**。 * **重要提示**:如果能获取到公司最新的官方**年报**或**财务报告**,请从中提取各主要产品/服务线的**收入金额**和其占公司总收入的**百分比**。请**明确标注数据来源**(例如:"数据来源于XX年年度报告")。 * **严格禁止**编造或估算任何财务数据。若无法找到公开、准确的财务数据,请**不要**在这一点中提及具体金额或比例,仅描述业务内容。 -3. **发展历程**: +## 三、 发展历程 * 以时间线或关键事件的形式,概述公司自成立以来的主要**里程碑事件**、重大发展阶段、战略转型或重要成就。 -4. **核心团队**: +## 四、 核心团队 * 介绍公司**主要管理层和核心技术团队成员**。 - * 对于每位核心成员,提供其**职务、主要工作履历、教育背景**。 + * 对于每位核心成员,提供其**职务、主要工作履历、教育背景**以及**担任该职位的起始时间**。 * 如果公开可查,可补充其**出生年份**。 -5. **供应链**: - * 描述公司的**主要原材料、部件或服务来源**。 - * 如果公开信息中包含,请列出**主要供应商名称**,并**明确其在总采购金额中的大致占比**。若无此数据,则仅描述采购模式。 +## 五、 供应链 + * 描述公司的**主要原材料、部件或服务来源**以及各种原材料、部件或服务在总采购金额中的占比。 + * 如果公开信息中包含,请列出**主要供应商名称**,并**明确其在总采购金额中的大致占比**。 + * 描述采购模式。 -6. **主要客户及销售模式**: +## 六、 主要客户及销售模式 * 阐明公司的**销售模式**(例如:直销、经销、线上销售、代理等)。 * 列出公司的**主要客户群体**或**代表性大客户**。 * 如果公开信息中包含,请标明**主要客户(或前五大客户)的销售额占公司总销售额的比例**。若无此数据,则仅描述客户类型。 -7. **未来展望**: +## 七、 未来展望 * 基于公司**公开的官方声明、管理层访谈或战略规划**,总结公司未来的发展方向、战略目标、重点项目或市场预期。请确保此部分内容有可靠的信息来源支持。 \ No newline at end of file diff --git a/Reports-HTML/2503_JP_麒麟控股株式会社_20260102_基本面分析报告.html b/Reports-HTML/2503_JP_麒麟控股株式会社_20260102_基本面分析报告.html index e505385..118d20e 100644 --- a/Reports-HTML/2503_JP_麒麟控股株式会社_20260102_基本面分析报告.html +++ b/Reports-HTML/2503_JP_麒麟控股株式会社_20260102_基本面分析报告.html @@ -8,16 +8,20 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; - max-width: 1200px; - margin: 0 auto; + margin: 0; padding: 20px; background-color: #f5f5f5; + display: flex; + justify-content: center; + min-height: 100vh; } .container { background-color: white; - padding: 30px; + padding: 40px; border-radius: 8px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + max-width: 1200px; + width: 100%; } h1 { color: #2c3e50; @@ -575,7 +579,7 @@

公司简介 (Company Profile)

麒麟控股株式会社 (Kirin Holdings Company, Limited) 公司深度分析报告

-

股票代码: 2503 (东京证券交易所) +

股票代码: 2503 (东京证券交易所)
分析师日期: 2026年1月2日


1. 公司概览

@@ -592,7 +596,7 @@

2. 主营业务与财务结构

麒麟控股的业务结构高度多元化,已不再是单纯的饮料公司。根据公司发布的最新定期报告(参考来源:麒麟控股 2024财年合并决算短信/综合报告),其业务主要分为以下四大板块。

-

2024财年(FY2024)合并收入概况: +

2024财年(FY2024)合并收入概况:
公司总收入约为 23,383亿日元 (约2.34万亿日元)。

@@ -832,12 +836,12 @@
  • 功能性食品标识:随着“红曲米事件”(非麒麟事件,但影响全行业)的发生,日本消费者厅对功能性标示食品(Foods with Function Claims)的监管趋严。麒麟的iMUSE(免疫)系列作为该领域的领头羊,面临更高的合规成本和舆论审视风险,但如果能顺利通过严监管,也将进一步清洗缺乏技术实力的中小竞争对手。

  • -

    投资总结: +

    投资总结
    麒麟控股不再是一家单纯的啤酒公司,而是一个拥有生物科技内核的健康消费品集团。虽然2024年因激进并购导致财务数据(净利润、ROE、负债率)暂时恶化,但这属于战略转型的“阵痛”。投资者应重点关注其健康科学业务的整合效率以及2026年酒税改革带来的啤酒业务反弹机会。目前的低估值(因利润下滑导致的表观高PE除外)可能并未完全反映其转型后的长期价值。

    内部人与机构动向 (Insider Analysis)

    麒麟控股株式会社 (2503) 内部人与机构动向深度分析报告

    -

    日期:2026年1月2日 -分析师:顶级数据分析师(Smart Money Tracker) +

    日期:2026年1月2日
    +分析师:顶级数据分析师(Smart Money Tracker)
    分析标的:麒麟控股株式会社 (Kirin Holdings Co., Ltd. - 2503.T)


    摘要 (Executive Summary)

    @@ -910,37 +914,37 @@
  • 筹码沉淀:浮筹正在从散户(受恐慌情绪影响)向长线机构(看重2027年愿景)手中转移。
  • 催化剂预期:随着FANCL及Blackmores的整合在2026年逐步完成,净利润率有望从2024年的低点(2.49%)回升。一旦利润释放,当前在低位吸筹的机构将推动股价展开“戴维斯双击”(估值与业绩双升)。
  • -

    投资启示: +

    投资启示
    目前正处于机构建仓的尾声阶段。对于跟随“聪明钱”的投资者而言,关注重点应从“过去的利润下滑”转向“未来的现金流改善(DOE政策支撑)”。当前是跟随机构在低位布局的良机。

    看涨分析 (Bullish Analysis)

    麒麟控股 (2503) 看涨论述:啤酒巨头的生物科技蜕变 (From Brewer to Bio-Pioneer)

    一、 深度挖掘:被啤酒泡沫掩盖的生物科技“金矿”

    市场目前对麒麟控股的定价仍停留在“增长缓慢的传统饮料巨头”层面,主要是受到2024年净利润大幅下滑(-52.45%)的表象干扰。然而,深度解构其资产负债表和战略布局,我们发现这是一次经典的“破茧成蝶”前的蓄力。 麒麟正在通过激进的资本配置,将自己重塑为一家高壁垒的生物科技与健康科学集团。

    1.1 资产负债表之外的王牌:LC-Plasma (乳酸菌) 平台技术

    -

    麒麟拥有的不仅是饮料品牌,而是世界级的微生物发酵与免疫学IP。 -* 核心资产LC-Plasma(等离子乳酸菌) 是全球首个获证能激活pDC(浆细胞样树突状细胞)的乳酸菌。这不仅仅是一款酸奶或饮料的原料,而是一个高毛利的B2B平台技术。 -* 价值量化:2024年该系列产品销售额已突破230亿日元(+10% YoY),且开始向外部伙伴(如可口可乐日本、森永制菓等)进行原料授权。 -* 重估逻辑:市场将其视为食品添加剂,但其本质是免疫领域的“英特尔Inside”。随着2025年该技术通过Blackmores渠道进入东南亚和澳洲市场,其高利润率的特许权使用费(Licensing)模式将爆发,该部分无形资产价值远未在股价中体现。 +

    麒麟拥有的不仅是饮料品牌,而是世界级的微生物发酵与免疫学IP。
    +* 核心资产LC-Plasma(等离子乳酸菌) 是全球首个获证能激活pDC(浆细胞样树突状细胞)的乳酸菌。这不仅仅是一款酸奶或饮料的原料,而是一个高毛利的B2B平台技术
    +* 价值量化:2024年该系列产品销售额已突破230亿日元(+10% YoY),且开始向外部伙伴(如可口可乐日本、森永制菓等)进行原料授权。
    +* 重估逻辑:市场将其视为食品添加剂,但其本质是免疫领域的“英特尔Inside”。随着2025年该技术通过Blackmores渠道进入东南亚和澳洲市场,其高利润率的特许权使用费(Licensing)模式将爆发,该部分无形资产价值远未在股价中体现。
    * 来源:公司2024年LC-Plasma销售快报及2025年展望

    1.2 低估的“健康科学三驾马车”:并购后的价值释放

    -

    2024年商誉激增至5385亿日元(占总资产34.61%),这并非坏账,而是麒麟完成拼图的关键一步。 -* Fancl (100%收购) + Blackmores (澳洲巨头):2024年的利润下滑主要是由于收购Fancl及整合Blackmores产生的一次性成本。 -* 隐形价值:市场低估了这三者的协同效应。 - * 渠道互通:利用Blackmores在澳洲和东南亚的药房监管准入能力,将麒麟的LC-Plasma产品快速推向海外(计划2025年进军台湾,2026年拓展更多区域)。 - * 数据变现:Fancl拥有日本最顶尖的D2C(直面消费者)用户健康数据,结合麒麟的研发能力,将极大提升新品成功率。 +

    2024年商誉激增至5385亿日元(占总资产34.61%),这并非坏账,而是麒麟完成拼图的关键一步。
    +* Fancl (100%收购) + Blackmores (澳洲巨头):2024年的利润下滑主要是由于收购Fancl及整合Blackmores产生的一次性成本。
    +* 隐形价值:市场低估了这三者的协同效应。
    + * 渠道互通:利用Blackmores在澳洲和东南亚的药房监管准入能力,将麒麟的LC-Plasma产品快速推向海外(计划2025年进军台湾,2026年拓展更多区域)。
    + * 数据变现:Fancl拥有日本最顶尖的D2C(直面消费者)用户健康数据,结合麒麟的研发能力,将极大提升新品成功率。
    * 来源:2024年投资者交流日(Investor Day)纪要

    1.3 药企内核:协和麒麟 (Kyowa Kirin) 的剥离/重估潜力

    -

    麒麟控股旗下的协和麒麟是全球领先的特种制药公司,专注于罕见病和肾病。 -* 被掩盖的高成长:协和麒麟拥有重磅药物Crysvita(低磷酸酯酶症治疗)和Poteligeo。这些全球性创新药的利润率远高于啤酒业务,但被集团整体的低估值所掩盖。 -* 管线爆发期:下一代重磅药物KHK4083(用于治疗特应性皮炎)预计将于2026年申请批准,这不仅是收入催化剂,更是估值体系从“食品股”向“医药股”切换的关键。 +

    麒麟控股旗下的协和麒麟是全球领先的特种制药公司,专注于罕见病和肾病。
    +* 被掩盖的高成长:协和麒麟拥有重磅药物Crysvita(低磷酸酯酶症治疗)和Poteligeo。这些全球性创新药的利润率远高于啤酒业务,但被集团整体的低估值所掩盖。
    +* 管线爆发期:下一代重磅药物KHK4083(用于治疗特应性皮炎)预计将于2026年申请批准,这不仅是收入催化剂,更是估值体系从“食品股”向“医药股”切换的关键。
    * 来源:协和麒麟中期经营计划

    二、 护城河的加深:从“品牌壁垒”向“技术壁垒”跃迁

    2.1 护城河动态演变:发酵技术的降维打击

    -

    麒麟的护城河正在经历本质的升维。传统啤酒企业的护城河是“分销网络”,而麒麟利用百年的酵母发酵技术,构建了难以复制的生物制造能力。 -* 技术代差:麒麟是全球极少数能同时横跨“食品(酿造)- 健康(功能性成分)- 医药(抗体筛选)”的企业。竞争对手可以模仿口味,但无法模仿其利用发酵技术大规模低成本生产高活性生物制剂的工艺。 +

    麒麟的护城河正在经历本质的升维。传统啤酒企业的护城河是“分销网络”,而麒麟利用百年的酵母发酵技术,构建了难以复制的生物制造能力。
    +* 技术代差:麒麟是全球极少数能同时横跨“食品(酿造)- 健康(功能性成分)- 医药(抗体筛选)”的企业。竞争对手可以模仿口味,但无法模仿其利用发酵技术大规模低成本生产高活性生物制剂的工艺。
    * 研发投入:2024年研发费用率提升至4.96%(远超传统食品行业平均的1-2%),证明公司正由营销驱动转向技术驱动。

    2.2 封闭的生态闭环:高昂的转换成本

    -

    通过收购Fancl和Blackmores,麒麟构建了一个“诊断 -> 干预 -> 维持”的健康闭环。 +

    通过收购Fancl和Blackmores,麒麟构建了一个“诊断 -> 干预 -> 维持”的健康闭环。
    * 正反馈循环:消费者通过Fancl的健康测试发现问题 -> 购买麒麟/Blackmores的功能性补充剂 -> 长期订阅。这种生态系统极大提高了用户的转换成本,使得麒麟从单一产品的售卖者变成了健康解决方案的提供者。

    三、 长期景气度:拥抱“银发经济”的黄金十年

    3.1 长期需求:老龄化与免疫焦虑的结构性红利

    @@ -969,20 +973,20 @@

    一、 护城河的侵蚀:从“现金牛”到“资本黑洞”

    1.1 核心啤酒业务的结构性衰退

    -

    虽然麒麟在啤酒行业拥有百年品牌,但其核心护城河正在干涸。 -* 人口红利的消失:日本国内市场的萎缩是不可逆的结构性打击。根据Kirin Brewery Strategy 2025数据,整体啤酒市场规模持续下滑,公司仅靠“提价”维持名义增长,而非销量增长。 +

    虽然麒麟在啤酒行业拥有百年品牌,但其核心护城河正在干涸。
    +* 人口红利的消失:日本国内市场的萎缩是不可逆的结构性打击。根据Kirin Brewery Strategy 2025数据,整体啤酒市场规模持续下滑,公司仅靠“提价”维持名义增长,而非销量增长。
    * 被动的防御战:公司被迫将提价作为主要策略,但这在通胀环境下极易导致客户流失。随着日本酒类税收制度改革(2026年全面生效),原本具有税收优势的“第三类啤酒”将失去价格竞争力,这将直接冲击麒麟在低端市场的防御壁垒。

    1.2 医药护城河的“专利悬崖”

    -

    麒麟的医药子公司 协和麒麟 (Kyowa Kirin) 曾是主要的利润贡献者,但护城河正面临决堤。 -* 核心药物专利到期:主力药物 CrysvitaPoteligeo 正面临专利保护期结束的风险(Patent Cliff)。一旦仿制药进入市场,高毛利将瞬间崩塌。 +

    麒麟的医药子公司 协和麒麟 (Kyowa Kirin) 曾是主要的利润贡献者,但护城河正面临决堤。
    +* 核心药物专利到期:主力药物 CrysvitaPoteligeo 正面临专利保护期结束的风险(Patent Cliff)。一旦仿制药进入市场,高毛利将瞬间崩塌。
    * 政策性降价:日本每年一度的NHI(国民健康保险)药价下调是悬在头顶的达摩克利斯之剑,持续削弱医药板块的利润率。

    二、 隐藏的负债与风险:商誉泡沫与“赢家的诅咒”

    2.1 资产负债表中的最大“地雷”:商誉 (Goodwill)

    -

    这是本报告最核心的风险警示。 -* 商誉爆炸式增长:根据财报,公司商誉从2022年的2566亿日元激增至2024年的5385亿日元,占总资产比例高达34.61%。这意味着公司超过三分之一的资产是“空气”(溢价收购产生的无形价值)。 -* 并购后的整合噩梦:商誉激增主要源于对 Blackmores (澳佳宝)Fancl 的高溢价收购。历史上,跨国消费品并购失败率极高。 - * Fancl收购风险:2024年财报中已出现“因Fancl合并产生的阶段性收购损失”。 - * Kyowa Hakko Bio困境:健康科学板块的另一核心Kyowa Hakko Bio不仅未贡献利润,反而因“库存减值”和“结构性改革”造成巨额亏损。 +

    这是本报告最核心的风险警示。
    +* 商誉爆炸式增长:根据财报,公司商誉从2022年的2566亿日元激增至2024年的5385亿日元,占总资产比例高达34.61%。这意味着公司超过三分之一的资产是“空气”(溢价收购产生的无形价值)。
    +* 并购后的整合噩梦:商誉激增主要源于对 Blackmores (澳佳宝)Fancl 的高溢价收购。历史上,跨国消费品并购失败率极高。
    + * Fancl收购风险:2024年财报中已出现“因Fancl合并产生的阶段性收购损失”。
    + * Kyowa Hakko Bio困境:健康科学板块的另一核心Kyowa Hakko Bio不仅未贡献利润,反而因“库存减值”和“结构性改革”造成巨额亏损。
    * 减值风险:一旦Blackmores或Fancl的业绩不及预期(如中国市场需求疲软),巨额商誉减值(Impairment Loss)将直接吞噬股东权益,导致净资产大幅缩水。

    2.2 债务负担与利率风险

    三、 行业逆风与最坏情况分析

    3.1 战略转型的“多元恶化” (Diworsification)

    -

    彼得·林奇(Peter Lynch)曾警告企业盲目多元化的风险。麒麟正从一家简单的啤酒公司变成一家复杂的“发酵技术+制药+护肤品”混合体。 -* 资源分散:公司试图用啤酒赚来的现金去补贴连年亏损或高价收购的“健康科学”业务。这种“左手倒右手”的策略掩盖了资本配置的低效。 +

    彼得·林奇(Peter Lynch)曾警告企业盲目多元化的风险。麒麟正从一家简单的啤酒公司变成一家复杂的“发酵技术+制药+护肤品”混合体。
    +* 资源分散:公司试图用啤酒赚来的现金去补贴连年亏损或高价收购的“健康科学”业务。这种“左手倒右手”的策略掩盖了资本配置的低效。
    * 执行风险:管理层需要在三个完全不同的行业(快消、医药、美妆)同时作战,管理半径过长极易导致决策失误(如之前的缅甸业务退出惨案)。

    3.2 最坏情况压力测试 (Worst-Case Scenario)

    -

    假设以下情景同时发生: -1. 商誉减值:对Blackmores和Fancl的商誉进行50%的减值计提(约2700亿日元损失)。 -2. 销量下滑:国内啤酒销量因人口减少和消费降级下滑5%。 +

    假设以下情景同时发生:
    +1. 商誉减值:对Blackmores和Fancl的商誉进行50%的减值计提(约2700亿日元损失)。
    +2. 销量下滑:国内啤酒销量因人口减少和消费降级下滑5%。
    3. 药价下调:核心药品面临全球范围内10%的价格压力。

    4.2 投资建议:极度谨慎

    -

    麒麟控股目前呈现出典型的“价值陷阱”特征: -1. 护城河受损(啤酒存量博弈,医药面临悬崖)。 -2. 资产质量恶化(商誉占比过高,存在巨额减值雷管)。 +

    麒麟控股目前呈现出典型的“价值陷阱”特征:
    +1. 护城河受损(啤酒存量博弈,医药面临悬崖)。
    +2. 资产质量恶化(商誉占比过高,存在巨额减值雷管)。
    3. 安全边际缺失(清算价值极低,高市盈率透支了未来)。

    对于寻求本金安全的投资者,目前的麒麟控股不具备足够的安全边际。建议规避或在持有头寸中加入严格的止损保护。

    API Usage Summary

    diff --git a/__pycache__/stock_analysis.cpython-313.pyc b/__pycache__/stock_analysis.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..296bd8ca033ca3f3e32bc66555bd0108c6fbefc3 GIT binary patch literal 25072 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 JA + 'sane_lists', # 更好的列表处理 + 'attr_list', # 属性列表 + 'def_list', # 定义列表 + 'abbr', # 缩写 + 'footnotes', # 脚注 + 'md_in_html' # HTML中的Markdown + ]) report_html_content = md.convert(md_content) # 构建完整的HTML文档 @@ -223,16 +234,20 @@ def render_html_report(report_file, market, symbol): body {{ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; - max-width: 1200px; - margin: 0 auto; + margin: 0; padding: 20px; background-color: #f5f5f5; + display: flex; + justify-content: center; + min-height: 100vh; }} .container {{ background-color: white; - padding: 30px; + padding: 40px; border-radius: 8px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + max-width: 1200px; + width: 100%; }} h1 {{ color: #2c3e50; @@ -489,7 +504,7 @@ def main(): }) with open(report_file, 'a', encoding='utf-8') as f: - f.write(f"\n\n# {name.split('. ')[1] if '. ' in name else name}\n\n") + f.write(f"\n\n") f.write(result) print(f"Finished {name} in {duration:.2f}s.")