기본 콘텐츠로 건너뛰기

방송대 오픈소스기반데이터분석 15강: 시계열 신호와 예측 검증

오픈소스기반데이터분석 15강 - 시계열 데이터 분석

방송대 오픈소스기반데이터분석 15강: 시계열 신호와 예측 검증

이동평균선이 교차하고 백테스트 수익률이 높게 나왔다고 곧바로 좋은 전략이라고 말할 수 있을까? 시계열에서는 계산 자체보다 ‘그 시점에 알 수 있었던 정보만 썼는가’가 먼저다. 이 글은 이동평균·RSI 신호부터 Prophet·GBRT 예측까지 시간 순서와 검증 규칙으로 판정하는 방법을 다룬다.

수익 그래프보다 먼저 정보의 시점을 검사한다

학습을 위해 주가 종가로 매수·매도 신호를 만든 상황을 가정하자. 오늘 종가로 계산한 신호를 오늘 종가 수익률에 적용하면, 실제로는 장이 끝나야 알 수 있는 값을 이미 알고 거래한 셈이 된다. 이런 미래 정보 누출은 코드가 오류 없이 실행되어도 성과를 과장한다.

따라서 시계열 분석의 첫 질문은 “어떤 모델인가?”가 아니라 “예측 시점과 입력 시점이 어떻게 연결되는가?”다. 관측치를 무작위로 섞어 훈련·평가하거나, 현재 값을 계산한 신호를 같은 시점의 수익에 곱하는 방식은 시간 의존성을 끊는다.

판정 규칙: 시점 t에서 만든 결정에는 t까지 확인 가능한 정보만 사용한다. 그 결정의 성과는 그다음 거래 가능 시점의 변화로 평가한다.

시계열은 순서가 곧 데이터의 일부다

시계열 데이터는 일정한 시간 간격으로 수집되어 시간의 흐름에 따라 순차적으로 기록된 값의 집합이다. 일반 표 데이터와 달리 관측치 사이에 시간적 의존성이 있어 과거 값이 현재·미래 값과 관련될 수 있다. 날씨, 전력 수요, 경제 지표, 웹 트래픽과 주가가 대표적 응용 사례다.

날짜 열이 있다는 사실만으로 분석이 준비되지는 않는다. 시간 오름차순 정렬, 중복 시점, 빠진 간격, 거래일과 달력일의 차이를 확인해야 한다. 특히 금융 데이터의 50일 이동평균은 보통 50개의 거래 관측치를 뜻하므로 달력상의 50일과 같다고 단정하면 안 된다.

강의의 주가 사례는 시계열 기법을 학습하기 위한 교육용 실습이다. 아래 신호와 예측 설명은 실제 투자 결정을 위한 권유나 수익 보장이 아니다.

네 가지 특징은 반복 주기의 고정 여부로 구분한다

시계열을 추세·계절성·불규칙성·주기성으로 나누는 이유는 변동을 모두 같은 원인으로 해석하지 않기 위해서다. 장기 방향인지, 고정된 간격의 반복인지, 더 길고 불규칙한 순환인지, 설명하기 어려운 잡음인지에 따라 분석과 예측의 전제가 달라진다.

구성 특징판별 질문핵심 기준오해하기 쉬운 지점
추세장기간 전반적 방향이 있는가?상승·하락의 기본 골격짧은 반등을 장기 추세로 확대
계절성정해진 시간 간격으로 되풀이되는가?일·주·월·연 등 고정 주기한 번의 이벤트를 계절성으로 판단
주기성계절성보다 긴 파동이 있으나 간격이 고정되지 않았는가?장기 순환, 길이 변동 가능계절성과 단지 기간만 다른 것으로 암기
불규칙성다른 구성으로 설명하기 어려운가?예측하기 힘든 무작위 변동이상한 값을 모두 삭제할 대상으로 취급

예를 들어 매주 월요일마다 같은 방향의 변화가 반복되면 계절성 후보지만, 수년 간격의 경기 파동처럼 길이가 일정하지 않다면 주기성에 가깝다. 한 번의 급변은 반복 여부를 확인하기 전에는 계절성으로 부를 수 없다.

이동평균은 창 안의 값을 평균내어 단기 흔들림을 완화한다

이동평균(MA)은 정해진 길이의 연속 구간을 한 칸씩 이동하며 평균을 계산한 값이다. pandas에서는 rolling(window=길이)가 창을 만들고 mean()이 창 안의 평균을 계산한다. 창이 길수록 곡선은 매끄럽지만 최근 변화에 늦게 반응한다.

직접 구성한 종가가 100, 110, 104, 112, 108이라고 하자. 3일 이동평균의 첫 값은 세 번째 날에 생긴다.

  • 3일차: (100 + 110 + 104) ÷ 3 = 104.67
  • 4일차: (110 + 104 + 112) ÷ 3 = 108.67
  • 5일차: (104 + 112 + 108) ÷ 3 = 108.00

앞의 두 날짜가 결측값인 것은 계산 실패가 아니라 창을 채울 관측치가 아직 부족하기 때문이다.

import pandas as pd

close = pd.Series([100, 110, 104, 112, 108], name="close")
ma3 = close.rolling(window=3).mean()
print(ma3.round(2))

출력의 마지막 세 값은 104.67, 108.67, 108.00이다. 미래 가격을 창에 넣지 않는 뒤쪽 이동창이므로 각 행은 그 시점까지의 값만 요약한다.

RSI는 상승폭과 하락폭의 상대적 크기를 0에서 100으로 바꾼다

상대강도지수(RSI)는 일정 기간의 평균 상승폭과 평균 하락폭을 비교하는 모멘텀 지표다. 강의의 식은 다음과 같다.

RS = 평균 상승폭 ÷ 평균 하락폭, RSI = 100 - 100 ÷ (1 + RS)

학습용으로 5번의 변화가 +2, -1, +3, -2, +4라고 가정하자. 상승이 없는 날과 하락이 없는 날을 0으로 두고 단순 평균을 계산하면 평균 상승폭은 (2 + 0 + 3 + 0 + 4) ÷ 5 = 1.8, 평균 하락폭은 (0 + 1 + 0 + 2 + 0) ÷ 5 = 0.6이다. 따라서 RS는 3이고 RSI는 100 - 100 ÷ 4 = 75다.

RSI가 70보다 높다는 사실은 강한 상승 모멘텀을 나타내는 전형적 해석 기준이지, 다음 날 반드시 하락한다는 예언이 아니다. 30과 70은 신호 규칙의 기준선이며 시장 상황과 계산 기간에 따라 해석이 달라질 수 있다.

신호는 ‘위에 있다’가 아니라 ‘경계를 통과했다’로 정의한다

강의의 매수 조건은 MA50이 MA200을 아래에서 위로 통과하는 골든 크로스, 또는 RSI가 30 이하에서 30 위로 반등하는 경우다. 매도 조건은 MA50이 MA200을 위에서 아래로 통과하는 데드 크로스, 또는 RSI가 70 이상에서 70 아래로 반락하는 경우다.

교차는 두 시점의 관계를 모두 확인해야 한다. 오늘 MA50이 MA200보다 높다는 조건만 쓰면 교차한 날뿐 아니라 이후 모든 날을 새 매수 신호로 잘못 기록한다.

golden_cross = (df["MA50"] > df["MA200"]) & (
    df["MA50"].shift(1) <= df["MA200"].shift(1)
)
rsi_rebound = (df["RSI"] > 30) & (df["RSI"].shift(1) <= 30)

buy_signal = golden_cross | rsi_rebound

shift(1)은 바로 전 관측치의 상태를 가져온다. 이전에는 경계 아래였고 현재는 위일 때만 한 번의 상향 돌파로 판정한다.

포지션은 신호보다 한 박자 뒤에 적용해야 현실적인 검증이 된다

포지션은 전략이 현재 보유 상태인지 아닌지를 나타낸다. 새 신호가 없을 때 이전 상태를 유지하고, 시작 시점에는 기본 상태를 정해야 한다. 종가로 신호를 계산했다면 같은 종가로 이미 거래했다고 처리하지 않고 다음 거래 가능 시점부터 포지션을 적용하는 방식이 미래 정보 누출을 줄인다.

일별 자산 수익률이 +2%, -1%, +3%이고 실제 적용 포지션이 0, 1, 1이라면 전략 수익률은 0%, -1%, +3%다. 단순히 -1% + 3% = 2%라고 합치지 않고 복리로 계산하면 (1 - 0.01) × (1 + 0.03) - 1 = 1.97%다.

df["asset_return"] = df["Close"].pct_change()
df["position"] = raw_position.shift(1).fillna(0)
df["strategy_return"] = df["position"] * df["asset_return"]

cumulative_return = (1 + df["strategy_return"]).prod() - 1

이 코드는 교육용 최소 구조다. 실제 거래를 가정하려면 수수료, 매수·매도 가격, 체결 가능성, 배당과 세금 등 성과에 영향을 주는 조건을 별도로 정의해야 한다.

백테스팅은 성과 증명이 아니라 가정의 압력 시험이다

백테스팅은 과거 시장 조건에 전략 규칙을 적용해 수익성과 위험이 어떻게 나타났을지를 살펴보는 과정이다. 과거 데이터로 계산했다는 사실 때문에 결과는 가상적이며 미래 성과를 보장하지 않는다.

같은 데이터에서 이동평균 기간, RSI 기준과 보유 규칙을 수없이 바꾼 뒤 가장 좋은 조합만 선택하면 우연한 패턴까지 전략으로 착각하기 쉽다. 이를 데이터 스누핑 편향이라고 한다. 테스트 데이터까지 보며 규칙을 고친 뒤 그 데이터의 성과를 ‘미지의 결과’처럼 제시하는 것도 같은 문제다.

검증 항목잘못된 접근교정 기준
시간 순서전체 기간을 무작위로 섞음과거 구간으로 학습하고 이후 구간으로 평가
신호 적용오늘 종가 신호를 오늘 수익에 적용거래 가능 시점만큼 포지션을 지연
전략 선택같은 평가 구간에서 수백 조합 탐색규칙 선택 구간과 최종 평가 구간을 분리
비용빈번한 매매에도 비용을 0으로 둠가정한 수수료·슬리피지를 명시하고 차감
결론높은 과거 수익을 미래 보장으로 표현가정·기간·위험과 가상 결과임을 함께 제시

Prophet은 날짜와 목표값을 추세·계절성·휴일 효과로 설명한다

Prophet은 시계열의 비선형 추세에 연간·주간·일간 계절성과 휴일 효과를 더하는 가법 모형 기반 예측 절차다. 강의에서는 추세 변화, 결측값과 특이점에 비교적 강건한 프레임워크로 소개한다. Python 입력은 날짜 열 ds와 수치 목표 열 y를 사용한다.

2018년까지를 학습하고 이후 기간을 평가하는 최소 흐름은 다음과 같다. periods는 예측할 미래 행의 수이며 데이터 빈도와 일치시켜야 한다.

from prophet import Prophet

prophet_df = df.loc[:"2018", ["Close"]].reset_index()
prophet_df = prophet_df.rename(columns={"Date": "ds", "Close": "y"})

model = Prophet()
model.fit(prophet_df)
future = model.make_future_dataframe(periods=30, freq="B")
forecast = model.predict(future)

predicted = forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]]

예측값 yhat만 보지 말고 하한·상한과 실제 관측값을 함께 비교한다. 또한 미래 30행이 달력일인지 영업일인지 명시해야 예측 날짜의 의미가 달라지지 않는다.

GBRT는 앞선 나무의 잔차를 다음 나무가 보완한다

GBRT(Gradient Boosting Regression Trees)는 약한 회귀 나무를 순차적으로 더해 강한 예측 모델을 만드는 앙상블 기법이다. 앞선 모델이 남긴 오차를 다음 모델이 줄이는 방향으로 반복 학습하므로 비선형 관계를 표현할 수 있다.

시계열에 GBRT를 적용하려면 날짜 순서만 넣는 것이 아니라 과거 종가, 수익률, 이동평균과 같은 특성 변수를 설계한다. 그러나 목표가 다음 날 종가라면 어떤 특성도 다음 날 이후 정보를 포함해서는 안 된다. 전체 데이터로 이동평균을 계산하는 것은 뒤쪽 창이면 가능하지만, 전체 기간 평균으로 결측값을 채우거나 무작위 분할을 하면 미래 정보가 섞일 수 있다.

from sklearn.ensemble import GradientBoostingRegressor

features = df[["Close", "MA50", "MA200", "RSI"]].copy()
target = df["Close"].shift(-1).rename("next_close")
dataset = features.join(target).dropna()

split = int(len(dataset) * 0.8)
train = dataset.iloc[:split]
test = dataset.iloc[split:]

model = GradientBoostingRegressor(random_state=42)
model.fit(train.drop(columns="next_close"), train["next_close"])
prediction = model.predict(test.drop(columns="next_close"))

iloc으로 앞 80%를 학습, 뒤 20%를 평가하여 시간 순서를 보존한다. 다만 한 번의 분할만으로 안정성을 보장할 수 없으므로 여러 시점에서 앞으로 이동하며 평가하는 방식도 고려해야 한다.

Prophet과 GBRT는 질문과 입력 구조가 다르다

두 모델 중 하나가 언제나 더 우수한 것이 아니다. 설명하려는 패턴과 사용할 수 있는 입력 정보가 무엇인지에 따라 선택한다.

판단축ProphetGBRT
주요 입력날짜 ds와 목표값 y, 선택적 휴일설계한 여러 특성 변수와 목표값
핵심 구조추세·계절성·휴일 효과의 가법 구성잔차를 순차적으로 보완하는 회귀 나무 앙상블
적합한 질문시간 구성요소를 바탕으로 미래 수준 예측여러 입력과 목표의 비선형 관계 예측
주요 위험잘못된 빈도·계절성 설정, 구조 변화미래 특성 누출, 과적합, 시간 무작위 분할
공통 검증과거로 학습하고 이후 기간의 실제값과 비교하며 불확실성과 가정을 기록

선택 핵심: 날짜와 반복 구조 자체가 설명의 중심이면 Prophet이 자연스럽고, 시점마다 확보되는 여러 특성의 비선형 조합이 중심이면 GBRT를 검토한다. 어느 쪽이든 평가 시점 이후의 정보가 입력에 섞이지 않아야 한다.

S&P 500 실습은 모델 경쟁보다 검증 기록으로 완성한다

강의 프로젝트는 yfinance로 S&P 500 지수 데이터를 수집하고, 이동평균과 RSI를 계산해 신호·포지션을 만든 뒤 백테스트한다. 이어 Prophet으로 단기 예측을 수행하고, GBRT용 특성을 설계해 예측 기반 전략을 평가한다.

이 과정을 재현할 때는 다음 기록을 남기는 것이 좋다.

기록 항목확인 내용결과 해석에 필요한 이유
데이터 범위수집 시작·종료일, 빈도, 결측·중복성과가 특정 기간에만 의존하는지 판단
지표 설정MA 창 길이, RSI 기간과 기준선사후에 유리한 설정만 고른 것인지 검토
신호 실행진입·청산 조건, 지연, 초기 포지션미래 정보와 체결 가정을 분리
평가 설계학습·검증·테스트의 시간 경계보지 않은 미래 구간 성능인지 확인
성과 조건복리, 비용, 위험 지표, 기준 전략수익률 하나로 전략을 과장하지 않기 위해 필요

학습자가 직접 점검해 보자. 모델의 예측 오차가 작아졌는데 전략 수익률은 낮아졌다면 모순이 아니다. 가격 오차와 방향 판단은 다른 목표이고, 거래 비용과 신호 임계값이 전략 성과에 별도로 작용할 수 있다.

핵심 개념 정리

  • 시계열에서는 관측 순서와 정보 이용 가능 시점이 분석 조건의 일부다.
  • 추세·계절성·주기성·불규칙성은 방향, 반복 간격의 고정성, 설명 가능성으로 구분한다.
  • 이동평균은 창 길이에 따라 평활화와 반응 지연이 달라지고, RSI는 상승폭과 하락폭의 상대 강도를 요약한다.
  • 교차 신호는 이전과 현재 상태를 함께 비교하며, 종가 신호는 다음 거래 가능 시점의 포지션에 적용한다.
  • 백테스트는 가상 과거 실험이므로 비용·시간 분할·데이터 스누핑 편향을 함께 밝혀야 한다.
  • Prophet은 시간 구성요소를, GBRT는 설계된 특성의 비선형 관계를 활용하지만 둘 다 시간 순서 평가가 필요하다.

시계열 문제를 만나면 먼저 목표 시점을 쓰고, 그 직전까지 사용할 수 있는 정보만 표시한다. 다음으로 구성 특징을 구분하고 지표·특성을 계산한 뒤, 신호와 포지션 사이에 실제 실행 지연을 둔다. 마지막으로 과거와 미래 구간을 나누어 비용과 불확실성을 포함해 평가한다. 이 순서를 지켜야 높은 수익률이나 낮은 예측 오차를 ‘미래에도 재현될 증거’로 오해하지 않는다.

예상문제 10선

1. 시계열 데이터가 일반적인 표 데이터와 구별되는 핵심 성질은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 값의 크기는 시점마다 달라질 수 있으며 시계열의 정의 조건이 아니다.
  • ② 오답: 휴일 여부 같은 범주형 보조 변수를 함께 사용할 수 있다.
  • ③ 정답: 과거와 현재의 연결 때문에 행을 임의로 섞으면 정보 구조가 손상된다.
  • ④ 오답: 관측 누락은 실제 시계열에서도 발생하므로 별도 점검이 필요하다.

2. 계절성과 주기성을 구분하는 가장 중요한 기준은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 일·주·월·연처럼 정해진 반복 간격인지가 결정적 구분 기준이다.
  • ② 오답: 두 패턴 모두 상승과 하락을 포함할 수 있어 방향으로 구분하지 않는다.
  • ③ 오답: 두 개념은 시계열 변동의 형태이며 자료형으로 나누지 않는다.
  • ④ 오답: 주기성도 관측 가능한 장기 파동이며 다만 길이가 고정되지 않을 수 있다.

3. 종가가 10, 13, 16, 19일 때 마지막 시점의 3일 이동평균은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 처음 세 값의 평균을 마지막 시점에 재사용한 값으로 창 이동을 반영하지 않았다.
  • ② 오답: 네 관측치 전체 평균이며 3일 창보다 한 값을 더 포함했다.
  • ③ 오답: 최근 세 값의 합 48을 잘못 나눈 결과다.
  • ④ 정답: 마지막 세 값 13, 16, 19의 합 48을 3으로 나누면 16이다.

4. MA50이 5일 연속 MA200보다 높았을 때 매일을 새 골든 크로스로 기록한 코드의 문제는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 이동평균은 연속 수치인 가격을 창별로 평균내는 지표다.
  • ② 오답: 문제는 창 이름이 아니라 ‘위에 있음’과 ‘상향 돌파’의 차이다.
  • ③ 정답: 전일 관계와 당일 관계를 함께 비교해야 교차 시점 한 번만 찾을 수 있다.
  • ④ 오답: RSI는 별도 모멘텀 지표이며 이동평균 교차의 필수 입력이 아니다.

5. 오늘 종가로 계산한 매수 신호를 오늘 종가 수익률에 적용한 백테스트를 어떻게 고쳐야 하는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 미래 가격 추가는 정보 누출을 더 크게 만든다.
  • ② 정답: 종가 확인 뒤에 실행할 수 있으므로 다음 거래 가능 시점부터 성과를 계산해야 한다.
  • ③ 오답: 수익률 결합 방식은 미래 정보를 사용한 시점 오류를 교정하지 못한다.
  • ④ 오답: 무작위 혼합은 시간 의존성을 깨뜨려 검증을 더 왜곡한다.

6. 전략 수익률이 첫날 -10%, 둘째 날 +10%라면 복리 누적수익률은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: -10과 +10을 단순 합산하면 기준 금액이 달라진 복리 효과를 놓친다.
  • ② 오답: 두 배수를 더한 것이 아니라 곱해야 하며 양의 결과가 아니다.
  • ③ 오답: 둘째 날의 회복 효과를 전혀 반영하지 않은 값이다.
  • ④ 정답: 0.9 × 1.1 - 1 = -0.01이므로 누적수익률은 -1%다.

7. 데이터 스누핑 편향을 가장 잘 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 반복 탐색의 우연한 적합을 일반화 가능한 규칙으로 오인하는 편향이다.
  • ② 오답: 시간 정렬은 시계열 분석에 필요한 기본 전처리다.
  • ③ 오답: 초기 결측은 창을 채울 관측치가 부족해서 생기는 계산 특성이다.
  • ④ 오답: 휴일 효과 모델링은 Prophet의 구성 기능이며 반복 선택 편향과 다르다.

8. Prophet과 GBRT의 차이에 대한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 둘 다 수치 예측에 사용할 수 있으며 역할을 분류·시각화로 나누지 않는다.
  • ② 정답: 모델의 입력 구조와 패턴 표현 방식이 다르므로 질문에 맞춰 선택한다.
  • ③ 오답: 시계열에 적용한 GBRT도 미래 정보 누출을 막기 위해 시간 순서를 보존해야 한다.
  • ④ 오답: GBRT의 핵심은 여러 나무를 순차적으로 더해 앞선 오차를 보완하는 것이다.

9. 다음 날 종가를 예측하는 GBRT의 입력 특성으로 부적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 예측 시점에 오늘 종가까지 확인됐다면 뒤쪽 창 MA50은 사용 가능한 과거 정보다.
  • ② 오답: 오늘까지의 변화로 계산한 RSI는 시점 규칙을 지키는 입력 후보다.
  • ③ 정답: 목표인 다음 날 종가가 입력 계산에 들어가므로 미래 정보 누출이 발생한다.
  • ④ 오답: 두 값 모두 다음 날을 예측하기 전에 확인 가능한 정보다.

10. 높은 백테스트 수익률을 얻은 전략을 평가할 때 가장 타당한 다음 행동은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 성과 계산의 가정과 미래 정보 여부를 검토하고 보지 않은 구간에서 재평가해야 한다.
  • ② 오답: 과거·가상 성과는 시장 변화가 있는 미래 수익을 보장하지 않는다.
  • ③ 오답: 좋은 기간만 선택하면 전략의 위험과 변동을 의도적으로 숨기게 된다.
  • ④ 오답: 테스트 결과에 맞춰 규칙을 바꾸면 테스트 구간도 사실상 학습에 사용한 셈이다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 주가와 전략 예시는 시계열 분석 원리를 설명하기 위한 교육용이며 실제 투자 판단이나 수익 보장을 위한 정보가 아닙니다.

댓글