Hypotheses
FAMILY_DEMAND_CYCLES: Experiment Log
FAMILY_DEMAND_CYCLES
Testing consumer demand cycles and food service consumption patterns for Dutch potato price forecasting through seasonal preferences, holiday peaks, and processing demand variations.
Experimentnotities
FAMILY_DEMAND_CYCLES: Experiment Log
Overview
Testing consumer demand cycles and food service consumption patterns for Dutch potato price forecasting through seasonal preferences, holiday peaks, and processing demand variations.
Hypothesis Origins
- Prior experiments: FAMILY_QUALITY_PREMIUM (48.2% improvement at 30-day) showed demand segmentation matters; FAMILY_STORAGE_DECAY (92-93% improvement) revealed demand-supply interaction effects
- Industry catalyst: December 2024 holiday demand spike to €37.5/100kg despite adequate supply (Boerderij.nl)
- Academic basis: Jansen et al. (2023) demand elasticity -0.35; Vermeulen (2023) food service drives 42% of consumption
Experiment Design
- Method: Rolling-origin cross-validation
- Initial window: 156 weeks (3 years)
- Step size: 4 weeks
- Test windows: 52 weeks (1 year)
- Refit frequency: 8 weeks
- Baselines: Naive seasonal, ARIMA, linear trend
- REAL DATA ONLY: CBS API, Boerderij.nl API, Open-Meteo
Data Sources (REAL DATA ONLY)
- Boerderij.nl API: Products NL.157.2086 (consumption), NL.157.2083 (fries) - git:31ab258
- CBS API: Tables 81261NED (CPI food), 83864NED (food service), 85676NED (storage) - version 2024-Q4
- Open-Meteo API: Temperature and precipitation (52.6°N, 5.7°E) - git:31ab258
- Version control: All data sources pinned to specific versions for reproducibility
Experiment Runs
Variant A: Seasonal Demand Pattern Model
Status: Not started - Model: Linear regression with seasonal harmonics - Features: cpi_food_index, seasonal_demand_score, holiday_proximity, temperature_deviation, price_lag_4w - Horizons: 1-month, 2-month - Target: Test if consumer seasonal preferences predict prices 4-8 weeks ahead
Variant B: Food Service Demand Model
Status: Not started - Model: Random forest with demand indicators - Features: food_service_turnover, fries_consumption_ratio, processing_premium, weekday_pattern, price_lags - Horizons: 1-month, 2-month - Target: Test if food service sector provides leading price signals
Variant C: Combined Demand-Supply Balance Model
Status: Not started - Model: Gradient boosting ensemble - Features: demand_supply_ratio, seasonal_demand, food_service, storage_depletion, quality_spread, momentum - Horizons: 1-month, 2-month - Target: Test if integrated demand-supply signals provide superior forecasting
Statistical Tests
- Diebold-Mariano test with Harvey-Leybourne-Newbold correction
- TOST equivalence test with SESOI = 5% improvement (0.075 EUR/100kg)
- Directional accuracy threshold = 60%
- Regime detection: Seasonal decomposition (A), CUSUM (B), Bai-Perron (C)
- Bonferroni correction for variant C (multiple comparisons)
Regime Analysis
- Normal demand regime: Typical seasonal patterns
- Holiday spike regime: December-January elevated demand
- Summer peak regime: BBQ season June-August
- Crisis regime: Supply shortage driven (e.g., 2024)
Verdicts
(No runs completed yet)
HE Notes
- Created 2025-08-16 based on prior experiment insights and industry observations
- Builds on FAMILY_QUALITY_PREMIUM demand segmentation findings
- Complements supply-side families with explicit demand modeling
- December 2024 price spike despite adequate supply validates demand-side importance
- All variants use ONLY REAL DATA from repository APIs
- Consider separate analysis for holiday periods if patterns differ significantly
Decision Log
(To be added after experiments)
Experiment Results (Simplified)
Note: These results use simplified feature sets due to data availability constraints. All experiments use ONLY REAL DATA from Boerderij.nl API.
Verdict — Variant A: Seasonal Demand Pattern — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 2.024, Baseline RMSE: nan
Verdict — Variant A: Seasonal Demand Pattern — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 2.054, Baseline RMSE: nan
Verdict — Variant B: Food Service Demand — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 5.225, Baseline RMSE: nan
Verdict — Variant B: Food Service Demand — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 6.484, Baseline RMSE: nan
Verdict — Variant C: Combined Demand-Supply — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 3.267, Baseline RMSE: nan
Verdict — Variant C: Combined Demand-Supply — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 3.978, Baseline RMSE: nan
Experiment Results (Simplified)
Note: These results use simplified feature sets due to data availability constraints. All experiments use ONLY REAL DATA from Boerderij.nl API.
Verdict — Variant A: Seasonal Demand Pattern — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 2.024, Baseline RMSE: nan
Verdict — Variant A: Seasonal Demand Pattern — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 2.054, Baseline RMSE: nan
Verdict — Variant B: Food Service Demand — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 5.225, Baseline RMSE: nan
Verdict — Variant B: Food Service Demand — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 6.484, Baseline RMSE: nan
Verdict — Variant C: Combined Demand-Supply — 30-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 30-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 3.267, Baseline RMSE: nan
Verdict — Variant C: Combined Demand-Supply — 60-day horizon — 2025-08-16
Label: INCONCLUSIVE Scope: Dutch potato spot prices, 60-day ahead forecast Effect: ΔRMSE = nan EUR/100kg (nan% improvement) Stats: DM p=1.0000; HLN p=1.0000; TOST within ±0.075? False Data/Code: git=58fcb18; data=Boerderij.nl API (REAL DATA) Notes: Using REAL price data only. Variant RMSE: 3.978, Baseline RMSE: nan
Geen Codex-samenvatting
Voeg codex_validated.md toe om de status te documenteren.