feat: 기업정보 종합 판단에 추정(forward) PER 반영
기존엔 trailing PER만 보고 고평가 판단 → 성장주(삼성전자 45배 vs 추정 6.9배) 오판. trailing 높아도(≥30) 추정PER이 크게 낮으면(<trailing×0.6 & <20) '이익 급증 기대(growth priced in)'로 인식: 고평가 단정 대신 좋은점(forward 저평가)+주의점 (추정치 미달 시 조정 위험) 양면 표시. synthNote에 forward 우선 케이스 추가. forward EPS 낙관 경향 고려해 미달 위험 경고 동반. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -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<per*0.6&&fwd<20){good.push("추정PER "+fwd.toFixed(1)+"배 — 이익 급증 기대로 forward 밸류는 낮음");caution.push("현재 PER "+per.toFixed(1)+"배 — 추정이익 실현 전이라 단기 밸류 부담(성장 미달 시 조정 위험)");}'
|
||||
'else caution.push("PER "+per.toFixed(1)+"배 — 기대가 선반영된 고평가 부담");'
|
||||
'}'
|
||||
'else if(per<=10)good.push("PER "+per.toFixed(1)+"배 — 밸류에이션 부담이 작음");'
|
||||
'}'
|
||||
'if(pbr!=null){if(pbr>=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<per*0.6&&fwd<20);'
|
||||
'var valHigh=(per!=null&&per>=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 "밸류에이션이 높은데 성장·전망도 약한 부담스러운 조합이에요. 신중히 접근하세요.";'
|
||||
|
||||
Reference in New Issue
Block a user