CUSUM 필터란? 금융 머신러닝의 이벤트 샘플링
대칭 CUSUM 필터가 누적 로그 수익률에서 이벤트 시점을 선택하는 원리와 임계값, 라벨링 및 회귀 안정성 검정과의 차이를 설명합니다.
이 글에서 다루는 내용누적 움직임이 충분할 때 이벤트를 선택합니다
짧은 요약
금융 CUSUM 필터는 가격 변화의 누적값이 정해 둔 경계를 넘을 때 이벤트 시점을 고릅니다. 매 봉을 모두 관찰하는 대신 일부 시작 시점을 뽑는 규칙이지만, 이후 가격 방향을 예측하거나 이벤트의 미래 라벨을 정하거나 표본의 독립성을 보장하지는 않습니다.
누적 움직임이 충분할 때 이벤트를 선택합니다
매 봉마다 하나씩 관측치를 만들면 가격 변화가 거의 없는 구간에도 행이 계속 쌓입니다. CUSUM 필터는 다른 기준으로 이벤트 시점을 고릅니다. 위쪽과 아래쪽 가격 변화를 따로 누적하고, 한쪽 누적값이 임계값을 넘을 때 이벤트를 표시합니다. 따라서 결과는 일정한 시간 간격의 관측치가 아니라 불규칙한 타임스탬프입니다.
CUSUM이라는 이름은 목표값에서 지속적으로 벗어나는 움직임을 감시하는 누적합 품질관리 절차에서 왔습니다. E. S. Page의 1954년 연속 검사 계획 논문이 초기 토대 중 하나입니다. 금융 머신러닝에서는 *Advances in Financial Machine Learning* 2장이 시장 자료에서 이벤트를 샘플링하는 방법으로 대칭 CUSUM 필터를 소개합니다. Mlfin.py의 필터링 안내서도 위쪽 또는 아래쪽 움직임의 누적값을 사용해 이벤트 시점을 고르는 원리를 설명합니다.
여기서 다루는 금융용 변형은 이벤트 선택 규칙입니다. 회귀모형의 계수 안정성을 검정하는 통계적 CUSUM 검정과는 다릅니다. 후자는 검정 통계량과 기준 분포를 이용해 모수 안정성 가설을 평가합니다. 즉, 가격 관측 중 어느 시점을 이벤트 시작점으로 삼을지가 아니라, 회귀계수가 안정적이라는 가정이 자료에 부합하는지를 묻습니다. 그 별도 절차는 CUSUM 회귀 안정성 검정 안내서를 참고하세요.
양수와 음수 로그 수익률을 따로 누적합니다
Pₜ를 0보다 큰 종가, rₜ를 로그 수익률 ln(Pₜ/Pₜ₋₁)이라고 하겠습니다. 두 누적값을 0에서 시작하면 다음처럼 정의할 수 있습니다.
S⁺ₜ = max(0, S⁺ₜ₋₁ + rₜ)
S⁻ₜ = min(0, S⁻ₜ₋₁ + rₜ)
양의 누적값은 끊기지 않은 상승 구간을, 음의 누적값은 하락 구간을 모읍니다. 대칭 필터는 S⁺ₜ > hₜ 또는 S⁻ₜ < −hₜ일 때 이벤트를 발생시킵니다. 이 글에서는 임계값을 넘은 누적값을 0으로 초기화한 뒤 이후 관측부터 다시 누적합니다. 고정 임계값 h는 일정한 누적 로그 수익률 폭을 요구하고, 동적 임계값 hₜ는 최근 변동성 같은 척도에 맞출 수 있습니다.
정확히 임계값과 같은 경우는 구현마다 다를 수 있습니다. Mlfin.py 안내 문구는 임계값 이상을 이벤트로 설명하지만 현재 구현 코드는 엄격한 부등호(>와 <)를 사용합니다. 이 글은 코드의 엄격한 초과 기준을 따릅니다. 누적값이 정확히 h와 같으면 다음 관측에서 더 넘기 전까지 이벤트를 내지 않습니다. 다른 연구자가 시점을 재현할 수 있도록 비교 연산과 초기화 규칙을 함께 기록해야 합니다.
이 규칙은 표본 전체의 로그 수익률을 계속 더하는 하나의 순누적합과도 다릅니다. 위쪽 누적값은 반대 방향 수익률이 들어오면 0 쪽으로 줄고, 아래쪽 누적값도 반대 방향 움직임에 의해 0 쪽으로 줄어듭니다. 어느 쪽도 0을 넘어 반대 부호로 이동하지 않습니다. 예를 들어 작은 상승이 이어져 위쪽 누적값이 0.003이 된 뒤 −0.002의 수익률이 오면, 그 위쪽 값은 0.001로 줄고 아래쪽 값에는 −0.002가 쌓입니다. 입력의 부호, 누적 상태, 임계값 비교, 초기화 시점을 순서대로 확인하면 단순히 누적 절대값을 계산한 다른 규칙과 혼동하지 않을 수 있습니다.
가상의 가격 경로를 계산합니다
종가가 $100.00 → $100.20 → $100.40 → $100.60 → $100.40 → $100.20 → $100.00으로 움직였다고 가정하겠습니다. 고정 로그 수익률 임계값을 h = 0.005, 즉 0.5%로 둡니다. 첫 세 번의 로그 수익률을 합하면 ln(100.60/100.00) = 0.005982, 약 0.598%입니다. 따라서 양의 누적값은 $100.60 종가에서 h를 넘고 이벤트 타임스탬프를 냅니다.
이 시점에 양의 누적값을 0으로 초기화합니다. 이후 세 번의 하락은 ln(100.00/100.60) = −0.005982, 약 −0.598%로 누적되므로 $100.00 종가에서 음의 누적값이 −h를 넘습니다. 각 봉의 움직임은 0.5%보다 작지만 같은 방향의 변화가 쌓여 두 이벤트가 발생합니다. 이 숫자는 계산을 설명하기 위해 만든 예시로, 실제 시장 자료나 체결 가능 가격, 수익성 신호가 아닙니다.
이벤트 시점이 발생했다는 것은 규칙이 발동했다는 뜻입니다. 해당 종가에 실제 주문을 낼 수 있었다는 의미는 아닙니다. 종가가 확정되어야 필터가 작동한다면 그 이벤트는 봉이 끝난 뒤에야 알 수 있습니다. 그 종가에서 즉시 진입했다고 가정하는 백테스트는 실제로 그 체결을 지원할 실행 규칙이 필요합니다. 그렇지 않다면 다음 이용 가능한 호가나 봉부터 결정과 진입을 정렬하고 스프레드, 수수료, 슬리피지, 시장 충격을 반영해야 합니다.
임계값을 자료에 맞는 단위로 정합니다
고정 h는 재현하기 쉽지만 일정한 움직임 크기를 요구합니다. 같은 0.5%도 시장이 조용할 때는 도달하기 어렵고 변동성이 커지면 쉽게 도달할 수 있습니다. 최근 변동성에 맞춘 임계값은 hₜ = kσₜ처럼 정의할 수 있습니다. 이때 σₜ는 현재 비교하는 수익률이 발생하기 전에 알 수 있는 자료로 계산해야 합니다. 이런 방법은 미리 지정한 규모에 따라 경계를 조정할 뿐, 이벤트 수를 같게 만들거나 위험을 동일하게 보장하지 않습니다.
임계값은 자산과 봉 간격마다 따로 판단할 연구 설계입니다. 너무 낮으면 서로 가까운 이벤트가 많아지고 미시구조 잡음이 남을 수 있습니다. 너무 높으면 긴 공백이 생기고 유용한 관측이 누락될 수 있습니다. 기간·자산·시장 국면별 이벤트 수와 이벤트 사이 시간을 비교하세요. 최종 평가 구간 결과가 좋아 보이도록 고르는 대신 학습 구간 안에서 값을 선택하고, 검증 기간에는 고정해 두어야 합니다.
변동성 조정값도 어떤 표본으로 계산했는지 밝혀야 합니다. 예를 들어 직전 20개 수익률에서 계산한 표준편차가 0.004이고 사전에 정한 배수 k가 1.5라면 다음 관측에 쓸 임계값은 0.006입니다. 여기서 현재 수익률까지 포함해 σ를 계산하면 그 움직임이 임계값을 바꾸므로 정보 시점이 달라집니다. 이런 작은 시점 차이가 이벤트 발생 시각을 옮길 수 있습니다. 또 h=0.005는 로그 수익률 단위의 값입니다. 가격 배수로 바꾸면 위쪽 변화는 exp(0.005)−1, 약 0.5013%이고 아래쪽은 exp(−0.005)−1, 약 −0.4988%입니다. “0.5%”라고 요약하더라도 계산에는 선택한 로그 또는 단순 수익률 단위를 일관되게 써야 합니다.
수익률 변환도 중요합니다. 로그 수익률은 Pₜ > 0일 때만 정의됩니다. 원자재 선물처럼 가격이 0이나 음수가 된 적이 있는 시장에는 로그를 적용할 수 없습니다. 그런 자료에서는 사전에 정한 산술 가격 차이나 정당화된 다른 변환을 사용하고, 임계값 단위를 그 기준에 맞춰야 합니다. 로그를 취하는 구현에 0 이하의 가격을 전달하면 안 됩니다. 조정 종가, 선물 롤, 누락된 봉, 잘못 기록된 체결가도 확인하세요. 데이터 오류가 누적 움직임처럼 보이면 거짓 이벤트를 만들 수 있습니다.
이벤트 샘플링과 봉·특징·라벨은 별개입니다
시간 봉은 시계에 맞춰 만들어집니다. 거래대금 봉이나 거래량 봉은 정해 둔 거래 활동량에 도달할 때 끝납니다. CUSUM 필터는 누적 가격 변화가 경계를 넘을 때 관측 시점을 표시하므로 불규칙하며 동일한 거래량·위험·독립 표본을 뜻하지 않습니다. Mlfin.py 필터링 안내서는 이벤트를 나중에 샘플링할 타임스탬프로 설명합니다.
따라서 표본 방식은 모델이 보는 시장 국면의 비중도 바꿉니다. 예를 들어 일정한 15분 봉은 조용한 시간과 급격한 움직임이 이어지는 시간에 모두 같은 시계 기준으로 관측치를 만들지만, 고정된 CUSUM 임계값은 움직임이 몰린 구간에서 이벤트를 더 자주 기록할 수 있습니다. 거래량 봉은 같은 주식 수가 거래된 시점을, 거래대금 봉은 같은 명목 금액이 누적된 시점을 기준으로 삼습니다. 세 방식은 서로 다른 시간 구간, 거래 활동, 가격 변동을 표본에 남기므로 어떤 방법의 행 수가 더 많다는 이유만으로 더 많은 독립 정보가 있다고 말할 수 없습니다. 표본마다 레짐별 비중과 이벤트 간격을 따로 살펴야 합니다.
작업 순서를 분리하세요. 입력 시계열과 인과적으로 계산한 임계값을 정하고, 이벤트 시작점을 고른 뒤, 시작 시점까지 알 수 있는 정보만으로 특징을 구성하고, 마지막으로 미래 결과를 정의합니다. 트리플 배리어 이벤트 라벨링 안내서는 미래 결과를 정하는 한 가지 방법을 설명합니다. CUSUM 이벤트 자체는 +1 또는 −1 라벨이 아니며, 상승 경계를 넘었다고 매수 신호가 되는 것도 아닙니다. 미래 라벨 구간이 서로 겹친다면 검증 때 공유 결과를 따로 고려해야 합니다.
시간 순서에 따른 검증도 필요합니다. 이벤트 행을 무작위로 섞으면 가까운 시점이나 같은 미래 구간을 공유하는 관측치가 학습과 검증 양쪽에 나뉠 수 있습니다. 날짜 순서대로 구간을 나누고, 라벨의 미래 관측 기간이 겹치는 사례는 분할 경계에서 제거하거나 별도 간격을 두는 방법을 고려하세요. CUSUM이 이벤트 수를 줄였다는 이유만으로 시계열 누수나 상관 문제가 사라지지는 않습니다.
Mlfin.py 문서에는 로그 변화가 해석 가능한 다른 양의 시계열, 예를 들어 변동성에도 적용할 수 있다고 나옵니다. 그렇다고 모든 변환이 타당한 것은 아닙니다. 측정 대상, 단위, 임계값 척도, 업데이트 시점, 초기화 방식, 누락값·0 이하의 값 처리법을 밝혀야 이벤트를 재현할 수 있습니다.
봉 안의 가격 경로를 사용하는지도 별도로 고정해야 합니다. 종가만 입력하면 장중 고가가 위쪽 경계를 잠시 넘었다가 종가 전에 되돌아왔더라도 그 봉의 종가 규칙은 이벤트를 기록하지 않습니다. 반대로 고가·저가로 경계 통과를 잡으려면 한 봉 안에서 위아래 경계가 모두 닿았을 때 어느 쪽이 먼저였는지 알 수 있는 더 세밀한 시세나 명시적인 판정 규칙이 필요합니다. 종가 규칙과 장중 규칙을 섞어 쓰면 이벤트 시점과 이용 가능한 정보가 달라집니다. 누락된 봉을 직전 종가로 채우는지, 결측 구간을 건너뛰는지, 중복 타임스탬프를 어떻게 처리하는지도 함께 정하세요. 그래야 원자료가 조금 달라도 같은 이벤트 목록을 다시 만들 수 있습니다.
필터가 표본을 어떻게 바꾸는지 평가합니다
필터가 표본을 개선한다고 보기 전에 이벤트 개수, 발생 시점, 시간 간격, 어떤 시장 국면이 표본을 차지하는지 보고하세요. 이벤트로 뽑힌 특징과 이후 라벨 분포를 적절한 기준 샘플링 방식과 비교할 수 있습니다. 임계값·변환·자산·기간을 반복해서 바꿔 보면 필터도 모형 선택 과정에 포함됩니다. 필터가 인과적이더라도 최종 백테스트 결과를 부풀릴 수 있습니다.
보고할 때는 총 이벤트 수 하나로 충분하다고 가정하지 마세요. 월별 또는 변동성 국면별 발생 건수, 이벤트 간격의 중앙값과 긴 공백, 시작 시점에 이용 가능한 입력 자료, 선택한 임계값과 리셋 규칙을 함께 제시하면 표본이 어느 시기에 집중되었는지 드러납니다. 여러 h를 비교한다면 각 값을 학습 구간에서 선택했는지, 아니면 민감도 분석용으로만 나란히 제시했는지도 구분하세요. 이벤트가 더 적거나 가격 변동이 큰 구간에 몰렸다는 사실만으로 미래 예측 성능이 좋아졌다고 결론 내릴 수는 없습니다.
상태 초기화와 세션 경계를 고정합니다
누적값은 이전 관측 상태에 의존하므로 표본을 어디서 시작하는지와 거래 세션 경계를 어떻게 다루는지가 결과에 영향을 줍니다. 처음부터 0으로 시작할지, 앞선 자료로 상태를 워밍업할지, 야간 가격 변화를 다음 세션에 포함할지를 명시하세요. 매일 장 시작에 두 누적값을 초기화하면 밤사이 움직임은 전날과 연결되지 않습니다. 세션을 넘어 누적하면 가격 갭이 다음 이벤트에 반영될 수 있습니다. 둘 중 하나가 모든 시장에 맞는 답은 아니지만, 백테스트와 실제 적용에서 같은 규칙을 써야 비교가 가능합니다.
실시간 처리와 과거 재현에서도 누적 상태, 임계값 버전, 마지막으로 처리한 관측 시각을 저장하면 이벤트 누락이나 중복을 찾기 쉽습니다. 자료가 늦게 도착하거나 과거 가격이 수정되었을 때 전체 이벤트가 과거와 달라질 수 있으므로 입력 데이터의 확정 시점도 기록하세요. 이 관리 정보가 이벤트 규칙 자체를 더 예측력 있게 만드는 것은 아니며, 결과 목록을 재현하고 감사하는 데 필요합니다.
CUSUM은 지속적인 움직임에 분석을 집중할 수 있지만 정상성, 독립성, 예측력이나 수익성을 보장하지는 않습니다. 이벤트 표본을 학습에 사용하더라도 연구 질문에 맞는 목표값, 시간 순서를 고려한 검증, 현실적인 비용과 체결 가정을 갖춰야 합니다. 필터를 매매 가능성의 증거가 아니라 연구 파이프라인의 한 가지 명시적 샘플링 결정으로 취급하세요.
자주 묻는 질문
Q1CUSUM 필터가 매수나 매도 시점을 알려주나요?
아닙니다. 누적 변화가 규칙을 넘은 시점을 찾을 뿐입니다. 방향 예측, 포지션 선택, 체결, 미래 결과 라벨은 서로 다른 문제입니다.
Q2CUSUM 필터는 CUSUM 회귀 안정성 검정과 같은가요?
아닙니다. 금융 필터는 시계열에서 이벤트 시점을 고릅니다. 회귀 안정성 검정은 모수가 안정적인지 통계적 가설을 평가합니다.
Q3가격이 0이나 음수가 될 수 있는 선물에 로그 수익률 CUSUM을 쓸 수 있나요?
그대로는 사용할 수 없습니다. 로그는 0 이하에서 정의되지 않습니다. 적절한 대체 변화량을 정하고 그 단위로 임계값을 표시하세요.
출처와 더 읽을 자료
내용 정정 제보
이 아티클 링크를 담은 이메일 초안을 준비합니다. 직접 보내야 Mark에 제보가 접수됩니다
QUICK CHECK
글을 다 읽었다면, 3문항으로 확인해보세요
Question 01
금융 CUSUM 필터가 주로 반환하는 것은 무엇인가요?
정답을 고르면 바로 설명을 볼 수 있어요
옵션 용어 사전
콜·풋과 옵션 체인부터 IV, 그릭스, 미결제약정, 맥스 페인까지 핵심 옵션 용어를 정확하게 설명합니다
옵션 용어 사전 보기