EventCast — LLM 事件感知需求预测:大促/节假日场景 MAE-57%
Skill-EventCast-LLM-Event-Forecasting · 03-时间序列
1. 解决的问题
某母婴品牌618大促备货奶粉 SKU(如 A2 奶粉 900g),需提前 7 天向供应商下 PO
2. 核心算法逻辑
核心思想:传统时序模型(ARIMA、Prophet、TFT)在大促/节假日期间严重失效,原因是分布偏移——大促期的需求量级、峰值形态与日常完全不同,历史模式无法外推。EventCast 的解法是:让 LLM 做语义推理(不做数值预测),将运营事件转化为结构化特征,再喂给专门的预测模型。
3. 业务应用场景
业务问题:某母婴品牌618大促备货奶粉 SKU(如 A2 奶粉 900g),需提前 7 天向供应商下 PO。传统 Prophet 模型因无法感知"满 300 减 100 + 直播预告 + 平台流量加持",备货量误差高达 40%,导致要么断货要么积压。
数据要求: | 类型 | 字段 | 说明 | |------|------|------| | 历史数值 | daily_sales, price, stock_level | 过去 90 天销量/价格/库存 | | 促销事件 | promo_type, discount_rate, start_date, duration | 内部运营日历 | | 直播事件 | host_name, expected_viewers, time_slot | 直播排期表 | | 平台事件 | platform_flow_bonus, category_rank | Amazon/Tmall 活动数据 |
预期产出: - 大促期间(活动前 3 天 + 活动中 + 活动后 2 天)逐日需求预测 - P10/P50/P90 预测区间(用于安全库存计算) - 事件贡献度分解(促销提升量 vs 直播提升量 vs 平台流量提升量)
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
100 万
7. 代码模板
代码块数量:1 · 路径:未检测到
"""
EventCast: LLM 事件感知需求预测
论文: arXiv 2602.07695 | 2026-02
场景: 618/双11 大促备货 + 跨境节假日需求预测
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple
import numpy as np
from datetime import date, timedelta
from enum import Enum
class EventType(Enum):
PROMOTION = "promotion"
HOLIDAY = "holiday"
LIVESTREAM = "livestream"
PLATFORM_CAMPAIGN = "platform_campaign"
@dataclass
class BusinessEvent:
"""业务事件(LLM 推理的输入单元)"""
event_type: EventType
date: date
description: str
affected_regions: List[str]
expected_lift: float # 预期需求提升倍数(如 2.5 = 提升 150%)
discount_rate: float = 0.0 # 折扣率(0.0-1.0)
duration_days: int = 1
confidence: float = 0.8 # 预期估计置信度
class EventKnowledgeBase:
"""事件知识库:存储和查询促销/节假日事件"""
def __init__(self):
self._events: List[BusinessEvent] = []
def add_event(self, event: BusinessEvent) -> None:
self._events.append(event)
def query_events(
self,
start_date: date,
end_date: date,
regions: Optional[List[str]] = None,
event_types: Optional[List[EventType]] = None,
) -> List[BusinessEvent]:
"""查询指定日期范围和地区的事件"""
results = []
for evt in self._events:
evt_end = evt.date + timedelta(days=evt.duration_days - 1)
if not (evt.date <= end_date and evt_end >= start_date):
continue
if regions and not any(r in evt.affected_regions for r in regions):
continue
if event_types and evt.event_type not in event_types:
continue
results.append(evt)8. 论文来源
- 2602.07695