트리플 배리어 방법: 금융 이벤트 라벨링과 첫 도달 규칙
상단·하단·시간 배리어가 금융 이벤트 라벨을 어떻게 결정하는지, 변동성 목표를 경계에 반영하는 법과 데이터·검증에서 생기는 함정을 설명합니다.
이 글에서 다루는 내용고정 기간 수익률과 다른 질문에 답합니다
짧은 요약
트리플 배리어 방법은 이벤트가 시작된 뒤 가격이 상단 수익 경계, 하단 손실 경계, 또는 최대 보유시간 중 어디에 먼저 닿는지를 이용해 학습용 결과 라벨을 정합니다. 이는 지도학습의 목표값을 정의하는 방법이지 매매 전략 자체가 아닙니다. 변동성 목표, 관찰 가격, 만료 시 라벨, 비용 처리 규칙을 먼저 고정해야 모델 점수를 해석할 수 있습니다.
고정 기간 수익률과 다른 질문에 답합니다
고정 기간 라벨은 정해 둔 시점의 수익률을 묻습니다. 예를 들어 매일 가격을 관찰하고 닷새 뒤 수익률이 양수인지 음수인지 분류할 수 있습니다. 이해하기 쉽지만 동일한 닷새라도 어떤 이벤트는 첫날 의미 있는 상승이나 하락을 이미 보였고, 다른 이벤트는 닷새째에도 별다른 움직임 없이 남아 있을 수 있습니다. 종료 시점 하나만 보면 그 전에 중요한 가격 경계를 통과했는지도 알 수 없습니다.
트리플 배리어는 선택한 이벤트마다 가격 경계 두 개와 시간 경계 하나를 둡니다. 가격이 세 경계 중 처음 도달한 곳에서 관찰을 끝내므로 이벤트별 라벨 구간은 길이가 서로 다를 수 있습니다. 급격히 움직인 가격은 몇 개 봉 안에 라벨이 정해지고, 조용한 경로는 수직 배리어가 올 때까지 유지됩니다. López de Prado의 *Advances in Financial Machine Learning* 3장 라벨링 설명은 동적 임계값과 메타 라벨링을 함께 다루며, Mlfin.py 안내서는 상단·하단·수직 경계와 변동성에 따라 조정하는 수평 경계를 설명합니다.
이 방법이 바꾸는 것은 목표값 y의 정의입니다. 라벨은 선택한 가격 경로와 규칙을 적용했을 때 관찰된 결과를 기록합니다. 표시된 경계에서 실제 주문이 체결될 수 있었다거나, 다른 기간에도 같은 결과 분포가 유지된다거나, 이 규칙만으로 수익성 있는 진입점을 찾았다는 뜻은 아닙니다.
이벤트 시작 시점과 이용 가능한 정보를 정합니다
이벤트는 결정 시점 t₀와 기준 가격 P₀에서 시작합니다. 먼저 이벤트를 언제 만들지 정하는 이벤트 필터가 있고, 그 다음에 각 이벤트의 이후 가격 경로를 분류하는 배리어 라벨링이 있습니다. 예를 들어 CUSUM 필터는 누적 가격 변화가 기준을 넘은 시점을 이벤트 시작으로 골라낼 수 있습니다. CUSUM은 이벤트 발생 시점을 선택할 뿐, 뒤이어 어느 배리어가 먼저 도달할지는 결정하지 않습니다.
각 이벤트에는 t₀에 이미 계산할 수 있는 목표 변동성 σᵢ 또는 다른 움직임 크기 척도를 연결합니다. σᵢ가 단순 수익률의 비율 단위라면 0.02는 2%입니다. 이 값은 이벤트가 시작된 뒤의 가격을 사용해 계산해서는 안 됩니다. 전체 표본으로 계산한 변동성이나 미래 구간을 포함한 중심 이동창으로 σᵢ를 산출하면 라벨식이 정확해도 미래 정보가 목표 경계에 섞입니다.
목표값이 단순 수익률인지 로그 수익률인지도 먼저 정해야 합니다. 단순 수익률 예시에서 P₀가 100이고 경계가 +4%이면 상단 가격은 104입니다. 로그 수익률로 +4%를 정의하면 가격은 100×exp(0.04)가 되므로 단순 수익률 경계와 값이 조금 다릅니다. 계산 중간에 두 기준을 섞지 말고, 데이터 문서와 코드에서 동일한 정의를 사용해야 합니다.
세 경계의 폭과 만료 규칙을 기록합니다
이벤트별 목표 척도를 σᵢ, 수익 경계 배수를 mPT, 손실 경계 배수를 mSL이라고 하겠습니다. 단순 수익률을 사용하면 상단 경계는 +mPT×σᵢ이고 하단 경계는 −mSL×σᵢ입니다. 가격 수준으로 바꾸면 각각 P₀×(1+mPTσᵢ)와 P₀×(1−mSLσᵢ)입니다. 이는 단순 수익률을 가격으로 환산한 식입니다. 로그 수익률을 택했다면 로그 경계에 exp를 적용해 가격 경계를 구해야 합니다.
수직 배리어는 최대 보유 시간이나 만료 시각 t₁입니다. 그때까지 두 수평 경계 어느 쪽도 닿지 않으면 관찰이 끝납니다. 이벤트를 다시 구성할 수 있도록 시작 시각, σᵢ, 두 배수, 수직 배리어 시각, 실제 종료 시각, 종료 수익률, 라벨을 함께 보관하는 편이 좋습니다. 배수와 보유시간은 보편적인 정답이 아닙니다. 좁은 수익 경계는 유리한 방향의 작은 움직임에서도 빨리 끝나는 이벤트를 늘리고, 더 넓은 손실 경계는 하단에 닿기 전까지 더 오래 가격을 관찰하게 만듭니다.
이 글에서 사용하는 기본 방향 라벨 규칙은 상단 경계가 먼저면 +1, 하단 경계가 먼저면 −1, 둘 다 닿지 않은 채 수직 배리어에 도달하면 0입니다. Mlfin.py 문서도 이 세 클래스 규칙을 설명하고, 현재 구현 코드에는 수직 경계가 먼저 도달했을 때 0을 반환하는 코드가 있습니다. 일부 구현이나 연구에서는 만료 시점 수익률의 부호를 라벨로 쓰기도 합니다. 같은 가격 경로라도 결과가 달라질 수 있으므로 만료 규칙을 사전에 선언하고 설명, 학습 데이터, 평가에서 일관되게 적용해야 합니다.
가상의 가격 경로 세 개로 계산합니다
이벤트 시작 가격을 P₀=$100, 시작 시점에 계산한 목표 척도를 σᵢ=2%라고 하겠습니다. 수익 배수 mPT=2, 손실 배수 mSL=1.5를 선택합니다. 단순 수익률 기준의 상단 가격은 $100×(1+2×0.02)=$104이고, 하단 가격은 $100×(1−1.5×0.02)=$97입니다. 수직 배리어는 세 번째 미래 봉 뒤에 둡니다.
| 이후 가격 경로 | 먼저 닿은 경계 | 이 글의 규칙에 따른 라벨 |
|---|---|---|
| 첫 번째 미래 봉에서 $100 → $104.50 | 만료 전에 상단 경계 | +1 |
| 첫 번째 미래 봉에서 $100 → $96.50 | 만료 전에 하단 경계 | −1 |
| $100 → $101 → $102 → 세 번째 봉에서 $101.50 | 수평 경계 없이 수직 만료 | 0 |
수직 배리어는 세 번째 미래 봉의 끝에서 도달합니다. 앞의 두 경로는 첫 번째 미래 봉에서 수평 경계를 넘으므로 만료 시각과 경계 도달 시각이 겹치지 않습니다. 마지막 경로는 시작 가격보다 $1.50 높은 곳에서 끝나지만, 두 수평 경계에 먼저 닿지 않았으므로 여기서는 0입니다. 계산 실수가 아니라 “정해 둔 보유시간 안에 어느 쪽 경계도 넘지 못했다”는 결과를 기록하기 때문입니다. 만료 수익률의 부호를 이용하는 다른 규칙이라면 이 이벤트는 양수로 표시될 수 있습니다. 예시는 규칙 설명을 위해 만든 숫자일 뿐 실제 시장 관측치나 예상 수익률이 아닙니다.
라벨은 경계 가격에 체결된 결과와 같지 않습니다. 다음 관측 가격이 $100에서 곧장 $105로 뛰었다면 데이터는 상단 경계를 넘었다고 기록할 수 있지만, 실제 주문이 $104에 체결됐다고 단정할 수 없습니다. 가격 공백, 호가 스프레드, 대기 순서, 시장 충격이 체결가를 바꿀 수 있습니다. +1은 지정한 데이터와 판정 규칙에서 상단 경계가 먼저 넘어갔다는 의미이지, 정확히 4%의 매매 수익을 확보했다는 뜻이 아닙니다.

가격 자료로 첫 도달 순서를 판정합니다
종가만 쓰면 봉 안에서 발생한 경계 돌파를 놓칠 수 있습니다. 예를 들어 장중 고가가 104를 넘었지만 종가가 103으로 마감했다면 종가 기준 검색은 상단 도달을 확인하지 못합니다. 고가와 저가를 함께 읽으면 장중 터치는 더 잘 포착할 수 있지만, 한 봉의 고가가 수익 경계를 넘고 저가가 손실 경계 아래로 내려갔다면 어느 쪽이 먼저였는지는 OHLC 값만으로 알 수 없습니다.
시가·고가·저가·종가만으로 기록된 순서를 복원할 방법은 없습니다. 가능하면 더 촘촘한 시간의 체결가나 호가 데이터를 사용해야 합니다. 그런 자료가 없으면 결과를 확인하기 전에 보수적이고 결정적인 우선순위 규칙을 정하고 모든 이벤트에 똑같이 적용한 뒤, 그 규칙이 영향을 미친 이벤트 수를 함께 보고합니다. 결과를 확인한 다음 전략에 유리한 경계 순서를 고르면 라벨이 사후 선택에 오염됩니다.
세션 경계, 누락 봉, 가격 점프에도 같은 원칙이 필요합니다. P₀가 실제 체결 가능한 시가인지, 결정 전에 알 수 있었던 종가인지 정하고, 장 마감 직전 시작한 이벤트의 수직 만료 시각을 어떻게 정할지 문서화합니다. 관측값이 빠진 경우, 시가가 경계를 뛰어넘은 경우, 만료 시각에 정확히 일치하는 봉이 없는 경우도 규칙에 포함합니다. 데이터 공급자와 자산별 세션 정의가 다르면 겉보기에 같은 배리어 설정도 서로 다른 라벨을 만들 수 있습니다.
방향 라벨과 메타 라벨의 역할을 구분합니다
사전에 방향 신호가 없는 기본 분류에서는 +1, −1, 0을 상단 도달, 하단 도달, 시간 만료로 해석할 수 있습니다. 모델은 이렇게 정의한 이벤트 결과를 구분하도록 학습됩니다. 세 클래스의 비중은 이벤트 필터, 배리어 배수, 가격 해상도, 대상 시장과 분석 기간에 따라 달라집니다. 따라서 학습 전에 라벨별 이벤트 수와 수익률 분포를 확인하는 것이 좋습니다.
메타 라벨링은 별도 질문에 답합니다. 먼저 1차 모델이나 다른 규칙이 롱 또는 숏 방향을 제안하고, 2차 모델은 그 방향을 채택할지 또는 규모를 얼마나 둘지 판단합니다. 이때 평가할 결과는 제안한 방향을 반영해야 합니다. 시장 가격이 상승했다는 이유만으로 숏 신호가 올바른 것은 아닙니다. 보통의 이진 채택/기각 설정에서는 방향을 반영한 결과가 유리할 때 1, 거래를 건너뛸 때 0 같은 라벨을 사용할 수 있지만, 시간 만료와 비용을 어떻게 취급할지는 별도로 정해야 합니다. López de Prado의 3장은 방향과 포지션 크기를 학습하는 문제를 초기 방향 라벨링과 구별합니다.
기본 방향 라벨의 +1·−1·0과 메타 라벨의 이진 값은 같은 예측 과제가 아닙니다. 1차 방향, 2차 채택 결정, 방향을 반영한 수익률, 실제 이벤트 종료 시각, 최종 포지션 규모를 데이터에서 구분해 보관해야 합니다. 라벨이 수수료 전 가격 움직임만 반영한다면 스프레드, 수수료, 시장 충격, 대차 비용, 펀딩처럼 적용되는 비용은 결과 해석에서 별도로 반영해야 합니다.
미래 정보와 겹치는 결과 구간을 차단합니다
각 이벤트의 특성값은 t₀에서 알 수 있었던 정보만으로 구성합니다. 여기에는 σᵢ, 정규화 기준, 이벤트 필터의 입력, 1차 방향 신호가 포함될 수 있습니다. 전체 구간으로 정규화하거나 미래 관측까지 포함하는 중심 이동창을 사용하면 라벨이 정교해 보여도 설명 변수에 미래 정보가 새어 들어갑니다. 이후의 가격 경로는 목표값 y를 만드는 데만 사용하고 예측 시점의 입력 특성으로 넣지 않아야 합니다.
이벤트 결과 구간은 서로 겹칠 수 있습니다. 첫 이벤트가 아직 배리어에 도달하지 않았는데 두 번째 이벤트가 시작되면 두 라벨은 같은 미래 봉을 공유할 수 있습니다. 한 이벤트를 학습에 넣고 다른 이벤트를 검증에 넣으면 검증 결과의 일부가 학습 라벨에서 이미 사용한 가격 구간과 연결됩니다. 각 이벤트의 시작 시각과 실제 종료 시각을 기록하고, 검증 라벨 구간과 겹치는 학습 이벤트를 제거하는 퍼지 규칙을 적용해야 합니다.
퍼지드 교차검증과 엠바고는 이 구간 중첩 문제를 다루고, 백테스트 과최적화 확률은 여러 시도에서 우연히 좋은 결과를 골라내는 별도 위험을 설명합니다. 다만 퍼지 처리가 모든 검증을 과거에서 미래로 이어지는 실전 재현으로 바꾸지는 않습니다. Purged K-fold는 검증 블록 뒤의 관측치를 학습에 포함할 수 있습니다. 과거 시점에 실제로 배포했다면 어떤 결과가 가능했을지 질문한다면 시계열 순서를 지키고 전처리와 하이퍼파라미터 선택도 학습 구간 안에서 수행해야 합니다.
라벨을 연구 선택으로 평가하고 재현성을 남깁니다
변동성 조정 경계와 서로 다른 이벤트 기간은 목표 정의를 구체화하지만, 표본을 대표성 있게 만들거나 예측을 쉽게 해 주지는 않습니다. mPT, mSL, σᵢ 추정법, 수직 보유기간, 이벤트 필터, 봉 주기, 만료 규칙 중 하나만 바꿔도 이벤트의 종료 방식과 클래스 의미가 달라집니다. 라벨 정의가 서로 다른 모델의 정확도를 설명 없이 비교하면 모델 성능이 아니라 목표값 차이를 비교할 수 있습니다.
분류 점수를 보기 전에 클래스 비중, 이벤트 지속시간, 종료 시점 수익률, 비용, 기간별·자산별 결과를 함께 살펴봅니다. OHLC 봉 하나에서 두 수평 경계가 동시에 범위 안에 들어오는 비율, 경계를 건너뛰는 가격 점프의 비율, 누락 관측이 종료 시각에 미치는 영향도 확인합니다. 이 라벨을 이용해 실제 포지션을 만든다고 가정한다면 결정 시점에 이용할 수 있었던 체결과 호가, 스프레드, 수수료, 펀딩 또는 대차 비용, 시장 충격의 가정을 반영해야 합니다.
설정에 민감한 결과도 따로 살펴봅니다. 예를 들어 보유시간만 짧게 바꿨을 때 0 라벨의 비율이 급증하는지, 목표 변동성의 관측 기간을 바꿨을 때 상·하단 라벨 비중이 함께 달라지는지 비교할 수 있습니다. 경계 배수를 여러 개 시도했다면 가장 점수가 높은 조합만 골라 최종 결과로 보고하지 말고, 어떤 조합을 어떤 학습 절차에서 비교했는지 기록합니다. 그렇지 않으면 배리어 설정 선택도 모델 선택과 똑같이 백테스트 과최적화의 일부가 됩니다.
평가 지표의 분모도 분명히 해야 합니다. 이벤트 정확도는 각 이벤트 하나를 한 건으로 세지만, 이벤트 길이가 달라지면 같은 이벤트 수가 같은 시장 관찰시간을 뜻하지 않습니다. 겹치는 이벤트가 많다면 동일한 가격 변화가 서로 다른 라벨 결과에 여러 번 포함될 수도 있습니다. 따라서 이벤트 수, 라벨별 비중, 실제 관찰 시간의 범위를 함께 제시하고, 어떤 단위의 예측 성능을 보고하는지 설명하면 결과를 과하게 일반화할 위험을 줄일 수 있습니다.
재현 가능한 명세에는 이벤트 시각, 기준 가격 필드, 단순 또는 로그 수익률, σᵢ 계산법과 관측 기간, 수익·손실 배수, 수직 시간 제한, 같은 봉에서 충돌할 때의 규칙, 만료 라벨, 방향 신호의 출처와 비용 처리 방식을 적습니다. 그 명세로 얻은 높은 분류 점수는 특정 자료와 분석 설계에 대한 증거입니다. 미래 성과를 보장하거나 매매를 권하거나 전략의 수익성을 증명하지 않습니다.
자주 묻는 질문
Q1트리플 배리어 라벨은 경계 가격에 주문이 체결됐다는 뜻인가요?
아닙니다. 라벨은 선택한 가격 자료와 판정 규칙에서 어느 경계가 먼저 도달했는지를 나타냅니다. 가격 점프, 스프레드, 주문 대기 순서와 시장 충격 때문에 실제 체결가는 경계 가격과 다를 수 있습니다.
Q2시간 만료 라벨은 항상 0인가요?
아닙니다. 이 글과 인용한 Mlfin.py 구현은 수평 경계에 닿지 않고 수직 경계에 먼저 도달하면 0을 사용합니다. 다른 목표 정의는 만료 시 수익률의 부호를 사용하거나 별도 만료 클래스를 둘 수 있습니다. 학습 전에 정의를 기록해야 합니다.
Q3메타 라벨링이 시장 방향을 찾아주나요?
그 자체로 방향을 찾지는 않습니다. 1차 신호가 방향을 제안하고, 2차 모델은 그 방향을 채택할지 또는 규모를 얼마나 둘지 평가합니다. 2차 목표와 평가는 제안 방향과 선언한 비용 가정을 반영해야 합니다.
출처와 더 읽을 자료
내용 정정 제보
이 아티클 링크를 담은 이메일 초안을 준비합니다. 직접 보내야 Mark에 제보가 접수됩니다
QUICK CHECK
글을 다 읽었다면, 3문항으로 확인해보세요
Question 01
수직 보유시간 제한에 도달할 때까지 상단·하단 가격 경계 중 어느 쪽도 닿지 않았습니다. 이 글의 규칙은 어떤 라벨을 부여합니까?
정답을 고르면 바로 설명을 볼 수 있어요