From c9fafad10dfb5b6ab412a4daca3006521c0c3f37 Mon Sep 17 00:00:00 2001 From: hyowons Date: Thu, 11 Jun 2026 12:12:46 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B8=B0=EC=97=85=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A2=85=ED=95=A9=20=ED=8C=90=EB=8B=A8=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EC=A0=95(forward)=20PER=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존엔 trailing PER만 보고 고평가 판단 → 성장주(삼성전자 45배 vs 추정 6.9배) 오판. trailing 높아도(≥30) 추정PER이 크게 낮으면( --- agents/stock/workspace/scripts/behive_web.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/agents/stock/workspace/scripts/behive_web.py b/agents/stock/workspace/scripts/behive_web.py index 202cbc1..29b7aa6 100644 --- a/agents/stock/workspace/scripts/behive_web.py +++ b/agents/stock/workspace/scripts/behive_web.py @@ -7910,8 +7910,17 @@ def render_html() -> str: # 가치/성장 지표를 {good,caution} 으로 분류 (요약탭에서 합쳐 표시). 'function companyGC(j){' 'var good=[],caution=[],per=_gnum(j.per),pbr=_gnum(j.pbr),roe=_gnum(j.roe);' + 'var fwd=_gnum((j.fundamentals&&j.fundamentals.consensus)?j.fundamentals.consensus.per:null);' 'if(roe!=null){if(roe<0)caution.push("ROE "+roe.toFixed(1)+"% — 자기자본이 손실(수익성 부진)");else if(roe>=15)good.push("ROE "+roe.toFixed(1)+"% — 자본 수익성 우수");else if(roe<8)caution.push("ROE "+roe.toFixed(1)+"% — 자본 수익성 다소 낮음");}' - 'if(per!=null){if(per<=0)caution.push("PER 산정 불가 — 적자 또는 이익 미미");else if(per>=30)caution.push("PER "+per.toFixed(1)+"배 — 기대가 선반영된 고평가 부담");else if(per<=10)good.push("PER "+per.toFixed(1)+"배 — 밸류에이션 부담이 작음");}' + # PER: trailing 높아도 추정(forward) PER이 크게 낮으면 이익 급증 기대 반영 → 고평가로 단정 X, 다만 추정치 미달 위험 경고. + 'if(per!=null){' + 'if(per<=0)caution.push("PER 산정 불가 — 적자 또는 이익 미미");' + 'else if(per>=30){' + 'if(fwd!=null&&fwd>0&&fwd=3)caution.push("PBR "+pbr.toFixed(1)+"배 — 자산가치 대비 비싼 편");else if(pbr>0&&pbr<1)good.push("PBR "+pbr.toFixed(1)+"배 — 자산가치(청산가치) 이하");}' 'return {good:good,caution:caution};' '}' @@ -7934,11 +7943,14 @@ def render_html() -> str: 'var gr=(j.fundamentals&&j.fundamentals.growth)||{},fc=(j.fundamentals&&j.fundamentals.consensus)||{},cn=j.consensus||{};' 'var oy=_gnum(gr.oper_profit_yoy),sy=_gnum(gr.sales_yoy),tr=_gnum(cn.target_change_pct);' 'var p=_gnum(j.price),tp=_gnum(fc.target_price),up=(p&&tp)?(tp/p-1)*100:null;' - 'var valHigh=(per!=null&&per>=30)||(pbr!=null&&pbr>=3);' + 'var fwd=_gnum(fc.per);' + 'var growthPriced=(per!=null&&per>=30&&fwd!=null&&fwd>0&&fwd=30&&!growthPriced)||(pbr!=null&&pbr>=3);' 'var valCheap=(per!=null&&per>0&&per<=10)||(pbr!=null&&pbr>0&&pbr<1);' 'var buy=fc.opinion_label&&fc.opinion_label.indexOf("매수")>=0;' 'var grPos=(oy!=null&&oy>=20)||(up!=null&&up>=15)||buy||(tr!=null&&tr>0);' 'var grNeg=(oy!=null&&oy<0)||(sy!=null&&sy<0)||(up!=null&&up<0)||(tr!=null&&tr<0);' + 'if(growthPriced)return "현재 PER은 "+per.toFixed(0)+"배로 높지만 추정이익이 급증해 추정(forward) PER은 "+fwd.toFixed(1)+"배로 낮아요. 시장이 가파른 이익 성장을 기대하는 구간으로, 성장이 실현되면 밸류가 정당화되지만 추정치에 못 미치면 조정 위험이 큽니다.";' 'if(valHigh&&grPos)return "성장·실적 기대는 좋지만 현재 밸류에이션이 높아 그 기대가 주가에 이미 상당 부분 반영돼 있어요. 성장이 기대만큼 이어지는지가 관건입니다.";' 'if(valCheap&&grNeg)return "밸류에이션은 저평가 구간이나 성장·전망이 부진해요. 싸다는 이유만으로 접근하기보다 실적 반등 신호를 함께 봐야 합니다.";' 'if(valHigh&&grNeg)return "밸류에이션이 높은데 성장·전망도 약한 부담스러운 조합이에요. 신중히 접근하세요.";'