1. 지표 한 줄 요약 및 탄생 배경
신고가-신저가 지수(New High-New Low Index, NH-NL)는 시장 내부에서 은밀하게 벌어지는 주도주(신고가)와 소외주(신저가)의 세력 교체를 수치화하여 진짜 추세의 방향과 시장의 건강 상태를 짚어내는 지표입니다.
유명한 트레이더이자 정신과 의사였던 알렉산더 엘더(Alexander Elder) 박사는 주가지수의 맹점을 지적했습니다. 코스피 지수가 박스권에 갇혀 멈춰있는 것처럼 보여도, 내부를 들여다봤을 때 52주 신고가를 경신하는 주도주가 속출하고 있다면 시장 에너지는 이미 상승을 준비하고 있는 것입니다. 반대로 지수가 고점 부근에 있는데 신저가 종목이 늘어나고 있다면 겉만 멀쩡할 뿐 속은 썩어 들어가고 있다는 뜻입니다. 엘더 박사는 이처럼 시장을 이끄는 '장수(주도주)'들의 동향을 파악하기 위해 매일의 신고가 종목 수에서 신저가 종목 수를 빼는 단순하지만 강력한 시장폭 지표를 고안했습니다.
2. 수리적 원리와 계산 구조
이 지표는 복잡한 가격 변동률 대신, 1년(약 250거래일)이라는 긴 시간 동안 억눌렸던 가격을 돌파한 '의미 있는 종목의 개수'에만 집중합니다.
Step 1. NH(New Highs)와 NL(New Lows) 카운팅
통상적으로 52주(약 250거래일)를 기준으로 삼습니다. 오늘 주식 시장에 상장된 종목 중, 과거 250일 동안의 최고가를 뚫고 올라간 종목 수(NH)와 250일 동안의 최저가를 깨고 내려간 종목 수(NL)를 각각 카운트합니다.
Step 2. NH-NL 지수 산출
새로운 주도주(신고가) 무리의 수에서, 소외주(신저가) 무리의 수를 차감하여 순수한 시장 에너지를 추출합니다.
만약 오늘 52주 신고가를 기록한 종목이 50개, 신저가를 기록한 종목이 10개라면 오늘의 NH-NL 지수는 +40이 됩니다.
3. 차트에서 나타나는 수리적 특성: 다이버전스(Divergence)
NH-NL 지표 역시 이전 018번, 019번 지표들과 마찬가지로 주가지수와의 '다이버전스(괴리)' 현상이 발생할 때 가장 강력한 매매 시그널을 제공합니다.
- 약세 다이버전스 (천장 경고): 주가지수는 직전 고점을 돌파하며 화려하게 상승(New High)하는데, NH-NL 지표의 봉우리는 이전보다 낮아지거나 심지어 0선 아래로 떨어지는 경우입니다. 이는 지수만 오를 뿐, 새롭게 시장을 이끌어갈 주도주(신고가 종목)의 씨가 말랐다는 뜻으로 강력한 매도(폭락) 시그널입니다.
- 강세 다이버전스 (바닥 확인): 주가지수는 계속 폭락하며 신저가를 갱신하는데, NH-NL 지표는 이전 하락 때보다 음수 폭을 줄이며 서서히 위로 올라오는 경우입니다. 대중은 공포에 질려 시장을 떠나고 있지만, 속살을 까보면 바닥을 찍고 살아나는 종목들이 조용히 늘어나고 있다는 강력한 매수 시그널입니다.
4. 장점 및 한계
- 장점: 시장의 거대한 뼈대를 이루는 주도주의 등장과 퇴장을 수치화하여 보여주므로, 중장기적인 시장의 튼튼함을 판별하고 숨겨진 폭락을 피하는 데 매우 훌륭한 역할을 합니다.
- 한계: 52주(250일)라는 긴 기준을 사용하므로 1~2주 단위의 단기적인 매매 타이밍을 잡기에는 지표의 반응 속도가 매우 둔감합니다. 또한, 지표를 처음 계산하기 위해 최소 250일 치의 과거 데이터가 필수적으로 요구됩니다.
5. 파이썬 구현 (마이크로 마켓 10선 적용)
이전 018번 시장폭 지표 편에서 만들었던 '나만의 관심 종목 10선(마이크로 마켓)'의 데이터를 재사용하여, 직관적인 for 반복문으로 250일 신고가/신저가를 갱신한 종목을 카운팅하는 로직입니다.
[데이터 01] 시스템 트레이딩의 심장, 나만의 주식 DB 만들기 (대신증권 편)
이 글의 목표1. 대신증권 API(Cybos Plus)를 활용해 안정적으로 주식 데이터를 수집합니다.2. yfinance의 한계를 넘어, 수정 주가(Adjusted Price)가 반영된 깨끗한 데이터를 확보합니다.3. 1종목 1테이블 구
system-trading-bot.tistory.com
import sqlite3
import pandas as pd
# 1. 표준 데이터 로딩 함수
def load_data(code):
conn = sqlite3.connect("stock.db")
query = f"SELECT * FROM stock_{code} ORDER BY date"
df = pd.read_sql(query, conn)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
return df
# 2. 신고가-신저가 지수(NH-NL) 계산 로직
def calculate_nh_nl_index(stock_df_list, window=250):
# 날짜 기준을 맞추기 위해 첫 번째 종목의 날짜 인덱스 사용
base_dates = stock_df_list[0].index
nh_nl_line = []
for i in range(len(base_dates)):
# 250일 이전은 과거 데이터 부족으로 계산 불가 (0 처리)
if i < window:
nh_nl_line.append(0)
continue
nh_count = 0 # 오늘 52주 신고가를 찍은 종목 수
nl_count = 0 # 오늘 52주 신저가를 찍은 종목 수
for df in stock_df_list:
# 과거 250일 동안의 가격 데이터 블록 생성
past_window = df['close'].iloc[i-window:i]
today_price = df['close'].iloc[i]
# 오늘의 종가가 과거 250일 최고가보다 높으면 신고가(NH)
if today_price > past_window.max():
nh_count += 1
# 오늘의 종가가 과거 250일 최저가보다 낮으면 신저가(NL)
elif today_price < past_window.min():
nl_count += 1
# 당일의 NH-NL 에너지 산출
daily_nh_nl = nh_count - nl_count
nh_nl_line.append(daily_nh_nl)
return nh_nl_line
6. 실전 Tip 및 요약
단일 종목을 매매할 때도 NH-NL 지표는 훌륭한 나침반이 됩니다. 내가 사려는 주식의 차트가 아무리 좋아 보여도, 코스피 전체의 NH-NL 지수가 0선 아래에서 계속 머물며 음수를 기록하고 있다면 매수 버튼을 누르는 손가락을 멈추십시오. 숲이 불타고 있는데 혼자만 푸르게 자랄 수 있는 나무는 주식 시장에 존재하지 않습니다.
'기술지표' 카테고리의 다른 글
| 피보나치 확장(Fibonacci Extension) 목표가 산정 및 익절 구간 설정 [지표 백과 022] (0) | 2026.02.27 |
|---|---|
| 투자심리도(Psychological Line) 지표 퀀트 매매: 바닥과 상투 잡기 [지표 백과 021] (0) | 2026.02.27 |
| 등락주선(ADL) 차트 보는 법: 지수 상승과 하락 다이버전스 분석 [지표 백과 019] (0) | 2026.02.26 |
| 시장폭 지표(Market Breadth)로 코스피/나스닥 진짜 체력 확인하기 [지표 백과 018] (0) | 2026.02.26 |
| 어썸 오실레이터(Awesome Oscillator, AO) 매매 기법 및 차트 설정 [지표 백과 017] (0) | 2026.02.25 |