HMSoft
PLATFORM · GENERATION FORECASTING

How many kW at what hour tomorrow — and how right we were, every day

We forecast each plant’s next 24 hours in one-hour slots. It is a weather forecast, so we don’t promise «x % accuracy». Instead it is scored automatically every day, and we don’t hide the result.

Flow — from inputs to scoring
KMA short-range forecast8 a day · stored as receivedPlant actualsLast 90 days · faults correctedLearningCeiling · four sky factorsForecast «edition»24 h · new edition per releaseBids · forecast submissionDay-before 09:30 · 10:00 · 17:00Scored next day 05:10Edition used vs. actual · dailyRelearns as actuals build up

The algorithm — five steps

Forecast kW = clear-sky kW × temperature × ceiling × sky factor
①
Clear-sky kW

From the sun’s position, «kW with no clouds» every 5 minutes, averaged per hour

②
Temperature

Estimates module temperature from the forecast air temperature and derates for heat

③
Ceiling

«Even on clear days this plant reaches only x % of theory» — learned from actuals

④
Sky factor

«On days forecast as mostly cloudy, how many % in reality» — learned from actuals

⑤
Clipping

Never above the inverter limit · never below zero

Inputs — KMA short-range forecasts (issued 8 times a day) + the plant’s last 90 days of actuals · a new edition is made at every release and kept, never overwritten

What sets it apart — safeguards for honest scoring

Learns from forecasts as issued

Learning from observed weather removes «how wrong the forecast was» and flatters the model. We store each forecast as received, from day one.

Scored on editions made before the deadline

A same-morning edition is naturally accurate. We score the editions actually used for bids and submissions (day-before 09:30, 10:00, 17:00).

The official yardstick

|forecast − actual| ÷ available capacity, excluding hours under 10 % utilisation — the same as the power exchange rules.

Faults are not learned as «cloudy»

Faulty inverters are removed from the denominator, and learning uses «as if all were healthy».

Every edition is kept

«What did we submit back then?» can always be pulled up and matched against the bid.

No wild swings

With few samples it leans to defaults, and the range is clipped so one odd day can’t ruin the forecast.

Forecast vs. actual — how it looks on screen (illustration, not real data)
0003060912151821hClouds passed at midday — larger errorDay-before forecastActual generation· hourly error = |forecast − actual| ÷ available capacity (hours under 10 % use excluded)

Now — statistical correction (v1)

Five numbers per plant (ceiling + four sky factors) learned from actuals, relearned with every edition (8 a day).

Next — machine learning (v2)

Once about three months of records build up, an ML model runs alongside v1 and replaces it only if its error is lower over the same period.