@@ -477,6 +477,80 @@ def moat_score(
477477
478478 return {"score" : round (score , 1 ), "label" : label , "max_score" : 10 }
479479
480+
481+ # ---------------------------------------------------------------------------
482+ # Capital cycle analysis (inspired by 资本周期方法论)
483+ # ---------------------------------------------------------------------------
484+
485+
486+ def capital_cycle_stage (
487+ capex : list [float ],
488+ depreciation : list [float ],
489+ revenue : list [float ] | None = None ,
490+ ) -> dict :
491+ """Analyze capital cycle stage from Capex/Depreciation ratio.
492+
493+ The capital cycle framework (资本周期方法论) tracks whether a company
494+ is in the investment or harvesting phase of its capacity cycle.
495+
496+ Stages:
497+ Expansion (投资扩张期): Capex/D&A > 1.5, rising
498+ Peak (产能高峰): Capex/D&A peaks, revenue growth decelerates
499+ Harvest (产能消化期): Capex/D&A < 1.0, falling
500+ Trough (产能出清期): Capex/D&A at low, competitors exiting
501+ Re-invest (再投资期): Capex/D&A rising from trough
502+
503+ Args:
504+ capex: List of annual capital expenditure values (recent first).
505+ depreciation: List of annual depreciation values (recent first).
506+ revenue: Optional list of annual revenue for growth context.
507+
508+ Returns:
509+ Dict with stage, ratio, trend, and description.
510+ """
511+ if len (capex ) < 3 or len (depreciation ) < 3 :
512+ return {"stage" : "数据不足" , "ratio" : None , "trend" : "" }
513+
514+ ratios = [c / max (d , 1 ) for c , d in zip (capex , depreciation )]
515+ current = ratios [0 ]
516+ prev = ratios [1 ]
517+ trend = "rising" if current > prev else "falling"
518+
519+ # Revenue growth context
520+ rev_growth = None
521+ if revenue and len (revenue ) >= 2 :
522+ rev_growth = (revenue [0 ] - revenue [1 ]) / abs (revenue [1 ]) if revenue [1 ] != 0 else 0
523+
524+ if current > 1.5 and trend == "rising" :
525+ stage = "投资扩张期"
526+ desc = f"Capex/折旧比 { current :.1f} 且上升中,公司正处于大规模资本投入阶段。"
527+ if rev_growth and rev_growth > 0.15 :
528+ desc += "营收高速增长,投入有回报支撑。"
529+ else :
530+ desc += "⚠️ 营收增速未匹配,警惕过度投资。"
531+ elif current > 1.5 and trend == "falling" :
532+ stage = "产能投产期"
533+ desc = f"Capex/折旧比 { current :.1f} 但已从高位回落,前期投入开始转固。关注产能利用率爬坡。"
534+ elif 1.0 <= current <= 1.5 :
535+ stage = "稳态期"
536+ desc = f"Capex/折旧比 { current :.1f} ,维持性资本开支为主,产能与需求基本匹配。"
537+ elif current < 1.0 and trend == "falling" and (current < ratios [- 1 ] * 0.8 if len (ratios ) > 2 else False ):
538+ stage = "产能出清期"
539+ desc = f"Capex/折旧比 { current :.1f} 且持续下降,行业产能出清中,竞争者可能退出。"
540+ elif current < 1.0 and trend == "rising" and prev < 1.0 :
541+ stage = "再投资早期"
542+ desc = f"Capex/折旧比 { current :.1f} 从低点回升,可能是行业见底信号。关注需求是否实质性复苏。"
543+ else :
544+ stage = "产能消化期"
545+ desc = f"Capex/折旧比 { current :.1f} ,投资低于折旧,公司在消化前期产能。"
546+
547+ return {
548+ "stage" : stage ,
549+ "ratio" : round (current , 2 ),
550+ "trend" : trend ,
551+ "description" : desc ,
552+ "ratios_history" : [round (r , 2 ) for r in ratios ],
553+ }
480554# ---------------------------------------------------------------------------
481555# Module 3: Original lightweight health checks
482556# ---------------------------------------------------------------------------
0 commit comments