Modeller
Flera modeller kör samtidigt på samma indata och mäts mot samma utfall. Sajten visar en av dem som standard, men alla sparas och poängsätts — det är så man ser om en ny idé faktiskt är bättre eller bara känns bättre.
Läser in modeller…
Vilken används på sajten?
Väderskalad, dämpad nivå (shrunk_scaled) är standardmodellen.
Den används i graferna, i timtabellen och i fältet default_model i API:t.
I backtestet på 437 224 timmar hade den 25,94 EUR/MWh i medelfel mot 29,87 för den
säsongsnaiva referensen — 13 procent mindre fel. Men backtestet känner vädret i
efterhand. På riktiga utfärdade prognoser blir medelfelet 41,9 EUR/MWh mot
referensens 45,2, alltså 7 procent mindre fel — se
träffsäkerhetssidan för aktuella tal. Vill du
jämföra modellerna finns kryssrutan Visa övriga modeller på förstasidan.
Väderskalad, färsk nivå (recency_scaled) var kortvarigt standard,
på styrkan av ett backtest som av misstag räknade med timmar vars pris redan var
publicerat. Mätt rätt är den sämre, särskilt det första dygnet — förklaringen står på
träffsäkerhetssidan och i Metod.
Den ligger kvar som mätt konkurrent.
Dämpad nivå, marknadsjusterad (market_scaled) är nyast. Den tar
standardmodellens dygnsform och flyttar nivån till terminsmarknadens pris för nästa
vecka. Det finns ingen fri historik över terminspriser att backtesta mot, så den mäts
skarpt från september 2026 och får styra sajten först om den visar sig bättre över
flera veckor.
Ensemblen är inte längre standard. Varje blandning av den bästa modellen med de andra gav ett sämre resultat än modellen ensam. Den finns kvar som mätt jämförelse — att ta bort förlorande kandidater är hur man slutar märka när något blir bättre igen.
Säsongsnaiv är referensen: priset samma veckodag och timme förra veckan. Alla procenttal för mindre fel än naiv på träffsäkerhetssidan mäts mot den. En modell som inte slår den tillför ingenting, hur avancerad den än är.
Innan en modell får ändra vad sajten visar
Den ska ha slagit de befintliga på skarpa prognoser över flera veckor, och — där
det går — först i python -m src.research.backtest,
som poängsätter kandidater mot fyra års utfall med varje koefficient anpassad
enbart på data äldre än det kvartal den tillämpas på. Riggen finns för att
gissningar redan varit fel flera gånger i det här projektet: en
fyraveckorsmedian såg självklart rätt ut och var 8,5 procent sämre, och en
trendjustering var 39 procent sämre.
Lägga till en modell
En ny modell är en fil och en rad. Pipelinen tar hand om resten: den körs,
skrivs till data/forecasts/, poängsätts per horisont och dyker
upp i API:t och i jämförelsegraferna automatiskt.
# src/models/lightgbm_v1.py
class LightGbmV1:
id = "lightgbm_v1"
name_sv = "Gradient boosting"
description_sv = "Kvantilregression tränad på features.build."
quantiles = True
derived = False
def predict(self, features, issued_at) -> list[ForecastPoint]:
...
# src/models/registry.py
BASE_MODELS = [
SeasonalNaive(),
WeatherScaled(),
LightGbmV1(), # <- enda ändringen
]
Kraven på predict: returnera punkter för alla fyra elområden från
början av innevarande dygn till och med +168 timmar, med p10 ≤ p50 ≤ p90.
Hjälpfunktionerna target_window() och order_quantiles() i
models/base.py gör båda delarna åt dig. Negativa priser är tillåtna.
En modell som byggs från andra modellers utdata sätter derived = True,
läggs i DERIVED_MODELS och implementerar combine() i
stället — så som ensemblen gör.