Skip to content

🎮 Forecast Simulator — Dự Báo Như Pro!

Bạn vừa trở thành Lead Forecasting Analyst tại ForecastPro Inc. 🔮 — công ty tư vấn forecasting cho retail và e-commerce. Mỗi tuần, clients gửi đến time series data và hỏi: "Dự báo giúp chúng tôi! Dùng method nào? Forecast bao nhiêu? Tin được không?" 7 vòng, mỗi vòng: phân tích data → chọn method → forecast. Forecast gần actual = điểm cao. MAPE thấp = Gold! 🏆


🎯 Mục tiêu học tập

Sau khi hoàn thành game, bạn sẽ:

  1. Nhận diện time series patterns — trend, seasonality, noise level
  2. Chọn forecasting method phù hợp — Naïve, SMA, ETS, Holt-Winters
  3. Hiểu trade-off giữa simple và complex methods
  4. Đánh giá forecast accuracy — MAE, MAPE
  5. Tư duy khi nào forecast đáng tin — và khi nào không

📜 Luật chơi

┌──────────────────────────────────────────────────────┐
│  BẠN = Lead Forecasting Analyst 🔮                    │
│  CLIENTS = 7 businesses cần forecast                   │
│  MỖI VÒNG = 1 dataset → chọn method → forecast        │
│  MAPE THẤP = ĐIỂM CAO                                 │
│  MỤC TIÊU = Tổng MAPE trung bình < 10% → Gold 🥇     │
└──────────────────────────────────────────────────────┘

Cách tính điểm mỗi vòng:

Kết quả MAPEXP
MAPE < 5%+15 XP 🟢 Excellent
MAPE 5-10%+12 XP 🟡 Good
MAPE 10-20%+8 XP 🟠 Fair
MAPE 20-30%+4 XP 🔴 Poor
MAPE > 30%+0 XP 💀 Fail
Không dùng hint+2 XP bonus ⚡
Giải thích đúng lý do chọn method+3 XP bonus 🧠

Tổng XP tối đa: 7 × 15 = 105 XP (chưa tính bonus)

Nguyên tắc quan trọng:

  • 🔮 Method phù hợp data pattern — không phải complex = tốt hơn
  • 📊 Train/Test split temporal — KHÔNG random!
  • 📈 Trend + Seasonality → cần Holt-Winters — SMA/SES không capture

🏆 Bảng xếp hạng & Huy hiệu

Ranks (dựa trên Average MAPE qua 7 vòng)

HạngAverage MAPEMô tả
🥇 Gold — Forecast Master< 10%Bạn forecast như Walmart, Amazon!
🥈 Silver — Forecast Apprentice10-15%Tốt! Cần luyện thêm seasonal patterns.
🥉 Bronze — Forecast Beginner15-25%Cơ bản OK nhưng chọn sai method cho nhiều cases.
💀 Game Over> 25%Client mất tiền vì forecast sai — ôn lại Buổi 16!

Huy hiệu đặc biệt

BadgeĐiều kiệnMô tả
📈 Trend SpotterMAPE < 8% vòng có trend (Vòng 1, 3, 5)Bắt trend chuẩn xác!
🔄 Season ExpertMAPE < 8% vòng có seasonality (Vòng 2, 4, 6)Seasonal pattern master!
🎯 SniperMAPE < 5% bất kỳ vòng nàoForecast accuracy on point!
🔥 Full StreakMAPE < 15% tất cả 7 vòngConsistent across all scenarios!
🏆 Perfect ScoreAverage MAPE < 7%Forecasting legend!
💡 No Hints HeroKhông dùng hint cả gamePure forecasting intuition!

🎲 Chỉ số theo dõi

┌─────────────────────────────────┐
│  🔮 FORECAST SCOREBOARD          │
│  ───────────────────────────    │
│  XP hiện tại:    ___/105        │
│  Vòng hiện tại:  ___/7          │
│  Avg MAPE:       ___%           │
│  Best MAPE:      ___%           │
│  Worst MAPE:     ___%           │
│  Hints used:     ___            │
│  Hạng dự kiến:   ___            │
└─────────────────────────────────┘

🎮 BẮT ĐẦU GAME!


🔵 VÒNG 1: "Coffee Shop Revenue — Chỉ có Trend" (+15 XP)

🏷️ Category: Trend Detection

Tình huống:

Bean & Brew — chuỗi coffee shop, 15 stores tại TP.HCM. Monthly revenue 2 năm (24 months):

MonthRevenue (triệu VND)MonthRevenue (triệu VND)
M1320M13485
M2335M14500
M3348M15518
M4360M16530
M5375M17545
M6390M18558
M7405M19570
M8418M20585
M9430M21600
M10445M22612
M11460M23625
M12470M24640

Pattern: Revenue tăng đều ~15 triệu/tháng. Không có seasonal dip/spike rõ. Trend tuyến tính rõ ràng.

Câu hỏi: Forecast M25 (tháng tiếp theo)?

4 lựa chọn:

MethodForecast M25Logic
ANaïve (F = Y_last)640Lấy giá trị cuối
BSMA(12)576Average 12 tháng gần nhất
CHolt (Double ETS — level + trend)655Capture trend tuyến tính
DHolt-Winters (triple)658Full model với seasonal
💡 Hint (−2 XP)

Data chỉ có trend rõ, KHÔNG có seasonal pattern. Method nào capture trend mà KHÔNG over-complicate?

✅ Đáp án

C — Holt (Double Exponential Smoothing) — Forecast: 655 triệu VND. Actual: 652. MAPE = 0.5% 🟢

Tại sao C:

  • Data có trend tuyến tính rõ ràng (+15/month), không có seasonality
  • A (Naïve): 640 = level cuối cùng, bỏ qua trend → under-forecast. MAPE ~1.8%
  • B (SMA 12): 576 = average, lag behind trend rất nhiều → MAPE ~11.7%
  • C (Holt): Level + Trend → capture đúng growth direction. MAPE ~0.5%
  • D (Holt-Winters): Thêm seasonal component nhưng data KHÔNG có seasonality → over-fitting, unnecessary complexity. MAPE ~1.2%

Bài học: Đừng dùng model phức tạp hơn cần thiết. Trend only → Holt. Có seasonal → Holt-Winters.


🔵 VÒNG 2: "Ice Cream Shop — Seasonality rõ ràng" (+15 XP)

🏷️ Category: Seasonal Pattern

Tình huống:

TroBăng — chuỗi kem, 8 stores. Monthly sales (nghìn ly) qua 3 năm:

MonthYear 1Year 2Year 3
Jan121314
Feb141516
Mar181920
Apr252728
May353739
Jun424446
Jul4547???
Aug4042
Sep3032
Oct2021
Nov1516
Dec1314

Pattern: Rõ ràng seasonal — peak mùa hè (Jun-Aug), low mùa đông (Nov-Jan). Mild upward trend.

Câu hỏi: Forecast July Year 3 (nghìn ly)?

4 lựa chọn:

MethodForecastLogic
ANaïve (F = Jun Y3)46Last value
BSeasonal Naïve (F = Jul Y2)47Same month last year
CSMA(6)27Average 6 tháng gần nhất
DHolt-Winters (additive)49Trend + Seasonal model
💡 Hint (−2 XP)

Data có trend nhẹ tăng + seasonal pattern 12 tháng rõ ràng. Method nào capture BOTH?

✅ Đáp án

D — Holt-Winters Additive — Forecast: 49 nghìn ly. Actual: 48.5. MAPE = 1.0% 🟢

Tại sao D:

  • Seasonal pattern rõ: peak Jul = highest month. Trend tăng ~1-2 nghìn ly/năm.
  • A (Naïve): 46 = June value. July luôn > June → under-forecast. MAPE ~5.2%
  • B (Seasonal Naïve): 47 = July Year 2. Không capture trend tăng → slightly under. MAPE ~3.1%
  • C (SMA 6): Average Jan-Jun → 27. MISS seasonal peak hoàn toàn! MAPE ~44%. Tệ nhất.
  • D (Holt-Winters): Capture trend (+2/year) + seasonal (July = peak) → 49. MAPE ~1%

Bài học: Khi data có BOTH trend và seasonality → Holt-Winters. SMA fail catastrophically trên seasonal data.


🔵 VÒNG 3: "Startup SaaS — Exponential Growth" (+15 XP)

🏷️ Category: Non-Linear Trend

Tình huống:

CloudSync — SaaS startup, MRR (Monthly Recurring Revenue) qua 18 tháng:

MonthMRR (triệu VND)MonthMRR (triệu VND)
M150M10250
M258M11290
M368M12335
M480M13385
M595M14440
M6112M15505
M7130M16575
M8155M17655
M9185M18750

Pattern: Exponential growth ~15%/month. Không seasonal. Curve convex (tăng nhanh dần).

Câu hỏi: Forecast M19?

4 lựa chọn:

MethodForecast M19Logic
ANaïve750Last value — flat
BSMA(3)660Average last 3 — lag
CHolt (additive trend)840Linear trend extrapolation
DHolt (multiplicative trend)862Exponential trend extrapolation
💡 Hint (−2 XP)

Growth rate tương đối (%) ổn định, không phải tuyệt đối (+VND). Tháng trước tăng 95, tháng trước nữa tăng 80. Tăng dần → trend KHÔNG linear.

✅ Đáp án

D — Holt Multiplicative Trend — Forecast: 862 triệu VND. Actual: 855. MAPE = 0.8% 🟢

Tại sao D:

  • Growth ~15%/month → multiplicative (exponential), không additive (linear)
  • A (Naïve): 750 → bỏ qua growth hoàn toàn. MAPE ~12.3%
  • B (SMA 3): 660 → lag behind exponential curve. MAPE ~22.8%
  • C (Holt Additive): Assume linear growth (~85/month cuối) → 840. Close nhưng slightly under vì actual growth accelerating. MAPE ~1.8%
  • D (Holt Multiplicative): Assume % growth ổn định → 862. Best fit cho exponential data. MAPE ~0.8%

Bài học: Additive trend = constant AMOUNT increase. Multiplicative trend = constant PERCENTAGE increase. SaaS MRR thường multiplicative.


🔵 VÒNG 4: "Supermarket — Noisy Data" (+15 XP)

🏷️ Category: Noise Handling

Tình huống:

GreenMart — siêu thị, daily sales (triệu VND) tuần vừa rồi:

DayMonTueWedThuFriSatSun
Week 1180165210175230310285
Week 2195155185190245320275
Week 3170180195160220305290
Week 4185170200185235???

Pattern: Weekend (Sat-Sun) bán nhiều hơn weekday. Nhưng data noisy — variance cao giữa các ngày.

Câu hỏi: Forecast Saturday Week 4?

4 lựa chọn:

MethodForecastLogic
ANaïve (F = Friday W4)235Last value
BSMA(7) — average tuần W4195Smooth noise
CSeasonal Naïve (F = Sat W3)305Same day last week
DAverage of all Saturdays312Mean(310, 320, 305)
💡 Hint (−2 XP)

Saturday luôn là peak day. Nhìn 3 tuần: Sat = 310, 320, 305. Có weekly seasonal pattern rõ. Data noisy nhưng day-of-week pattern stable.

✅ Đáp án

D — Average of all Saturdays — Forecast: 312 triệu VND. Actual: 315. MAPE = 1.0% 🟢

Tại sao D:

  • Weekly seasonality rõ ràng: Sat = peak, mid-week = low
  • A (Naïve = Friday): 235 ← Friday ≠ Saturday! Wrong day pattern. MAPE ~25.4%
  • B (SMA 7): 195 → average ALL days → miss Saturday peak. MAPE ~38.1%
  • C (Seasonal Naïve): 305 = last Saturday → reasonable nhưng chỉ 1 data point. MAPE ~3.2%
  • D (Mean Saturdays): 312 → average 3 Saturdays, smooth out noise. MAPE ~1.0%

Bài học: Khi seasonal pattern rõ + noise cao → average CÙNG SEASON period giảm noise hiệu quả. Naïve sai vì dùng wrong season (Friday ≠ Saturday).


🔵 VÒNG 5: "E-commerce — Promotion Spike" (+15 XP)

🏷️ Category: External Event

Tình huống:

ShopFast — e-commerce, monthly orders (nghìn đơn):

MonthOrdersNote
Jan45
Feb42Tết → dip
Mar48
Apr50
May52
Jun55
Jul53
Aug56
Sep58
Oct60
Nov12011.11 Flash Sale!
Dec65
Jan Y262
Feb Y258Tết
Mar Y2???Normal month

Pattern: Trend tăng nhẹ. November spike do 11.11 promotion — outlier, không phải seasonality!

Câu hỏi: Forecast Mar Y2?

4 lựa chọn:

MethodForecastLogic
ASMA(3)80Average (120+65+62)/3 — includes Nov spike!
BSMA(12)67Average all 12 months — diluted Nov
CHolt-Winters72Full model nhưng Nov distorts seasonal factor
DSMA(3) SAU KHI remove outlier Nov → replace 120→5762Clean data first
💡 Hint (−2 XP)

November 120K = outlier do promotion, KHÔNG phải seasonal pattern. Nếu include trong model → mọi forecast bị inflate. Need to clean outlier trước khi forecast.

✅ Đáp án

D — SMA(3) sau khi clean outlier — Forecast: 62 nghìn đơn. Actual: 63. MAPE = 1.6% 🟢

Tại sao D:

  • November 120K = one-time promotion spike, NOT seasonal. Include nó = poison model.
  • A (SMA 3 raw): 80 → inflated bởi Nov 120K. Actual 63 → MAPE ~27%. Terrible!
  • B (SMA 12): 67 → Nov diluted nhưng still affects. MAPE ~6.3%. OK nhưng not best.
  • C (Holt-Winters): Treat Nov as "seasonal November" → expect next Nov also 120K. Wrong! MAPE ~14.3% trên Mar forecast.
  • D (Clean then SMA): Replace 120→57 (estimated baseline), SMA(3) trên clean data = (57+65+62)/3 ≈ 62. Actual 63. MAPE ~1.6%

Bài học: LUÔN check outliers trước khi forecast. Promotion spikes = external events, not intrinsic pattern. Clean hoặc adjust trước khi fit model.


🔵 VÒNG 6: "Hotel Bookings — Additive vs Multiplicative" (+15 XP)

🏷️ Category: Decomposition Choice

Tình huống:

SunHotel — khách sạn biển, monthly bookings (phòng/tháng):

QuarterYear 1Year 2Year 3Year 4
Q1 (Jan-Mar)200250310380
Q2 (Apr-Jun)350440550680
Q3 (Jul-Sep)500620780???
Q4 (Oct-Dec)280350440

Pattern: Trend tăng mạnh. Q3 (summer) luôn là peak. Seasonal amplitude TĂNG theo trend — Year 1 peak 500, Year 3 peak 780. Tỷ lệ Q3/Q1 ≈ 2.5x ổn định.

Câu hỏi: Forecast Q3 Year 4 (phòng/tháng)?

4 lựa chọn:

MethodForecast Q3 Y4Logic
AHW Additive seasonal900Seasonal add constant amount
BHW Multiplicative seasonal975Seasonal multiply by proportion
CSeasonal Naïve (= Q3 Y3)780Same quarter last year
DSMA(4)553Average last 4 quarters
💡 Hint (−2 XP)

Seasonal amplitude TĂNG theo trend: Y1 summer swing = 300 (500-200), Y3 summer swing = 470 (780-310). Swing tỷ lệ với level → multiplicative seasonality, không additive.

✅ Đáp án

B — Holt-Winters Multiplicative — Forecast: 975 phòng. Actual: 960. MAPE = 1.6% 🟢

Tại sao B:

  • Seasonal amplitude tăng proportionally → multiplicative model
  • Q3/mean ratio ≈ 1.50 stable across years
  • A (HW Additive): Add fixed seasonal = 300 (Y1 season) → 900. Under-forecast vì actual swing larger. MAPE ~6.3%
  • B (HW Multiplicative): Multiply by seasonal ratio ~1.50 → 975. Match data pattern. MAPE ~1.6%
  • C (Seasonal Naïve): 780 = Y3 Q3. Miss trend growth. MAPE ~18.8%
  • D (SMA 4): Average → 553. Miss everything. MAPE ~42.4%

Bài học: Nếu seasonal swings tăng theo trend → Multiplicative. Nếu swings cố định → Additive. Nhìn data visualization hoặc compute seasonal ratios.


🔴 VÒNG 7: "The Ultimate Challenge — COVID Disruption" (+15 XP)

🏷️ Category: Structural Break & Judgment

Tình huống:

FlyHigh — hãng hàng không nội địa. Monthly passengers (nghìn):

YearQ1 avgQ2 avgQ3 avgQ4 avg
2018450520600480
2019480560650520
202020050180280
2021300350250380
2022420500580470
2023470550640510
2024500580670540
2025-Q1520

Pattern: Pre-COVID (2018-2019): stable growth. COVID (2020-2021): collapse + recovery. Post-COVID (2022-2024): recovery + return to trend.

Câu hỏi: Forecast Q2 2025?

4 lựa chọn:

MethodForecastLogic
AHW trên ALL data (2018-2025Q1)480Include COVID years → model confused
BHW trên POST-COVID only (2022-2025Q1)605Clean data, recent trend
CHW trên PRE-COVID (2018-2019) → extrapolate620As if COVID never happened
DHW POST-COVID + seasonal factor from PRE-COVID610Best of both: recent trend + long-term seasonality
💡 Hint (−2 XP)

COVID 2020-2021 là structural break — pattern bị phá vỡ hoàn toàn. Include nó trong training data sẽ confuse model (giảm trend, distort seasonality). Nhưng PRE-COVID seasonality pattern VẪN ĐÚNG cho post-COVID. Combine?

✅ Đáp án

D — HW POST-COVID + PRE-COVID seasonality — Forecast: 610 nghìn. Actual: 608. MAPE = 0.3% 🟢

Tại sao D:

  • COVID = structural break. Data 2020-2021 = anomalous, KHÔNG đại diện cho future.
  • A (All data): COVID data pull model down → Q3 seasonal factor bị giảm. Forecast 480 = way too low. MAPE ~21.1%
  • B (Post-COVID only): 3 năm data = vừa đủ cho HW. Forecast 605 = reasonable. MAPE ~0.5%
  • C (Pre-COVID extrapolate): Ignore 2020+ recovery pattern. As if growth continued linearly from 2019. Forecast 620 = slightly over vì growth rate post-COVID hơi khác. MAPE ~2.0%
  • D (Hybrid): Post-COVID level + trend (2022-2025Q1) + seasonal RATIOS from pre-COVID (2018-2019, more data = better seasonal estimates). Best of both worlds. MAPE ~0.3%

Bài học QUAN TRỌNG NHẤT:

  1. Structural breaks (COVID, recession, new competitor) → split data at break point
  2. Don't train on anomalous periods — model learns wrong patterns
  3. Seasonality survives structural breaks — summer is still summer after COVID
  4. Expert judgment + model = best — recognize break, adjust training data accordingly

📊 KẾT QUẢ GAME

Tổng kết điểm

┌───────────────────────────────────────────────────┐
│  🔮 FORECAST SIMULATOR — KẾT QUẢ                  │
│  ───────────────────────────────────────────────  │
│  Vòng 1 (Trend):        MAPE ___% → ___ XP       │
│  Vòng 2 (Seasonal):     MAPE ___% → ___ XP       │
│  Vòng 3 (Exponential):  MAPE ___% → ___ XP       │
│  Vòng 4 (Noisy):        MAPE ___% → ___ XP       │
│  Vòng 5 (Outlier):      MAPE ___% → ___ XP       │
│  Vòng 6 (Add vs Mul):   MAPE ___% → ___ XP       │
│  Vòng 7 (Structural):   MAPE ___% → ___ XP       │
│  ───────────────────────────────────────────────  │
│  TỔNG XP:         ___/105                          │
│  AVG MAPE:        ___%                             │
│  HẠNG:            ___                              │
│  BADGES:          ___                              │
└───────────────────────────────────────────────────┘

Bài học tổng hợp từ 7 vòng

VòngPatternBest MethodKey Lesson
1Trend onlyHolt (Double ETS)Simple trend → Holt. Đừng over-complicate
2Trend + SeasonHolt-WintersSeason rõ → HW additive
3Exponential growthHolt Multiplicative% growth → multiplicative trend
4Noisy + Weekly seasonAverage same daySeason stable, noise high → average cùng period
5Outlier from promotionClean then forecastALWAYS clean outliers trước khi model
6Growing season amplitudeHW MultiplicativeSeason tỷ lệ theo level → multiplicative
7Structural break (COVID)Hybrid approachSplit at break, combine post + pre seasonality

💡 Golden Rules of Forecasting

  1. Visualize first — nhìn data trước khi chọn method
  2. Simple baseline — bắt đầu bằng Naïve, beat it?
  3. Match method to pattern — trend → Holt, seasonal → HW
  4. Clean before model — outliers, missing values
  5. Additive vs Multiplicative — check seasonal amplitude
  6. Structural breaks — split data, don't train on anomalies
  7. Prediction interval — never just point forecast