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.