PostgreSQL에서 LAG() 함수는 시계열 데이터 분석이나 백테스트 전략에서 전일 혹은 이전 시점의 데이터를 가져올 때 매우 유용한 함수입니다.
이 글에서는 LAG() 함수의 개념부터 실전 예제까지 단계별로 소개합니다.
LAG 함수란?
LAG(expr, offset, default)는 윈도우 함수 중 하나로,
현재 행보다 N행 이전의 값을 가져오는 함수입니다.
기본 문법:
LAG(컬럼명 [, 간격] [, 기본값]) OVER (PARTITION BY ... ORDER BY ...)
- 컬럼명: 이전 값을 가져올 대상 컬럼
- 간격: 몇 행 이전 값을 가져올지 (기본: 1)
- 기본값: 이전 값이 없을 경우 사용할 기본값 (생략 가능)
- PARTITION BY: 그룹 기준 (예: 종목별)
- ORDER BY: 시계열 정렬 기준 (예: 날짜 오름차순)
실전 예제
SELECT
stock_code,
stock_date,
close_price,
LAG(close_price) OVER (PARTITION BY stock_code ORDER BY stock_date) AS prev_close,
(close_price - LAG(close_price) OVER (PARTITION BY stock_code ORDER BY stock_date)) /
LAG(close_price) OVER (PARTITION BY stock_code ORDER BY stock_date) AS daily_return
FROM stock.stock_daily;
- LAG(close_price) → 전일 종가
- 이를 이용해 daily_return 계산
왜 중요한가?
용도설명
| 수익률 계산 | 전일 종가와 오늘 종가 비교 |
| 변동성 분석 | 이동 평균 대비 변화율 |
| 시계열 모델 | 과거 값 기반의 전략 수립 |
| 머신러닝 피처 | lag_1, lag_5, lag_20 형태로 활용 |
⚠️ 주의사항
- ORDER BY가 없으면 LAG는 무의미합니다.
- 첫 행은 이전 값이 없기 때문에 NULL이 반환됩니다.
- 여러 번 LAG() 호출 시 계산 비용이 증가하므로 필요한 값만 최소 호출이 좋습니다.
정리
LAG() 함수는 단순해 보이지만, 시계열 데이터에서는 필수적인 기능입니다.
특히 금융 백테스트, 시계열 예측, 전략 리포트를 구성할 때 매우 강력한 도구가 되니 꼭 익혀두시기 바랍니다.
이 글이 도움이 되셨다면, PostgreSQL 윈도우 함수 시리즈의 다른 글도 확인해보세요!