Lee Trader의 final_score는 같은 거래일의 국내 주식 후보를 일관된 기준으로 비교하기 위한 0~100 범위의 종합 점수입니다. 미래 수익률을 그대로 표시한 숫자도 아니고, 70점을 넘으면 자동으로 매수한다는 신호도 아닙니다. 모델 예측, 기술 상태, 재무 품질, 수급과 예상 하락 위험을 하나의 비교 축으로 정리한 결과입니다.

현재 운영 공식의 버전은 ranking_builder_v9_flow입니다. 점수 계산은 python/scoring/final_score.py를 단일 기준으로 사용하며, ranking_builder.py가 가격·특징·예측·시장 상태를 합쳐 일별 랭킹을 만듭니다. 이 글은 2026년 6월 22일 운영 코드를 기준으로 작성했습니다. 향후 공식이 바뀌면 버전과 수정일도 함께 갱신해야 합니다.

공식의 전체 구조

운영 점수는 다섯 개의 가산 축과 하나의 위험 차감 축으로 구성됩니다.

final_score =
    w_ret  × ret_score
  + w_prob × prob_score
  + w_tech × tech_score
  + w_qual × qual_score
  + w_flow × flow_score
  - w_risk × risk_penalty

ret, prob, tech, qual, flow는 점수를 높이는 축이고 risk_penalty는 점수를 낮추는 축입니다. 시장이 상승, 중립, 방어 중 어디에 있는지에 따라 각 가중치가 달라집니다. 마지막 결과는 0보다 작거나 100보다 커지지 않도록 제한합니다.

이 구조를 “6개 점수를 단순 평균한다”고 이해하면 정확하지 않습니다. 위험은 다른 항목과 같은 방향으로 더해지는 점수가 아니라 별도로 차감됩니다. 또한 각 구성값의 생성 방식도 서로 다릅니다.

1. 예상 수익 점수 ret_score

ret_score는 모델이 예측한 60일과 90일 수익률을 같은 날짜 종목군 안에서 상대 순위로 바꾼 결과입니다. 현재 운영 계산은 60일 상대 순위에 70%, 90일 상대 순위에 30%를 반영합니다.

ret_score =
    100 × (0.7 × 60일 예측수익 상대순위
         + 0.3 × 90일 예측수익 상대순위)

예를 들어 ret_score가 80이라고 해서 80% 수익을 예상한다는 뜻은 아닙니다. 그날 비교 대상 가운데 모델 예측이 상대적으로 높은 편이라는 의미입니다. 시장 전체의 예상 수익이 낮은 날에도 상대 순위 1위는 존재하므로, 절대 예측값과 점수를 함께 봐야 합니다.

30일 예상 수익도 별도 연구·진단 자료로 저장될 수 있지만 현재 운영 ret_score의 핵심 조합은 60일과 90일입니다. 화면에서 여러 예상 기간을 보여 주는 이유는 하나의 기간만으로 종목을 단정하지 않기 위해서입니다.

2. 상위권 확률 점수 prob_score

분류 모델은 해당 종목이 60일 뒤 상위 20%에 들어갈 가능성인 prob_top20_60d를 계산합니다. 여기에는 서로 다른 두 숫자가 존재합니다.

  • prob_score_raw: 모델 확률을 0~100으로 바꾼 절대형 참고값
  • prob_score: 같은 날짜 종목들의 확률을 다시 상대 순위로 변환한 운영값

실제 final_score에는 prob_score가 사용됩니다. 따라서 화면의 확률 구성 점수가 90이라고 해서 모델이 90% 성공 확률을 말한 것은 아닙니다. 해당 날짜 후보군에서 상위권 확률이 높은 위치라는 뜻입니다.

이 구분은 매우 중요합니다. 절대확률과 백분위는 해석이 다르고, 종목군 전체의 모델 확률이 낮아도 상대 점수는 높게 나올 수 있습니다. Lee Trader는 원 확률과 운영 점수를 별도 열로 보존해 사후 검증할 수 있도록 합니다.

60일 분류기는 미래 정보가 검증 구간에 섞이지 않도록 OOF 방식의 보정을 거칩니다. 그렇더라도 시장 구조가 바뀌면 확률의 실제 적중률은 달라질 수 있으므로 운영 결과를 계속 누적해야 합니다.

3. 기술 점수 tech_score

기술 점수는 가격 추세, 모멘텀, 변동성 안정성, 거래량 상태를 함께 봅니다. 사용 가능한 기존 기술 종합값이 충분히 정상적이면 그 값을 당일 백분위로 변환하고, 그렇지 않으면 원시 특징에서 보조 점수를 다시 만듭니다.

특징 기반 계산에서는 대략 다음 네 묶음을 사용합니다.

  • 추세 30%: 주가와 5·20·60일 이동평균의 정렬, 20일선 대비 위치
  • 모멘텀 35%: 5일·10일·20일 흐름과 RSI 상태
  • 안정성 20%: 20일·60일 변동성이 상대적으로 낮은지
  • 거래량 15%: 최근 거래량과 평균 거래량 대비 변화

거래 유동성이 종목군 하위권이면 기술 점수에 별도 완화 계수가 적용됩니다. 차트 모양이 좋아도 거래가 지나치게 적으면 실제 체결이 어렵고 가격 왜곡이 클 수 있기 때문입니다.

기술 점수가 높다는 사실은 상승이 확정됐다는 뜻이 아닙니다. 추세가 강할수록 과열 위험도 커질 수 있으며, 이 부분은 예상 낙폭과 실행 정책에서 다시 확인합니다.

4. 품질 점수 qual_score

qual_score는 재무 특징에서 만들어진 quality_score를 같은 날짜 종목군의 상대 백분위로 바꾼 값입니다. 수익성, 성장성, 재무 건전성과 데이터 완전성이 품질 자료에 영향을 줄 수 있습니다.

재무 자료는 가격처럼 매일 새로 발표되지 않습니다. 점수 계산일이 최신 거래일이어도 사용된 재무제표의 기준 분기는 더 이전일 수 있습니다. 그래서 품질 점수를 실시간 기업 상태로 오해하면 안 됩니다.

누락된 재무 항목이 많을 때는 품질 신뢰도와 별도 진단값을 확인합니다. 데이터가 없다고 좋은 기업이나 나쁜 기업으로 단정할 수 없으므로, 결측을 무조건 높은 점수나 낮은 점수로 바꾸지 않는 것이 중요합니다.

5. 수급 점수 flow_score

flow_score는 외국인과 기관의 최근 5거래일 누적 순매수를 그날 분석 종목군의 상대 순위로 변환한 값입니다.

flow_score =
    0.6 × 외국인 5일 순매수 백분위
  + 0.4 × 기관 5일 순매수 백분위

외국인 쪽 비중이 60%, 기관 쪽이 40%입니다. 둘 중 하나만 사용 가능하면 존재하는 한 축의 상대 점수를 사용하고, 최종 점수 단계에서 수급 점수가 비어 있으면 중립값 50을 적용합니다. 데이터 누락을 수급 최하위로 오인해 종목을 과도하게 불이익 주지 않기 위한 처리입니다.

수급 점수의 자세한 계산과 주의점은 수급 점수 설명에서 확인할 수 있습니다.

6. 위험 차감 risk_penalty

risk_penalty는 모델이 예상한 60일과 90일 최대 낙폭을 혼합해 만듭니다. 예상 하락 폭이 커질수록 패널티가 증가하며 상한이 있습니다. 점수에서 실제로 빠지는 크기는 시장 국면의 위험 가중치와 곱한 값입니다.

위험 차감은 “변동성이 높은 종목은 모두 나쁘다”는 판단이 아닙니다. 높은 기대 수익과 함께 큰 낙폭이 예상되는 후보를 같은 점수로 비교할 때 손익 비대칭을 반영하려는 장치입니다.

예상 최대 낙폭 역시 모델 예측이므로 실제 최악의 손실을 보장하거나 제한하지 않습니다. 실제 계좌에서는 손절, 포지션 한도, 주문 가능 수량 같은 별도 정책이 필요합니다.

시장 국면별 가중치

현재 운영 가중치는 다음과 같습니다.

시장 국면예상 수익상위권 확률기술품질수급위험 차감
상승0.330.240.230.080.120.40
중립0.280.230.210.180.100.65
방어0.230.190.160.340.080.80

상승 국면에서는 예측 수익과 기술 흐름의 비중이 상대적으로 높습니다. 방어 국면에서는 품질 비중과 위험 차감이 커집니다. 같은 종목의 구성 점수가 그대로여도 시장 국면이 바뀌면 final_score가 달라질 수 있습니다.

현재 가중치는 운영 기준으로 고정돼 있지만 코드 내부 기록에도 초기 수치의 정량적 출처가 완전하게 추적되지 않는다는 한계가 명시돼 있습니다. 충분한 60일 만기 운영 표본이 쌓이기 전에는 최근 몇 건의 결과만으로 가중치를 성급히 바꾸지 않습니다.

결측값은 어떻게 처리하나요?

핵심 구성값이 비어 있으면 결측 여부와 fallback 사용 여부를 별도 열에 기록합니다. 수급은 중립값 50을 사용하지만, 다른 축은 산출 단계와 진단 정책에 따라 처리 방식이 다릅니다. 사용자는 최종 점수만 정상적으로 보인다고 데이터가 모두 완전하다고 가정해서는 안 됩니다.

Lee Trader 운영 화면에서 신뢰도와 데이터 상태를 함께 보여 주는 이유입니다. 점수는 입력 자료가 정상일 때만 의미가 있으며, 오래된 기준일이나 높은 결측률은 행동 강도를 낮춰야 하는 신호입니다.

final_score와 live_score는 무엇이 다른가요?

기본 운영에서는 live_scorefinal_score와 같습니다. 테마 신뢰도 보정 같은 실험 점수도 계산될 수 있지만 현재 테마 운영 반영이 꺼져 있으면 실제 정렬에는 사용되지 않습니다. 연구용 열이 존재한다는 사실과 실주문에 적용된다는 사실을 구분해야 합니다.

confidence_scorefinal_score와 다른 개념입니다. 최종 점수가 종목의 상대 매력을 합친 값이라면 신뢰도는 예측, 실행 가능성, 안정성, 검증 상태를 해석하는 보조 층입니다. 높은 점수에 낮은 신뢰도가 붙을 수 있습니다.

점수가 주문으로 이어지는 과정

랭킹이 만들어진 뒤에는 진입 품질과 정책 검토가 이어집니다. 가격 과열, 유동성, 시장 상태, 계좌 현금, 기존 보유량, 중복 주문, 신호 신선도를 확인합니다. 이 때문에 랭킹 상위 종목도 WATCH나 REVIEW로 남을 수 있습니다.

실제 흐름은 다음과 같습니다.

데이터와 모델 예측
→ 구성 점수와 final_score
→ 당일 상대 랭킹
→ 진입 품질·시장·위험 검토
→ trade intent
→ 주문 가능성 검사
→ 실제 주문과 체결

점수 계산은 이 흐름의 중간 단계입니다. 점수가 좋아도 진입하지 않는 사례를 함께 보면 랭킹과 실행의 차이를 이해하기 쉽습니다.

안전하게 읽는 방법

점수 한 칸보다 기준일, 시장 국면, 구성 점수, 예상 낙폭, 신뢰도, 실행 상태를 함께 확인해야 합니다. 75점, 70점 같은 숫자를 보편적인 매수 경계로 외우는 것은 적절하지 않습니다. 종목군과 시장 상태에 따라 점수 분포가 달라지기 때문입니다.

특히 ret_scoreprob_score가 상대 순위라는 사실을 기억해야 합니다. 높은 점수는 그날 비교 대상보다 유리하다는 뜻이지 절대적으로 큰 수익이나 높은 성공 확률을 보장하지 않습니다.

Lee Trader는 현재 손익 분석 단계에서 모델이나 계산식을 즉시 개선하지 않습니다. 먼저 점수, 정책 결정, 주문, 체결과 이후 가격을 연결해 어떤 단계에서 손익 차이가 발생했는지 확인합니다. 원인이 충분히 확인된 뒤에만 변경 후보를 별도 실험으로 검토합니다.

이 글은 정보 제공을 위한 방법론 설명이며 특정 종목의 매수나 매도를 권유하지 않습니다. 모델 점수와 과거 검증 결과는 미래 수익을 보장하지 않으며 실제 투자 판단과 책임은 투자자에게 있습니다.