서론: 왜 이 지표, 왜 이 종목

선형회귀 곡선(LRC)은 최근 n개 종가에 직선 하나를 최소제곱으로 맞추고, 그 직선이 오늘 지나는 값을 하루씩 이어 그린 선이다. 이동평균은 n일 가격의 평균 위치를 보여 준다. 이 곡선은 n일 추세선이 오늘 어디에 도달했는지를 보여 준다. 그래서 같은 기간이면 이동평균보다 현재가에 바짝 붙어 다닌다는 설명이 따라온다. 이번 글은 그 설명이 삼성전자의 최근 두 달 반 구간에서 실제로 성립했는지 직접 재 본다.

이 종목을 고른 이유는 변동이 크기 때문이다. 7월 28일에 하루 -13.39%, 사흘 뒤인 7월 31일에는 하루 +26.81%가 찍혔다. 8월에도 20일에 +9.49%, 24일에 -8.70%가 나왔다. 추세선 하나로 가격을 요약하려는 지표에게는 까다로운 시험지다.

이 글의 데이터 범위
종목      삼성전자 (KRX 005930)
구간      2026-07-16 ~ 2026-09-29, 50거래일
출처      stockanalysis.com 일봉
--------------------------------------------------
최고가    288,000원 (08-18)
최저가    189,200원 (07-29)
첫 종가    255,000원 (07-16)
끝 종가    272,500원 (09-29)
구간 수익  +6.86% (종가 기준)

이 글은 지표 계산 결과를 정리한 학습 자료이며 투자 권유가 아니다. 매매 판단과 손익은 전적으로 본인 책임이다.

삼성전자 일봉과 거래량

본론: 계산, 실측, 검증

계산식

윈도 길이를 n, 윈도 안 종가를 시간순으로 y라 하고 x는 0부터 n-1까지의 순번으로 둔다.

선형회귀 곡선 계산식
기울기    b = Σ(x - x평균)(y - y평균) / Σ(x - x평균)²
절편      a = y평균 - b · x평균
LRC(t)    a + b · (n - 1)
--------------------------------------------------
잔차 σ    표준편차( y - (a + b · x) )
밴드      LRC(t) ± 2σ
신호      종가가 LRC 를 위로 뚫으면 상향, 아래로 뚫으면 하향

numpy 로만 구현했고 지표 라이브러리는 쓰지 않았다. 윈도 끝점의 값만 취하기 때문에 매일 새 직선을 다시 맞춘다. 어제의 직선을 연장한 것이 아니고 오늘 윈도로 처음부터 구한 값이다.

시가·고가·저가는 쓰지 않고 종가만 넣었다. 장중 급등락이 큰 종목이라 고가와 저가를 섞으면 직선이 그날의 꼬리에 끌려간다. 예를 들어 7월 29일은 저가가 189,200원까지 내려갔다가 종가는 208,500원으로 마감했다. 종가만 쓰면 그 꼬리는 곡선에 반영되지 않는다. 대신 장중에 곡선을 밟고 되돌린 움직임은 이 계산으로 볼 수 없다.

파라미터와 예열 구간

기간은 20으로 골랐다. 거래일로 한 달에 해당하는 관행 값이고, 표본이 50개뿐이라 이보다 길게 잡으면 유효값이 너무 줄어든다. 기간 30이면 유효값이 21개, 기간 20이면 31개, 기간 10이면 41개다. 앞의 19거래일은 윈도가 차지 않아 곡선이 아예 없다. 첫 유효값은 8월 13일이다. 이 글의 신호 검증은 8월 13일부터 9월 29일까지 31거래일 위에서 이뤄진다는 점을 먼저 밝혀 둔다.

데이터도 부족했다. 최근 60거래일 이상을 받으려 했는데 출처가 50거래일치(7월 16일 이후)만 돌려줬다. 조회 조건을 바꿔 여러 번 요청해도 같았다. 서로 다른 요청에서 겹치는 행은 전부 일치했다. 다만 단일 출처라 다른 곳과 대조하지는 못했다.

곡선이 실제로 붙어 다녔는가

유효한 31거래일 동안 종가와 곡선의 절대 차이 평균은 10,669원이었다. 같은 기간 20일 단순이동평균(SMA)과 종가의 차이 평균은 11,716원이다. 곡선이 더 가깝긴 하지만 차이는 10% 안팎이다. 마지막 날 9월 29일로 보면 종가 272,500원에 곡선은 270,814원, 이동평균은 262,875원이다. 격차가 각각 1,686원과 9,625원이라 이날은 확실히 곡선이 붙었다.

반대 사례도 있다. 첫 유효일인 8월 13일 종가는 268,000원인데 곡선은 238,829원이었다. 29,171원(12.21%) 아래였다. 윈도에 7월 말 폭락 구간이 그대로 들어 있어서 직선의 기울기가 음수로 잡혔고, 그 끝점이 실제 가격보다 한참 낮게 나온 것이다. 급반등 앞에서는 이 곡선도 뒤처진다.

종가와 선형회귀 곡선 20일 교차 신호

곡선의 기울기는 하루 -561원에서 +2,684원 사이를 오갔다. 최대는 8월 25일, 최소는 9월 16일이다. 마지막 날 기울기는 +836원이고 잔차 표준편차는 9,141원이라 밴드는 252,533원에서 289,095원이다. 종가 272,500원은 곡선보다 0.62% 위에 있다. 31거래일 중 종가가 곡선 위에서 마감한 날은 15일이었다.

신호 여섯 개 전수

종가가 곡선을 교차한 날을 모두 나열하고, 신호일 종가 대비 5거래일 뒤 종가로 방향을 판정했다. 상향 신호는 올랐으면 맞은 것, 하향 신호는 내렸으면 맞은 것이다.

기간 20 교차 신호와 5거래일 뒤 결과
#  날짜   방향  종가      곡선      5일 뒤
--------------------------------------------------
1  08-19  하향  247,500   251,814   +5.66% 빗나감
2  08-20  상향  271,000   258,157   -1.85% 빗나감
3  08-24  하향  257,000   269,579   +1.17% 빗나감
4  09-07  상향  270,000   262,493   -7.78% 빗나감
5  09-11  하향  259,500   261,214   +0.58% 빗나감
6  09-18  상향  261,000   257,329   +4.41% 적중

여섯 개 중 다섯 개가 빗나갔다. 적중률은 16.67%다. 1번과 2번은 하루 간격으로 터졌다. 8월 19일에 -7.82%로 밀리며 하향 신호가 났고, 다음 날 +9.49%로 튀어 올라 곧바로 상향 신호가 났다. 두 신호를 다 따라갔다면 이틀 만에 반대로 뒤집혔을 것이다. 3번은 8월 24일 -8.70% 급락일에 났는데 5거래일 뒤에는 오히려 +1.17%였다. 4번은 가장 뼈아프다. 9월 7일 +5.68% 급등 봉으로 곡선을 뚫었지만 5거래일 뒤 종가는 249,000원으로 -7.78%였다.

맞은 신호는 6번 하나다. 9월 18일 종가 261,000원에서 9월 29일 272,500원으로 올랐다. 다만 이 신호는 표본 끝자락이라 그 뒤 흐름이 더 있는지는 알 수 없다.

교차 신호 이후 5거래일 등락률

파라미터를 바꾸면

같은 방식으로 기간만 바꿔 다시 셌다. 기간 10은 신호가 14개 나왔고 5거래일 뒤가 있는 13개 중 5개가 맞았다(38.46%). 기간 30은 신호가 3개뿐이고 평가 가능한 2개 중 1개가 맞았다. 기간을 바꾼다고 승률이 좋아지지는 않았다. 기간 10은 신호가 잦아 왕복이 늘고, 기간 30은 표본이 너무 적어서 판정이 성립하지 않는다.

기간 10, 20, 30 비교

판정 기준과 밴드, 기울기를 바꿔 보면

5거래일이라는 판정 기준이 결과를 좌우했을 수 있어서 3거래일로도 다시 셌다. 이 기준에서는 여섯 개 중 두 개가 맞았다(33.33%). 9월 11일 하향 신호는 3거래일 뒤 -2.31%로 맞았고, 9월 18일 상향 신호는 +9.39%로 맞았다. 나머지 넷은 여전히 반대로 갔다. 기준을 짧게 바꿔도 절반을 넘지 못했다.

밴드도 써 보려 했다. 곡선 ±2σ 밖으로 종가가 나가면 과열이나 과매도로 읽을 수 있다. 그런데 31거래일 동안 종가가 밴드를 벗어난 날은 하루도 없었다. 7월 말의 큰 봉들이 윈도에 들어 있으면 잔차 σ가 같이 커져서 밴드가 넓어지고, 8월 이후의 등락은 그 안에 다 들어갔다. 이 기간에는 밴드가 신호를 만들어 내지 못했다.

기울기도 확인했다. 31거래일 중 22일은 곡선이 우상향이었다. 신호일 기울기를 보면 1번이 하루 +704원, 2번이 +1,317원, 3번이 +2,419원, 4번이 +360원이었다. 상승 기울기 위에서 난 신호가 네 번 연속 빗나갔다. 5번은 -167원, 6번은 -163원이다. 유일하게 맞은 6번이 기울기가 꺾여 있던 날에 나왔다. 표본이 여섯 개라 여기서 규칙을 뽑을 수는 없다. 그래도 기울기가 신호의 신뢰도를 보증해 주지 않았다는 사실은 남는다.

봇 게이트에 넣을 것인가

단독 진입·청산 조건으로는 넣지 않는다. 이 구간에서 교차 신호는 동전 던지기보다 나빴고, 표본이 6개라 나쁘다고 단정하기에도 부족하다. 두 결론이 동시에 성립한다. 기울기의 부호를 추세 필터로 쓰는 안은 남겨 둔다. 그러나 그것도 유효값 31개로는 검증이 안 된다. 거래량이 후반부에 줄어든 점도 걸린다. 앞쪽 25거래일의 하루 평균은 2,903만 주, 뒤쪽 25거래일은 1,769만 주였다. 변동이 잦아든 구간과 큰 구간에서 같은 기간 값이 같은 의미를 갖는지 아직 모른다.

결론: 남기는 것

이번 구간에서 건질 것은 두 가지다. 첫째, 곡선은 이동평균보다 가격에 붙긴 했으나 평균 격차로는 10% 정도 좁혀졌을 뿐이다. 둘째, 큰 봉 하나가 곡선을 뚫는 순간에 난 신호는 대부분 다음 주에 되돌려졌다. 8월 19일과 20일, 9월 7일이 그랬다.

기울기 필터를 단다면 어떻게 될지는 이 글에서 풀지 못했다. 표본이 50거래일이라 기간을 조금만 키워도 유효값이 20개 아래로 떨어진다. 다음에 이 지표를 만나면 데이터를 200거래일 이상 확보해서 같은 검증을 다시 돌려 보고 싶다.

이 글의 계산은 단일 출처 일봉으로 직접 한 것이며 미래 수익을 보장하지 않는다.


약어 풀이

* 이 글에 나온 영어 약어를 풀어 둔다.

  • LRC (Linear Regression Curve): 선형회귀 곡선. 최근 n개 종가에 최소제곱 직선을 맞추고 그 직선의 오늘 끝점을 이은 선.
  • SMA (Simple Moving Average): 단순이동평균. 기간 안의 종가를 같은 가중치로 평균한 값.
  • KRX (Korea Exchange): 한국거래소. 코스피·코스닥을 운영하는 국내 증권 거래소.