RT-O7: 72시간 수요 예측 + 사전 재고 배분

🎯 72h 예측 + 사전 배분이란?Forecast → Pre-Position

RT-O7은 단순 거점 평균 lead 예측이 아니라 채널 × 지역 × SKU의 3차원 시계열을 Transformer로 학습하여 향후 72시간 분포를 산출한다. 외부 시그널(프로모션 캘린더, 기상, 공휴일, 경쟁사 가격)을 결합해 컨텍스트를 풍부하게 만들고, 예측된 수요 분포를 선형계획(LP) solver에 넣어 거점간 사전 이동량을 결정한다.

첨두 시간대(Black Friday, 주말 저녁, 공휴일 직전)에 특정 거점이 품절되는 패턴을 사전 흡수하는 것이 목적이다. 4월 시범 운영에서 72h MAPE 11.4%, 거점별 품절률 38%(목표 50% 이하)를 달성했고, 사전 이동 화물량은 +24% 증가했지만 보유비용은 −26%로 균형을 맞췄다.

🧭 예측 → 배분 파이프라인5 stages · features → dispatch
STEP 1
feature_pull

7일 시간별 이력(168 step) + 외부 시그널 collect. mall / weather / promo / holiday 4종.

STEP 2
transformer_forecast

72시간 분포 예측 (mean + p10 + p90). 채널×지역×SKU 3D 텐서.

STEP 3
risk_score

거점별 품절 위험. μ − 1.28σ < safety_stock 인 노드를 후보로.

STEP 4
lp_solve

이동 비용 vs 품절 비용 LP 최적화. min Σ move·c + Σ stockout·p.

STEP 5
dispatch_plan

TMS 배차 명령 생성 + WMS 출고 지시. x_ij ≥ 0 정수 라운딩.

🐍 DemandTransformer 정의 (Python)
# Transformer 기반 채널×지역×SKU 수요 예측
model = DemandTransformer(
    input_seq_len = 168,     # 7일 시간별 이력
    output_seq_len = 72,     # 72시간 예측
    d_model = 128,
    n_heads = 8,
    n_layers = 4,
)
# 외부 변수: 프로모션 캘린더, 날씨, 공휴일, 경쟁사 가격
exogenous = ["mall_event", "weather", "holiday", "competitor_price"]
model.fit(history, exogenous=exogenous)
forecast = model.predict(horizon=72, quantiles=[0.1, 0.5, 0.9])
🐍 사전 재고 배분 LP (Python)
# 예측 수요 기반 거점별 최적 재고 이동
def preposition_inventory(forecast, node_inventory, transport_cost):
    # 선형계획으로 이동 비용 vs 품절 비용 균형
    prob = LpProblem("preposition", LpMinimize)
    x = LpVariable.dicts("move", edges, lowBound=0)
    s = LpVariable.dicts("stockout", nodes, lowBound=0)
    # 목적: 예상 품절 비용 + 이동 비용 최소화
    prob += lpSum(x[i,j] * transport_cost[i,j] for (i,j) in edges)
            + lpSum(s[n] * stockout_penalty[n] for n in nodes)
    # 제약: 각 노드 도착 재고 ≥ 예측 수요
    for n in nodes:
        prob += node_inventory[n] + lpSum(x[i,n] for i in nodes) \\
            - lpSum(x[n,j] for j in nodes) + s[n] >= forecast[n]
    return solve(prob)
➗ 손실 함수 & 목적식Quantile Loss · LP 목적함수 · 외부 시그널 비중
Loss = MAE_q0.1 + MAE_q0.5 + MAE_q0.9
min Σ_ij move_ij · c_ij + Σ_n stockout_n · p_n
s.t. Σ_j x_jn ≥ 예측수요_n, x ≥ 0
# quantile loss → p10/p50/p90 동시 학습 → LP에서 p90 보수적 사용
mall .35쇼핑몰 자체 이벤트(쿠폰·라이브) 일정. 프로모션 캘린더 API. 주문 폭증의 가장 강한 신호.
weather .25KMA 기상 API · 강수/적설/한파 → 신선식품·생필품 수요 변동.
promo .25경쟁사 가격 / 외부 마케팅 시그널 · 카테고리별 cross-elastic 효과.
holiday .15KASI 한국공휴일 데이터 · 명절 직전 +180% 수요 패턴.

예) 라이브커머스 + 주말 + 우천 동시 발생 시 mall(.35) + weather(.25) + holiday(.15)이 전부 가산되어 예측 평균이 기준 대비 +210%로 튄다. 이 경우 LP solver가 인접 거점 4곳에서 약 220 pal을 사전 이동시켜 첨두 시간 품절률을 38%로 억제한다.

🌐 입력 외부 변수 비교KASI · KMA · 사내 프로모 캘린더 · 경쟁사 가격 크롤러
외부 변수출처주기기여도(SHAP avg)특이사항
mall_event사내 프로모 캘린더 API실시간0.35가장 결정적, 주문 ±200%
weatherKMA 기상 API 20243시간 단위0.25신선식품 / 생필품 카테고리 우선
competitor_price외부 가격 크롤러시간 단위0.25cross-elastic, 일부 카테고리만 강함
holidayKASI 공휴일 데이터정적0.15명절 D-3 polling 가산

mall_event 단일 변수가 예측 변동의 35%를 설명한다. 시그널 누락 시 fallback은 동일 요일·시간대 평균값을 사용하지만 MAPE가 약 4%p 악화되어 외부 API 모니터링이 별도 운영 항목으로 분리되어 있다.

참고문헌
[1] 김지훈 외, "72시간 수요 예측과 LP 기반 사전 재고 배분", IntraLogis 사내 보고서, 2026.04
[2] Vaswani, A. et al. "Attention is All You Need", NeurIPS, 2017
[3] Lim, B., Arık, S.Ö., Loeff, N., Pfister, T. "Temporal Fusion Transformers for Interpretable Multi-horizon Forecasting", 2021
[4] ASCM, Forecast Best Practices Reference Guide, 2024
[5] 기상청 KMA, 기상자료개방포털 API, 2024
[6] 한국천문연구원 KASI, 한국공휴일 데이터셋, 2024