Skip to content
Fintech AI Lab
Go back

Financial AI

판매량 예측 (1) 트리 모델부터 크로노스까지

Read in English

판매량 예측은 어렵다.

요일이 영향을 준다. 시즌도, 날씨도, 프로모션도 그렇다.

셀러가 어느 날 상품 구성을 바꿔버리면 과거 매출은 쓸모가 반쯤 사라진다. 이 중 상당수는 데이터에 남지도 않는다.

그래서 커머스에서는 보통 재고나 물류 쪽 일로 여긴다. 그런데 판매 금액을 보고 돈을 빌려주는 핀테크라면 얘기가 달라진다.

셀러의 미래 매출이 곧 상환 재원이니까. 판매량 예측이 한도와 상환과 리스크 관리의 한가운데로 들어온다.

이 시리즈는 그 예측을 어떻게 만드는지에 대한 정리다. 이번 편은 무엇을 예측할지와 어떤 모델로 할지를 다루고, 다음 편에서 트랜스포머 안을 열어본다.

1. 판매 금액 기반 대출에서 예측이 하는 일

판매 금액 기반 대출(revenue-based financing)은 구조가 단순하다. 셀러의 매출 흐름을 보고 돈을 빌려준다. 상환도 매출에서 떼어 간다.

쇼피파이 캐피털이 대표적인데, 일 매출의 일정 비율이 자동으로 상환에 쓰인다 (Shopify). 잘 팔린 날은 많이 갚고, 안 팔린 날은 덜 갚는다.

예측이 제일 먼저 쓰이는 곳은 한도다. 앞으로 몇 달 동안 얼마를 팔지가 빌려줄 수 있는 금액의 상한이 된다.

상환 기간도 예측에 달려 있다. 일 매출의 몇 퍼센트를 떼면 언제 다 갚는지는 결국 매출 경로가 정하니까.

대출이 나간 뒤에는 조기 경보에도 쓰인다. 매출이 꺾이기 시작하는 셀러를 빨리 알아채야 한다.

그런데 셋이 원하는 예측이 조금씩 다르다.

한도를 잡을 땐 잘 안 풀렸을 때 얼마나 파는지가 궁금하다. 분포의 아래쪽이다.

상환 기간을 추정할 땐 보통 수준의 매출 경로면 된다. 조기 경보에선 금액보다 꺾이는 방향이 먼저 보여야 한다.

그래서 판매량 예측을 하겠다고 하면, 모델을 고르기 전에 무엇을 예측할지부터 정해야 한다.

2. 주가 예측과 다른 점

시계열 예측이라고 하면 주가를 먼저 떠올리는 사람이 많다. 판매량은 성격이 꽤 다르다.

주가는 랜덤워크에 가까워서 과거 값 말고 넣을 게 별로 없고, 넣어봐야 신호가 약하다.

판매량엔 구조가 있다. 요일이 있고, 시즌이 있고, 프로모션이 있다. 무엇보다 같이 봐야 하는 공변량이 많다.

공변량은 언제 값을 알 수 있느냐로 나뉜다.

업종, 업력, 지역은 시간에 따라 안 변하는 정적 공변량. 반품률, 평점, 리뷰 수, 방문자 수는 지나고 나서야 아는 공변량이다. 달력, 공휴일, 이미 잡힌 프로모션 일정은 미래 값까지 미리 아는 공변량이고.

이 구분이 중요한 이유가 있다. 예측 구간에서 모델이 실제로 쓸 수 있는 건 정적 공변량과 마지막 종류뿐이다.

판매 예측에 들어가는 것들

주가 예측엔 거의 첫 줄만 있다.

셀러 쪽 사정도 있다. 셀러가 수십만 명이면 시계열도 수십만 개다. 규모는 하루 몇만 원부터 몇억 원까지 벌어진다.

작은 셀러는 매출 0인 날이 흔하다(간헐 수요). 막 입점한 셀러는 이력이 두세 달뿐이다. 상품 구성을 바꾸면 과거 매출이 미래를 잘 설명하지 못하게 된다.

이 제각각인 시계열 전체를 모델 하나로 한꺼번에 다뤄야 한다는 것. 판매량 예측이 어려운 진짜 이유다.

3. 무엇을 예측할 것인가

금액 그대로

제일 직관적인 건 미래 매출 금액 자체를 맞히는 거다. 결과를 바로 쓸 수 있다. 예측한 30일 매출이 그대로 한도 계산에 들어가고, 일별 예측을 더하면 월 예측이 된다(점 예측이라면).

문제는 규모다. 셀러마다 매출이 수천 배 차이 난다. 금액으로 손실을 계산하면 학습이 큰 셀러에 끌려간다. 오차도 규모에 비례해서 커진다(이분산).

로그를 씌우면 좀 낫다. 대신 로그 공간에서 예측한 값을 되돌리면 평균이 아니라 중앙값 근처가 나오는 역변환 편향이 생긴다.

트리 모델로 금액을 그대로 예측하면 학습 데이터에서 본 것보다 큰 값을 아예 못 내기도 하는데, 이건 5절에서 다시 나온다.

뒤집어 볼 점도 있다. 대출하는 입장에선 큰 셀러의 오차가 실제로 돈이 더 크다. 그러니 큰 셀러에 끌려가는 게 꼭 나쁘다고만 할 수 없다.

월마트 매출로 치른 M5 대회도 판매 금액으로 가중치를 준 지표를 썼다. 규모 차이를 지울지 살릴지는 손실이 어디서 나는지를 보고 정하면 된다.

증감률

두 번째는 지난 기간 대비 얼마나 늘거나 줄지를 맞히는 거다. 규모와 무관해서 셀러끼리 비교가 된다.

추세를 빼고 나면 시계열이 정상성에 가까워져서 모델이 배우기도 편하다. 매출이 꺾이는 셀러를 잡는 게 목적이라면 제일 직접적이고.

대신 기준이 0이면 정의가 안 된다. 어제 0원을 판 셀러가 오늘 만 원을 팔면 증가율은 몇 퍼센트일까? 무한대다. 간헐 판매가 흔한 작은 셀러에서 이게 자주 터진다.

여러 기간을 예측할 때도 문제다. 증감률을 곱해서 금액으로 되돌리는 과정에서 오차가 복리로 쌓인다. −50% 다음 +50%가 제자리가 아닌 비대칭도 있다.

로그 비율을 쓰면 비대칭은 풀린다. 0 문제는 그대로고. 그래서 실무에선 “향후 30일 합계 ÷ 직전 30일 합계”처럼 기간을 묶어서 0을 피하는 경우가 많다.

분포

세 번째는 값 하나가 아니라 분포를 맞히는 거다. 보통 분위수로 한다. “다음 30일 매출이 P10 기준 4,600만 원, P50 5,300만 원, P90 6,100만 원” 같은 식이다.

대출에선 이게 특히 중요하다. 손실이 아래쪽에서 나니까. 평균 예측으로 한도를 잡으면 절반쯤은 실제 매출이 예측보다 낮게 나온다.

분포를 알면 선을 하나 그을 수 있다. 잘 안 풀려도 이 정도는 판다는 선. 평균은 같아도 변동성이 큰 셀러와 작은 셀러를 다르게 대할 수도 있다.

대신 평가와 운영이 까다로워진다. 정답이 하나가 아니라서 pinball loss나 CRPS 같은 지표로 봐야 한다. P10 아래로 실제로 10%가 떨어지는지, 커버리지도 따로 확인해야 한다.

분위수마다 모델을 따로 학습하면 P10이 P50보다 커지는 교차가 생길 수 있다. 꼬리로 갈수록 데이터가 적어서 불안정하다.

다음 편에서 자세히 다룰 함정도 하나 있다. 일별 분위수를 더해도 월 분위수가 되지 않는다.

무엇을 예측할까: 금액, 증감률, 분포

셋 다 쓸 데가 있고, 셋 다 빠지기 쉬운 함정이 있다.

스케일과 출력 형태는 따로 고른다

사실 이 셋은 한 줄에 놓인 선택지가 아니다.

금액이냐 비율이냐는 어떤 스케일에서 예측하느냐의 문제다. 점이냐 분포냐는 출력 형태의 문제고.

그래서 실무에선 둘을 섞는다. 셀러별로 정규화한 금액의 분포를 예측하고, 원래 규모로 되돌리는 식.

뒤에 나오는 크로노스 계열 모델이 하는 게 정확히 이거다. 입력을 시계열마다 정규화하고, 정규화된 공간에서 분위수를 예측한 다음, 다시 원래 규모로 돌린다.

4. 어느 분위수를 쓸지는 비용이 정한다

분포를 예측하고 나면 다음 질문이 따라온다. 한도는 몇 번째 분위수로 잡나?

P10이냐 P20이냐. 감으로 정하는 경우가 많다. 그런데 이건 답이 나와 있는 문제다.

분위수 회귀의 손실 함수인 pinball loss는 이렇게 생겼다. τ 분위수에서 실제값이 예측보다 크면 τ만큼 벌점을 준다. 작으면 1−τ만큼 준다.

재고관리의 신문팔이 문제(newsvendor)와 똑같은 식이다.

신문을 너무 많이 들여놓으면 남는 비용이 든다. 너무 적게 들여놓으면 못 판 기회비용이 든다. 두 비용의 비율로 최적 주문량이 정해진다.

대출에 대면 두 비용은 이렇다. 매출을 과대평가해서 너무 많이 빌려준 비용이 과대 비용. 과소평가해서 덜 빌려준 비용(놓친 이자, 경쟁사로 떠난 셀러)이 과소 비용이다.

기대 비용을 가장 작게 만드는 분위수는 과소 비용을 두 비용의 합으로 나눈 값이다.

한도를 몇 번째 분위수로 잡을까

P10으로 한도를 잡는다는 건 과대 대출이 과소 대출보다 9배 아프다고 본 셈이다.

거꾸로 읽으면 더 재밌다. P10을 쓴다는 건 과대 대출 한 단위가 과소 대출 한 단위보다 9배 아프다고 판단했다는 뜻이 된다. 이 숫자를 드러내놓으면 리스크 팀과 사업 팀이 분위수를 감이 아니라 비용으로 얘기할 수 있다.

물론 단순화한 그림이다. 실제 부도 손실은 매출 부족분에 선형으로 비례하지 않는다. 어느 선을 넘으면 한꺼번에 온다.

그래도 출발점으로는 꽤 쓸 만하다.

5. 트리 모델, 여전히 제일 강한 기준선

판매량 예측에서 제일 많이 쓰는 건 여전히 LightGBM 같은 그래디언트 부스팅 트리다. 2020년 월마트의 42,840개 시계열을 맞힌 M5 대회에서도 상위권 대부분이 LightGBM을 썼다.

방식은 시계열을 테이블로 바꾸는 거다. 기준일마다 한 행을 만든다.

과거 매출에서 뽑은 시차 값과 이동 통계를 넣는다. 예측 구간의 달력과 예정 프로모션, 직전 기간의 반품률과 평점, 업종 같은 정적 속성도 컬럼으로 넣는다. 셀러 전체를 모델 하나로 학습하는 글로벌 모델로 가는 게 보통이다.

분위수는 파라미터 하나면 된다. LightGBM은 objective="quantile"에 alpha로 분위수를 정한다. XGBoost는 reg:quantileerror에 quantile_alpha로 여러 분위수를 한 번에 줄 수 있다. CatBoost는 Quantile:alpha=0.1이나 MultiQuantile:alpha=0.1,0.5,0.9다.

M5에도 분위수 9개를 맞히는 불확실성 부문이 따로 있었다.

import lightgbm as lgb
import numpy as np

# y = 향후 30일 매출 / 직전 30일 매출  (규모와 무관한 비율 타깃)
quantiles = [0.1, 0.5, 0.9]
pred = {}
for q in quantiles:
    m = lgb.LGBMRegressor(objective="quantile", alpha=q,
                          n_estimators=400, learning_rate=0.05, num_leaves=31)
    m.fit(X_train, y_train, categorical_feature=["category"])
    pred[q] = m.predict(X_valid)

P = np.sort(np.column_stack([pred[q] for q in quantiles]), axis=1)  # 교차 정리
limit_basis = P[:, 0] * past30_valid   # P10 비율 × 직전 30일 매출 = 한도 기준 금액

합성 데이터(셀러 300명, 2년치 일별 매출에 프로모션과 반품률을 붙인 것)로 돌려봤다.

P10 모델을 학습했는데, 뒤쪽 검증 기간에서 실제값이 P10 아래로 떨어진 비율이 13.7%였다. P90도 86.8%로 안쪽으로 좁혀져 있었다.

분위수를 맞춰 학습해도 기간이 바뀌면 커버리지가 이렇게 어긋난다. 그래서 한도에 쓰는 분위수는 최근 구간으로 따로 보정하는 단계가 있어야 한다.

외삽 쪽은 더 극적이었다.

비율 대신 금액을 그대로 타깃으로 쓴 모델에 학습 데이터 최대치의 1배, 3배, 10배 되는 셀러를 넣어봤다. 예측은 몇 배가 됐을까? 한 원도 안 바뀌었다.

학습 데이터에서 가장 큰 값보다 큰 입력은 전부 같은 잎으로 떨어지니까. 눈금이 학습 데이터 최대치에서 끝나는 자로 키를 재는 셈이다.

빠르게 크는 셀러일수록 과소 예측된다는 얘기고, 타깃을 비율로 바꾸면 이 문제가 사라진다. 3절에서 무엇을 예측할지가 모델 선택과 이어진다고 한 게 이 말이다.

트리 모델은 공변량이 아무리 많고 제각각이어도 컬럼으로 넣으면 된다. 빠르고, SHAP으로 설명하기도 쉽다.

약점은 시계열을 직접 보지 못한다는 거다. 순서에 대한 정보는 전부 사람이 시차 값과 이동 통계로 만들어줘야 한다. 여러 날을 예측하려면 날짜마다 모델을 따로 두거나(직접 방식), 예측을 다시 넣어가며 굴려야 한다(재귀 방식, 오차가 쌓인다).

분위수마다 따로 학습하면 교차도 생길 수 있다. 위 실험에선 없었지만 매번 확인은 해야 한다.

6. 시계열 트랜스포머, TFT에서 크로노스까지

트랜스포머로 가는 길은 두 갈래다.

하나는 우리 데이터로 처음부터 학습하는 태스크 특화 모델이다. 대표가 구글의 TFT(Temporal Fusion Transformer)인데, 판매량 예측에 꼭 맞는 구조를 하고 있다.

공변량 세 종류를 입력단에서부터 따로 받는다. 변수 선택 네트워크로 어떤 공변량이 얼마나 중요했는지 가중치를 보여준다. 출력은 분위수다. 2절에서 나눈 공변량 세 종류가 구조에 그대로 박혀 있는 셈이다.

다른 하나는 방대한 시계열로 미리 학습해두고 가져다 쓰는 사전학습 모델이다. 흔히 시계열 파운데이션 모델이라고 부르는 쪽. 아마존의 크로노스가 이 흐름을 대표한다.

2024년에 나온 첫 크로노스는 시계열을 언어처럼 다뤘다. 값을 평균으로 나눈다. 구간으로 잘라 4,096개짜리 어휘의 토큰으로 바꾼다. 그리고 T5 언어 모델에 다음 토큰을 맞히게 학습시켰다 (arXiv).

예측할 땐 토큰을 하나씩 샘플링해서 미래 경로를 여러 개 뽑는다.

같은 해 말에 나온 크로노스-볼트는 방식을 바꿨다. 시계열을 여러 시점씩 묶은 패치로 넣고, 미래 전 구간의 분위수를 한 번에 뽑는다. 같은 크기의 원래 모델보다 최대 250배 빨라졌다 (AWS).

문제는 둘 다 단변량이었다는 거다. 시계열 하나의 과거만 보고 그 시계열의 미래를 예측한다. 판매량 예측에서 제일 중요한 공변량을 못 넣는다는 뜻이다.

2025년 10월에 나온 크로노스-2가 이걸 풀었다 (arXiv). 여러 시계열을 한 그룹으로 묶어 그 안에서 정보를 주고받는 그룹 어텐션을 넣었다.

그룹에 타깃과 공변량을 같이 넣으면 공변량을 쓰는 예측이 된다. 비슷한 셀러들을 같이 넣으면 셀러끼리 서로 배우는 교차 학습이 된다.

논문에 독일 드럭스토어 체인 로스만의 매장 매출 사례가 있다. 공변량 없이 예측하면 거의 평평한 선이 나온다. 프로모션과 휴일 정보를 넣으면 실제 매출의 오르내림을 따라간다.

트랜스포머의 장점은 트리의 약점과 맞물린다. 시계열을 직접 보니까 시차 값을 손으로 만들 필요가 없다. 여러 시점의 분위수를 한 번에 내놓는다.

사전학습 모델은 특히 이력이 두세 달뿐인 신규 셀러에서 강하다. 수많은 시계열에서 배운 패턴이 모자란 이력을 메워주니까. 크로노스-2 논문에서도 이력이 짧은 벤치마크일수록 교차 학습 효과가 컸다.

약점도 있다. 추론 비용이 트리보다 훨씬 크다. 왜 그렇게 예측했는지 설명하기 어렵다. 사전학습에 쓴 데이터가 우리 셀러들과 얼마나 닮았는지도 알 수 없다.

대출 심사처럼 설명 책임이 따르는 자리에서 가볍게 넘길 문제는 아니다.

7. 개인적인 견해

나는 공변량이 풍부하고 이력이 충분한 셀러라면, 잘 만든 LightGBM을 트랜스포머가 쉽게 이기지 못할 거라고 본다. M5가 끝난 지 몇 년이 지났다. 테이블로 바꾼 트리 모델이 여전히 기준선인 데는 이유가 있다.

트랜스포머가 확실히 앞서는 자리는 따로 있다고 생각한다. 이력이 짧은 신규 셀러, 그리고 여러 셀러 사이에 정보를 나눠야 하는 경우.

대출 쪽에서 이게 결코 작은 비중이 아니다. 신규 셀러는 돈이 가장 필요한 시점에 이력이 가장 짧거든.

그래서 순서는 이렇게 잡는 게 맞지 싶다. 먼저 무엇을 예측할지 정한다. 대출이라면 정규화한 금액의 분포, 그것도 한도에 쓸 기간 합계의 분포가 대부분 맞는 답일 거다.

다음으로 그 분포의 몇 번째 분위수를 쓸지를 비용으로 정한다. 모델은 그다음이다.

LightGBM과 크로노스 계열을 같은 백테스트에 올려서 고르면 된다. 어느 한쪽이 늘 이기기보다 셀러 구간마다 승자가 다를 가능성이 크다.

다음 편에서는 트랜스포머 안을 열어본다. 시계열을 토큰으로 바꾸는 방법부터 타임 어텐션과 그룹 어텐션이 각각 무엇을 하는지, 판매 예측에 쓸 때 조심할 것까지.


함께 보면 좋은 글:

참고 자료

본 글은 2026년 9월 30일 기준 공개 자료를 바탕으로 작성했다. 본문의 LightGBM 수치는 합성 데이터로 돌린 결과라 실제 셀러 데이터에서는 다르게 나올 수 있다. 분위수와 비용의 관계는 선형 비용을 가정한 단순화다.


Share this post:
Previous Post
판매량 예측 (2) 타임 어텐션과 그룹 어텐션 뜯어보기
Next Post
앤트로픽 데이터팀을 보며: 분석가가 내놓는 게 달라지고 있다