System BESS · Grupa KONIK · wytyczne

Podręcznik BESS Desk

Skąd wziąć prawdziwe ceny z polskiego rynku, jak je wczytać do symulatora dwóch magazynów 2 MW / 8 MWh, jak prowadzić na nim codzienną pracę i co trzeba zbudować, żeby z symulatora powstał system sterujący prawdziwymi magazynami.

Stan na 29.09.2026 Dotyczy aplikacji Dwa magazyny BESS, wersja 11 Źródła danych sprawdzone na dobie 20.09.2026

01Skąd pobrać dane

Wszystko, czego symulator potrzebuje, publikuje za darmo PSE w jednym API. TGE i ENTSO-E służą do sprawdzenia i do danych spoza Polski.

Aplikacja ma już prawdziwe ceny

Od wersji 11 aplikacja zawiera 836 dób od 14.06.2024 do 27.09.2026: cenę aukcji SDAC dla Polski jako cenę RDN (RCE tylko do porównania), CEN, ceny i wolumeny aukcji rezerw aFRR, zapotrzebowanie PSE na moc aFRR, prawdziwe ceny RDB z TGE oraz, od 11.07.2025, ceny i wolumeny energii aktywacji aFRR. Pulpit i Rozliczenia liczą ostatnie 31 dób, a pełny zakres pokazuje Laboratorium. Codzienne zadanie projektu (o 16:07, bo wolumeny aktywacji PSE publikuje później niż ceny) dopisuje kolejne doby, od 29.09.2026 także z ceną SDAC i sesją ciągłą TGE, a oba magazyny same je rozliczają przy otwarciu aplikacji. CEN i ceny aktywacji aFRR za dobę D PSE publikuje dopiero następnego dnia ok. 14:10–14:45, więc nowa doba trafia do aplikacji z co najmniej jednodniowym opóźnieniem. Ostatni przebieg zadania widać w Ustawieniach.

Zadanie sprawdza przepisane ceny wyrywkowo, w 5 kwadransach doby. Jeśli dla jakiejś doby zabraknie wymaganej serii, w trybie ścisłym doba stoi i nie wchodzi do wyników, a baner pokazuje, czego brakuje. Brak jednej doby wstrzymuje dopisywanie następnych.

DaneŹródło i raportPoleKiedy dostępneKoszt
Cena RDN
15 min, zł/MWh
PSE, API csdac-pln: cena aukcji SDAC dla Polski, po której rozlicza się zlecenie złożone w aukcji; do 30.09.2025 godzinowa. Od wersji 11 aplikacja rozlicza RDN po tej cenie.csdac_plnD−1 ok. 13:400 zł
RCE (do porównania)
15 min, zł/MWh
PSE, raport RCE · API rce-pln: średnia z fixingów RDN TGE; różni się od ceny SDAC średnio o kilkadziesiąt zł/MWh na kwadransrce_plnD−1 ok. 14:050 zł
Cena niezbilansowania CEN
15 min, zł/MWh
PSE, raport Ceny rozliczeniowe RB · API crb-rozlcen_costnastępnego dnia ok. 14:10–14:45; część dób PSE publikuje ponownie po 3–4 dniach0 zł
Ceny energii aktywacji aFRR
15 min, zł/MWh
PSE, ten sam raport · API crb-rozl; brak ceny oznacza, że PSE nie aktywowało aFRR w danym kierunkuceb_sr_afrrg_cost, ceb_sr_afrrd_costjak CEN0 zł
Ceny rezerw aFRR
aukcja dnia poprzedniego, zł/MW/h
PSE, API cmbp-tp (ceny) i mbp-tp (kupione MW). Raport cmbu-tu to tylko dokupki kwadransowe, nie aukcja.afrr_g, afrr_d, godzina w onmbD−1 po aukcji, godzinowo0 zł
Energia aktywowana aFRR
15 min, MWh
PSE, API eb-rozl; wolumen, który PSE aktywowało w danym kierunkueb_afrrg, eb_afrrdnastępnego dnia ok. 14:00–15:40 czasu polskiego0 zł
Zapotrzebowanie PSE na moc aFRR
MW
PSE, API zmb; po zmianach WDB 5/2026 może się zmieniać w czasiezmb_afrrg, zmb_afrrdD−1 rano0 zł
Kontrola i rynki UEENTSO-E Transparency · strefa PL (10YPL-AREA-----S), ceny DA i niezbilansowaniabiblioteka entsoe-pyD−10 zł, token API na e-mail
Oficjalne wyniki giełdyTGE, wyniki RDN · archiwum w większym zakresie odpłatnietabela na stronieD−1 po aukcjistrona 0 zł
Cena RDB
rynek dnia bieżącego, 15 min
TGE, wyniki RDB, dzień po dniu, z podziałem na notowania ciągłe i aukcje IDA; starsze doby w archiwum RDB TGE (miesięczne pliki ZIP); PSE jej nie publikuje. Do 18.03.2025 część dób to produkt godzinowyw trybie ścisłym wymagana dla magazynu B i strategii A „RDN + RDB”; w starym pliku opcjonalna 4. kolumnapo dobie dostawystrona 0 zł
Pogoda (do prognoz, etap wdrożenia)Open-Meteo, ECMWF Open Data, DWD ICON-EUwiatr, nasłonecznienie, temperaturaprognozy co 1–6 h0 zł na start
Jak czytać czas w API PSE

Pole dtime to koniec kwadransu, a period to jego zakres, np. 00:00 - 00:15. Skrypt poniżej bierze początek z period, bo tak liczy aplikacja. Pełna lista raportów: mapa endpointów API PSE. Filtr dobowy: ?$filter=business_date eq '2026-09-20'.

Od kiedy brać historię

Do testów strategii bierz dane od 14.06.2024, kiedy weszła reforma rynku bilansującego i obecna definicja CEN. Starsze ceny niezbilansowania liczono inaczej i zafałszują wynik magazynu B. RDN w kwadransach jest od 1.10.2025; wcześniejsze ceny godzinowe aplikacja sama rozkłada na 4 kwadranse. Ceny energii aktywacji aFRR PSE publikuje od 11.07.2025, więc magazyn B da się policzyć w trybie ścisłym dopiero od tej doby.

Zmiany zasad rynku w danych

Zatwierdzone przez Prezesa URE (decyzja z 12.08.2026) punkty zmian 5/2026 warunków bilansowania (WDB) obowiązują od 14.08.2026, między innymi limit ceny za moc bilansującą i zapotrzebowanie na moc, które może być niższe o wolumen z trybu uzupełniającego. Ceny aukcji w danych od 21.08.2026 już to zawierają, więc nie obniżaj ich drugi raz. Konsultacje zmian 6/2026 zakończyły się 7.09.2026, a 24.09.2026 PSE poinformowało o przedłożeniu ich Prezesowi URE; nie są zatwierdzone. PSE wnioskuje o wejście w życie 1.12.2026; datę ustali Prezes URE w decyzji (dokument wyjaśniający PSE, str. 14–15). Po wejściu w życie może ruszyć przyłączenie do platformy MARI (mFRR), a jego datę PSE ogłosi co najmniej 2 tygodnie wcześniej. Backtest dziel na okresy przed i po każdej takiej zmianie, a nie licz jednej średniej z całego roku.

Pełny zakres danych w formacie wersji 9

Osobny wątek projektu pobrał 28.09.2026 do folderu /mnt/project-files/bess-dane-rok/ 836 dób od 14.06.2024 do 27.09.2026 i sprawdził je: wszystkie kolumny PSE zgodne z surowymi odpowiedziami, strona i archiwum TGE bez różnic z niezależnym parserem, drugi odczyt bez różnic. Aplikacja w wersji 11 ma te dane wbudowane. Specyfikacja jest w pliku bess-app/format-danych-v9.md; do niej dochodzą kolumny rdb_ct i rdb_ct_wol z notowaniami ciągłymi TGE oraz rdn_sdac z ceną aukcji SDAC. Jak pobrać dane ponownie albo dopisać nowe doby, opisuje bess-dane-rok/skrypty/JAK_URUCHOMIC.md.

Skrypt łączy się tylko z api.raporty.pse.pl i tge.pl. Wątek, który go uruchamia, potrzebuje środowiska z dostępem do tych domen; środowisko projektu już je ma. Nowe środowisko zakłada się tak:

  1. Na claude.ai/code albo w zakładce Code aplikacji Claude kliknij ikonę chmurki z nazwą środowiska nad polem wiadomości i wybierz Add cloud environment.
  2. Network access ustaw na Custom. W Allowed domains wpisz w osobnych wierszach api.raporty.pse.pl, tge.pl i *.tge.pl. Zaznacz „Also include default list of common package managers” i kliknij Create environment.
  3. W ustawieniach projektu (Project settings), w polu Cloud environment, wybierz nowe środowisko.

Zmiana działa tylko w wątkach założonych po niej. Domeny dodane w ustawieniach czatu claude.ai działają tylko w czacie, nie w wątkach projektu.

PlikCo zawiera
kwadranse_RRRR-MM.csvjeden plik na miesiąc, jeden wiersz na kwadrans: czas początku w UTC, doba handlowa, numer kwadransu (doba ma 92, 96 albo 100 kwadransów przy zmianie czasu), RDN, CEN, ceny energii aktywacji aFRR w górę i w dół, energia aktywowana aFRR, ceny i wolumeny aukcji mocy aFRR, zapotrzebowanie PSE na moc aFRR oraz RDB z TGE (cena ważona wolumenem, wolumen, cena najniższa i najwyższa)
publikacje.csvdla każdej doby i raportu: czas publikacji, czas pobrania, liczba wierszy, rozdzielczość (15 albo 60 minut) i skrót sha256, po którym widać zmianę przy ponownym pobraniu
rdb_sesje_RRRR-MM.csvkażda sesja RDB osobno (notowania ciągłe i aukcje IDA1–3) z długością produktu; do 31.08.2025 z archiwum TGE, dalej ze strony TGE
korekty.csvkażda wartość zmieniona przez ponowną publikację PSE (część dób po 3–4 dniach) ze starą i nową wartością; pliki miesięczne mają zawsze ostatnią wersję
README.md, kontrola.csv, anomalie.txtskąd i kiedy pobrano, doby z kompletem danych dla każdej kolumny, braki, doby ze zmianą czasu, wynik drugiego odczytu i anomalie; surowe odpowiedzi źródeł są w surowe/

Zasady: pusta komórka oznacza brak danych w źródle i nie wolno jej uzupełniać, zerować ani przepisywać z sąsiedniego kwadransu. Brakujące dane blokują dany test albo jawnie przełączają go w tryb demonstracyjny. Przed użyciem wątek sprawdza ciągłość czasu, zakresy wartości i drugi niezależny odczyt wybranych dób. Rozliczenia PSE dla ostatnich dób są w pierwszej publikacji, a mniej więcej połowa dób dostaje korektę w D+4, dlatego wątek danych odświeża je po kilku dniach.

02Jak wczytać ceny

Aplikacja od wersji 9 przyjmuje dwa formaty. Format wersji 9 (pliki miesięczne z części 1, można wybrać kilka naraz) ma wszystkie serie i liczy oba magazyny pełnym modelem rynku. Stary format, czyli jeden plik z datą i godziną, ceną RDN, CEN i opcjonalnie RDB, ma tylko ceny: wystarcza dla magazynu A, a magazyn B liczy z nim tylko w trybie demonstracyjnym. Stary plik najszybciej przygotuje skrypt poniżej. Przełącznik Ceny PSE / Przykładowe w Ustawieniach wraca do cen wbudowanych.

Magazyn B ze starego pliku liczy się tylko w trybie demonstracyjnym

Stary plik nie ma cen i wolumenów aukcji rezerw ani cen i wolumenów aktywacji aFRR. W trybie ścisłym, domyślnym od wersji 9, doby bez tych serii stoją i nie wchodzą do wyników B, a aplikacja pokazuje baner z listą braków. Tryb demonstracyjny (Ustawienia → Tryb danych) liczy je z jawnymi założeniami i oznacza to przy wynikach. Kontrola wersji 7 pokazała, że takie założenia zawyżają B o 12–54%, więc wynik demonstracyjny służy do nauki, nie do oceny.

Jak z tego korzystać. Magazyn A liczy się ze starego pliku tak samo jak na cenach wbudowanych. Magazyn B oceniaj na cenach wbudowanych albo na plikach w formacie wersji 9. Backtest na pełnym zakresie danych jest już policzony w wersji 11 na plikach w formacie wersji 9 i widać go w Laboratorium.

Sposób A · skrypt, około 10 minut na rok danych

  1. Zainstaluj Pythona 3 z python.org. Na Windows zaznacz w instalatorze „Add Python to PATH”. Dodatkowe biblioteki nie są potrzebne.
  2. Zapisz skrypt pobierz_ceny_pse.py w dowolnym folderze. Pobierz go tutaj: pobierz_ceny_pse.py. Jego treść jest też poniżej.
  3. Uruchom go w tym folderze, podając pierwszą i ostatnią dobę. Na Windows zamiast python3 wpisz py.
    python3 pobierz_ceny_pse.py 2026-06-01 2026-09-20
    Powstanie plik ceny_pse.csv. Skrypt wypisze, ile dób zapisał, które pominął i jaką średnią stawkę rezerwy aFRR zobaczył.
  4. Wczytaj plik w aplikacji: Ustawienia → Dane cenowe → Wybierz plik → Wczytaj plik.
  5. Dla magazynu B włącz tryb demonstracyjny, jeśli mimo ostrzeżenia wyżej chcesz zobaczyć B na tym pliku. Wtedy w Ustawienia → Stawka rezerwy wybierz „stała stawka” i wpisz dwie liczby z wydruku skryptu: Stała stawka w górę i Stawka w dół (% stawki w górę).
Treść skryptu pobierz_ceny_pse.py
#!/usr/bin/env python3
"""Pobiera ceny z API PSE i zapisuje plik CSV gotowy do wczytania w aplikacji "Dwa magazyny BESS".

Użycie (Python 3.8+, bez dodatkowych bibliotek):
    python3 pobierz_ceny_pse.py 2026-08-01 2026-09-20
    python3 pobierz_ceny_pse.py 2026-08-01 2026-09-20 --plik ceny.csv

Wynik: jeden wiersz na kwadrans w formacie aplikacji
    data godzina;cena RDN;CEN        np. 2026-09-20 00:00;462,41;1423,4
Czwarta kolumna (cena RDB) jest opcjonalna; PSE jej nie publikuje, więc skrypt jej nie zapisuje
w trybie ścisłym doby bez RDB stoją dla magazynu B i strategii A „RDN + RDB”;
ceny RDB modelowe aplikacja podstawia tylko w trybie demonstracyjnym.
Cena RDN = cena aukcji SDAC dla Polski z raportu PSE "csdac-pln" (po tej cenie rozlicza się zlecenie
złożone w aukcji; do 30.09.2025 godzinowa, skrypt wpisuje ją do 4 kwadransów). Tak liczy aplikacja od wersji 11.
RCE ("rce-pln", średnia z fixingów RDN TGE) skrypt nie zapisuje; aplikacja pokazuje ją tylko do porównania.
CEN      = cena niezbilansowania z raportu PSE "crb-rozl" (pole cen_cost).
Dodatkowo skrypt wypisuje średnie ceny aukcji mocy bilansujących aFRR dnia poprzedniego
(raport "cmbp-tp", godzinowo; godzina bez zakupu liczy się jako 0 zł). Plik nie zawiera cen rezerw,
więc te średnie wpisuje się ręcznie w Ustawieniach (stała stawka w górę i stawka w dół w %).

Uwaga: CEN publikowana jest z kilkudniowym opóźnieniem; doby bez kompletu danych są pomijane.
"""
import argparse
import datetime as dt
import json
import sys
import time
import urllib.parse
import urllib.request

API = "https://api.raporty.pse.pl/api/"


def fetch_day(report, day):
    """Zwraca wszystkie rekordy raportu dla jednej doby handlowej (z obsługą stronicowania)."""
    url = API + report + "?" + urllib.parse.urlencode({"$filter": "business_date eq '%s'" % day})
    rows = []
    while url:
        for attempt in range(4):
            try:
                with urllib.request.urlopen(url, timeout=60) as resp:
                    body = json.load(resp)
                break
            except Exception as err:  # sieć bywa niestabilna, ponawiamy
                if attempt == 3:
                    raise
                print("  ponawiam %s %s (%s)" % (report, day, err), file=sys.stderr)
                time.sleep(2 ** (attempt + 1))
        rows.extend(body.get("value", []))
        url = body.get("nextLink")
    return rows


def by_quarter(rows, field):
    """Mapuje początek kwadransu ("HH:MM", z pola period "00:00 - 00:15") na wartość pola."""
    out = {}
    for r in rows:
        v = r.get(field)
        if v is None:
            continue
        parts = [x.strip()[:5] for x in str(r.get("period", "")).split("-")]
        start = parts[0]
        try:  # okres dłuższy niż kwadrans (np. godzinowe ceny sprzed 1.10.2025) rozkładamy na kwadranse
            h, m = map(int, start.split(":"))
            eh, em = map(int, parts[1].split(":"))
            n = max(1, ((eh * 60 + em - h * 60 - m) % 1440) // 15)
        except (ValueError, IndexError):
            n = 1
        for k in range(n):
            mm = h * 60 + m + 15 * k if n > 1 else None
            key = "%02d:%02d" % divmod(mm, 60) if mm is not None else start
            out.setdefault(key, float(v))  # przy zmianie czasu bierzemy pierwszy kwadrans o danej godzinie
    return out


def pl(v):
    return ("%.2f" % v).rstrip("0").rstrip(".").replace(".", ",")


def main():
    ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    ap.add_argument("od", help="pierwsza doba, RRRR-MM-DD")
    ap.add_argument("do", help="ostatnia doba, RRRR-MM-DD")
    ap.add_argument("--plik", default="ceny_pse.csv", help="nazwa pliku wynikowego")
    args = ap.parse_args()

    d, end = dt.date.fromisoformat(args.od), dt.date.fromisoformat(args.do)
    lines, days_ok, skipped, afrr = [], 0, [], []
    while d <= end:
        day = d.isoformat()
        rdn = by_quarter(fetch_day("csdac-pln", day), "csdac_pln")
        cen = by_quarter(fetch_day("crb-rozl", day), "cen_cost")
        res = fetch_day("cmbp-tp", day)
        common = sorted(set(rdn) & set(cen))
        if len(common) >= 92:
            lines += ["%s %s;%s;%s" % (day, q, pl(rdn[q]), pl(cen[q])) for q in common]
            days_ok += 1
        else:
            skipped.append(day)
        for r in res:  # jeden rekord na godzinę; brak ceny = PSE nie kupiło rezerwy
            afrr.append((float(r.get("afrr_g") or 0), float(r.get("afrr_d") or 0)))
        print("%s: RDN %d, CEN %d kwadransów" % (day, len(rdn), len(cen)), file=sys.stderr)
        d += dt.timedelta(days=1)
        time.sleep(0.3)

    with open(args.plik, "w", encoding="utf-8") as f:
        f.write("\n".join(lines) + "\n")

    print("\nZapisano %s: %d dób, %d wierszy." % (args.plik, days_ok, len(lines)))
    if skipped:
        print("Pominięte doby (brak kompletu danych): " + ", ".join(skipped))
    if days_ok < 8:
        print("UWAGA: aplikacja potrzebuje co najmniej 8 dób (7 na rozgrzanie prognozy).")
    if afrr:
        g = sum(a for a, _ in afrr) / len(afrr)
        dn = sum(b for _, b in afrr) / len(afrr)
        print("Średnia cena aukcji aFRR: w górę %s, w dół %s zł/MW/h." % (pl(g), pl(dn)))
        print("W Ustawieniach wybierz Stawka rezerwy: stała stawka, wpisz Stała stawka w górę = %s"
              " i Stawka w dół = %s%% stawki w górę." % (pl(g), pl(dn / g * 100 if g else 100)))


if __name__ == "__main__":
    main()

Sposób B · ręcznie w Excelu

  1. Na raporty.pse.pl otwórz raport z ceną aukcji SDAC dla Polski (w API csdac-pln), wybierz zakres dat i pobierz CSV. To samo zrób dla raportu Ceny rozliczeniowe RB (kolumna CEN). Raport RCE też zadziała, ale od wersji 11 aplikacja rozlicza RDN po cenie SDAC, więc wynik będzie trochę inny.
  2. W nowym arkuszu ułóż trzy kolumny: A data i godzina początku kwadransu, B cena RDN, C CEN, opcjonalnie D cena RDB. Dopasuj wiersze po dacie i kwadransie.
  3. Zapisz jako CSV (rozdzielany średnikami) i wczytaj jak w kroku 4 powyżej.
Zasada plikuSzczegóły
Wiersz2026-09-20 00:00;462,41;1423,40 albo z ceną RDB …;1423,40;510,00 · data i godzina mogą być też w osobnych kolumnach
Separatorśrednik, tabulator albo przecinek; przecinek lub kropka dziesiętna. Nie działają: przecinek jako separator i znak dziesiętny naraz, liczby z kropką tysięcy („1.423,40”), data DD.MM.RRRR i godzina HH:MM:SS w osobnej kolumnie. Pliki z Excela zapisuj jako CSV rozdzielany średnikami, z datą RRRR-MM-DD.
Rozdzielczośćkwadrans (96 wierszy na dobę) albo godzina (24 wiersze, rozkładane na 4 kwadranse). Doba z 23–91 wierszami kwadransowymi jest czytana jak godzinowa, bez ostrzeżenia, a doba zmiany czasu z kompletem 92 albo 100 wierszy kwadransowych jest przypisana poprawnie, ale doby z lukami i dane godzinowe w dobach zmiany czasu mają kwadranse przesunięte. Takie doby lepiej usunąć z pliku albo użyć formatu wersji 9.
Zakresco najmniej 8 dób; pierwsze 7 służy do rozgrzania prognozy, więc wyniki liczone są od 8. doby. Wspólna baza przyjmuje stan do ok. 200 tys. znaków; dłuższy plik (w starym formacie ok. 97 dób, w formacie wersji 9 znacznie mniej) zostaje tylko w Twojej przeglądarce i inni go nie widzą. Pełnego zakresu 836 dób nie wczytuj przyciskiem: nie mieści się w pamięci przeglądarki i po odświeżeniu znika bez komunikatu. Aplikacja ma go wbudowanego.
Brakidoba z mniej niż 23 wierszami jest pomijana. Brak CEN w wierszu oznacza CEN = RDN w obu trybach, także w ścisłym, więc takich wierszy lepiej nie zostawiać. Brak ceny RDB w którymkolwiek kwadransie doby: w trybie demonstracyjnym cena RDB modelowa dla całej doby, w ścisłym doba stoi dla magazynu B i strategii A „RDN + RDB”
Rezerwa i aktywacjestary plik nie ma serii aFRR: w trybie ścisłym B na tych dobach stoi, w demonstracyjnym rezerwa ma stałą stawkę z Ustawień; zob. ostrzeżenie na początku tej części. Format wersji 9 ma wszystkie serie
Co się dzieje po wczytaniu

Symulacja zaczyna się od nowa, a złożone ręcznie zlecenia i oferty są kasowane. Po udanym wczytaniu w Ustawieniach widać zakres dat na zielono, a na dole menu napis „Ceny z pliku CSV”. Przycisk Usuń wczytany plik wraca do cen wbudowanych w aplikację i ich codziennej aktualizacji.

03Jak używać systemu

Symulator odtwarza rynek doba po dobie. Magazyn A handluje na RDN TGE, magazyn B na rynku bilansującym PSE; oba mają te same parametry, więc różnica wyniku pokazuje różnicę rynków.

Do czego system nadaje się dziś

To prototyp analityczny. Zewnętrzna recenzja z 28.09.2026 oceniła go podobnie: warto go rozwijać, ale jego wyniki nie wystarczają jeszcze do zakupu magazynu, obiecywania klientom rentowności ani automatycznego handlu. Aplikacja pokazuje podobną tabelę na Pulpicie, a obok tabelę „Warunki zamknięcia recenzji”.

ZastosowanieDziśCzego brakujeKiedy
Nauka rynku i warsztatyTak, z listą uproszczeń z ramki „Czego model jeszcze nie obejmuje”nic, poza pokazywaniem uproszczeń przy wynikachjuż teraz
Porównywanie strategiiWarunkowo, na cenach wbudowanych albo plikach w formacie wersji 9, z kolumną „vs prosta 4 h”wersja 11 spełnia cztery warunki recenzji, ale na 12 miesiącach DP bije prostą strategię tylko o 1,7%, a miesiąc do miesiąca wynik zmienia się kilkukrotnie; kolejne zmiany modelu można uczciwie sprawdzić już tylko na nowych dobachtryb cienia od 1.12.2026
Ocena inwestycji i bramka zakupuJako wejście: wynik 12 miesięcy to historyczny backtest na zasadach z tamtego okresu, a nie prognozarealna oferta dostawcy z gwarancją w cyklach, pisemne warunki POB/DUB i model przepływów przeliczony na wyniku 12 miesięcy, a nie na 31 dobach Pulpitubacktest do 30.11.2026, bramka do 30.06.2027
Rozmowy z klientami o przychodachNie, bez obietnic rentownościtryb cienia z partnerem: decyzje zapisane przed zdarzeniami i porównane z wykonaniem i rozliczeniempo trybie cienia w grudniu 2026 i decyzji w styczniu 2027
Rynek mFRR i platforma MARINie, brak w modeluprodukty mFRR i oferty energii FRR ze zmian WDB 6/2026; w wersji 11 oferty energii z wolnej mocy są tylko wariantem hipotetycznympo zatwierdzeniu zmian 6/2026 przez URE
Sterowanie prawdziwym magazynemNieosobna warstwa wykonania, kontrola ryzyka i integracja z partnerem POB/DUB, według wymagań przed handlem rzeczywistympilotaż przez partnera do 31.03.2027
Pierwsze otwarcie

Aplikacja poprosi o zgodę na zapis. Po jej akceptacji stan, zlecenia i dziennik zapisują się we wspólnej bazie strony i każdy z dostępem widzi to samo. Bez zgody zapis zostaje tylko w tej przeglądarce.

Udostępnianie zespołowi

  1. Otwórz aplikację i kliknij Udostępnij (Share).
  2. Dodaj osoby po adresie e-mail i nadaj rolę: Contributor, jeśli mają handlować, składać zlecenia i zmieniać ustawienia, albo Viewer, jeśli mają tylko oglądać.
  3. Wyślij im link. Każdy musi być zalogowany w claude.ai i przy pierwszym otwarciu potwierdza dostęp do wspólnej bazy.

Viewer widzi wszystko z zablokowanymi przyciskami, a jego zmiany w Hybrydach i Laboratorium liczą się tylko u niego. Ceny w bazie może zmieniać tylko właściciel lub Editor. Publicznego linku aplikacja mieć nie może, bo korzysta ze wspólnej bazy, a osób spoza Twojej organizacji w claude.ai może nie dać się zaprosić.

Praca na bieżąco

W stanie domyślnym przełącznik Praca na bieżąco w Ustawieniach jest włączony: magazyny same rozliczają wszystkie doby z cenami, a przyciski Rozlicz dobę, Odtwarzaj i Do końca są wyłączone. Żeby przejść historię doba po dobie, wyłącz go.

Pasek górny

ElementCo robi
Rozlicz dobęzamyka aukcję i rozlicza jedną dobę po cenach rzeczywistych; nowe doby z codziennej aktualizacji rozliczają się same przy otwarciu
Odtwarzajrozlicza kolejne doby automatycznie, jak film; drugi klik zatrzymuje
Do końcarozlicza wszystkie pozostałe doby naraz, najwyżej 400 na kliknięcie; przy długiej historii strona jest wtedy zablokowana nawet przez kilka minut
Od nowawraca do pierwszej doby z tymi samymi cenami i parametrami; trzeba kliknąć drugi raz, „Potwierdź reset”, w ciągu 4 sekund; działa przy wyłączonej pracy na bieżąco
Zegarostatnia rozliczona doba, doba, na którą trwa aukcja RDN, i postęp całego okresu

Moduły

Przegląd

Pulpit

Ostatnie 31 dób: marża gotówkowa, gotówka i stan naładowania obu magazynów, gotowość rezerwy w górę i w dół, alerty, tabela, do czego nadaje się ta wersja, i tabela „Warunki zamknięcia recenzji”. Baner mówi, czy liczysz w trybie ścisłym, czy demonstracyjnym.

Rynek

Rynek

Ceny RDN (aukcja SDAC; RCE jako linia kropkowana) i CEN w kwadransach (92, 96 albo 100 w dobie), mapa cieplna, spready TB2 i TB4, ceny i wolumeny aFRR, statystyki dób.

Handel

Zlecenia

Księga zleceń RDN magazynu A i oferta magazynu B z wyceną każdej wielkości rezerwy (co 0,5 MW), z kontrolą przed złożeniem. Oferta rezerwy po zamknięciu aukcji zostaje odrzucona.

Technika

Aktywa

Stan zdrowia baterii, cykle na dobę wobec limitu 1,21, gotowość rezerwy w górę i w dół, korekty stanu naładowania, limity i tryb pracy każdego magazynu.

Instalacje

Hybrydy

Moduł poglądowy: magazyn przy farmie PV albo wiatrowej wobec samodzielnego i oszczędność serwerowni z magazynem za licznikiem (taryfa B23, opłata mocowa i opłaty 2026). Profile PV, wiatru i poboru są modelowe, nie z pomiarów.

Finanse

Rozliczenia

Rachunek wyników z wynikiem głównym jako marżą gotówkową, kosztem zużycia pokazanym osobno i osobnymi wierszami na kary, prowizję partnera i potrzeby własne; rozliczenia dobowe, rejestr transakcji, eksport do CSV. Tu jest dziennik zleceń: dla każdego zlecenia czas decyzji i wysłania z zegara zdarzeń, produkt, dostawa, MWh, cena i jej jednostka, a zlecenie po zamknięciu handlu ma status „odrzucone”; przyciski Test zamknięcia handlu i Eksport dziennika. Tu jest też Test łączny: jeden przebieg ze wszystkimi poprawkami, kontrole i test zaburzeń, który sprawdza, czy decyzje nie korzystają z przyszłości.

Kontrola

Ryzyko

Rozkład wyników dobowych, VaR, obsunięcia, wrażliwość na stawkę aFRR (wynik za okres danych).

Badania

Laboratorium

Wszystkie metody A i B na tych samych danych: marża i wynik po zużyciu na MW rocznie, kolumna „vs prosta 4 h”, cykle, najgorsza doba i odrzucone zlecenia. Parametry są zamrożone (FROZEN v10, suma kontrolna widoczna w module). Panel „Pełny zakres danych: test na odłożonym okresie” pokazuje 829 dób od 21.06.2024 z podziałem na okres odłożony, 12 miesięcy przed strojeniem, okres strojenia i miesiące; przycisk Przelicz na bieżących danych liczy go od nowa w przeglądarce, ok. 7 minut. „Eksperyment doboru” (pierwsza połowa dobór, druga sprawdzenie) pokazuje tylko, jak dobór na tych samych dobach zawyża wynik, i nie jest testem poza próbą. Są też scenariusze rozpiętości cen 100/80/60% i stawki rezerwy (z okresu, 141, 63) oraz Monte Carlo na dobach 96-kwadransowych. Wyrocznia służy do porównań i nie jest górną granicą wyniku.

Audyt

Dziennik

Każda decyzja i każde rozliczenie z czasem i autorem; pod każdym testem pieczątka z zasadami i taryfami, na których go policzono.

Model

Ustawienia

Parametry magazynów, strategie, tryb danych, wczytanie plików i opis założeń bez danych rynkowych z ich źródłami.

Tryby pracy

Każdy magazyn ma trzy tryby, ustawiane w module Aktywa. Zmiana działa od następnej doby.

  • Automat · magazyn działa według strategii wybranej w Ustawieniach, a najlepszą strategię najprościej znaleźć w module Laboratorium przyciskiem Ustaw.
  • Ręczny · operator sam składa zlecenia i oferty w module Zlecenia.
  • Wyłączony · magazyn stoi, co przydaje się jako punkt odniesienia albo przy symulacji awarii.

Dzień operatora w symulatorze

  1. Pulpit. Sprawdź wynik wczorajszej doby, stan naładowania i alerty, np. przekroczony limit cykli.
  2. Rynek. Obejrzyj ceny ostatnich dób i porównaj je z prognozą na dobę aukcji.
  3. Zlecenia, magazyn A. W trybie ręcznym dodaj zlecenia: kupno albo sprzedaż, zakres kwadransów, MW i opcjonalny limit ceny. Kupno realizuje się, gdy cena ≤ limit, sprzedaż, gdy cena ≥ limit. Na RDN zlecenie musi dotrzeć przed 12:00 dnia przed dostawą. Zegar zdarzeń w aplikacji liczy odczyt stanu 2 minuty po granicy kwadransu, wysłanie 5 minut po odczycie i zapas 2 minut przed zamknięciem; spóźnione zlecenie zostaje odrzucone.
  4. Zlecenia, magazyn B. Automat decyduje o 8:30 dnia przed dostawą, przed zamknięciem aukcji mocy o 9:00, i pokazuje wartość każdej wielkości rezerwy. W trybie ręcznym ustaw MW rezerwy aFRR oraz, w strategiach z ofertami energii, MW i ceny ofert sprzedaży i zakupu. Oferty energii z wolnej mocy to wariant hipotetyczny, a nie scenariusz zmian WDB 6/2026; aktywują się po cenie energii aFRR z rozliczeń PSE, a nie po CEN. Oferta rezerwy złożona po 9:00 zostaje odrzucona.
  5. Rozlicz dobę. Na doby z historii kliknij sam; doba dopisana przez codzienną aktualizację rozlicza się przy otwarciu aplikacji. Zlecenia możesz składać na dobę, której cen jeszcze nie ma. Zlecenie przyjęte na RDN jest wiążące: jeśli magazynowi zabraknie energii albo miejsca, różnica rozlicza się po CEN. Dotyczy to też części zleceń ponad moc 2 MW. Status „Zrealizowane, odchyłka po CEN” widać w historii zleceń RDN w module Zlecenia i w alertach, a w rejestrze transakcji w Rozliczeniach odchyłka ma osobny wiersz „Niezbilansowanie”.
  6. Rozliczenia, Ryzyko i Laboratorium. Raz w tygodniu wyeksportuj rozliczenia i dziennik zleceń do CSV, sprawdź w Laboratorium, czy wybrana strategia wciąż wygrywa z prostą strategią 4 h, i jak wynik zmienia się przy mniejszej rozpiętości cen i niższej stawce aFRR.

Parametry w Ustawieniach

Zmiana parametru przelicza wszystkie rozliczone doby od początku, więc od razu widać jej wpływ. Wartości domyślne pochodzą z magazynu referencyjnego w dokumencie projektu, a źródła założeń bez danych rynkowych (prowizja, kara, stawka roczna, dni pracy, zamknięcie handlu, zapas energii) są w panelu „Założenia bez danych rynkowych i ich źródła”.

GrupaParametrDomyślnieKiedy zmieniać
Oba magazynyMoc / pojemność2 MW / 8 MWhtest innego magazynu, np. 10 MW / 40 MWh
SoC min / max5% / 95%wymagania gwarancji producenta
Sprawność cyklu88%dane z karty katalogowej lub pomiarów
Koszt zużycia w decyzjach60 zł/MWhdziała w decyzjach automatu; wynik gotówkowy go nie odejmuje, jest pokazany osobno
Opłaty rynkowe1 zł/MWhpo poznaniu stawek TGE i IRGIT
Żywotność, SOH na koniec życia6000 · 80%warunki gwarancji; SOH obniża pojemność i sprawność
Limit cykli na dobę (w planie)1,216000 cykli w 15 lat przy 330 dniach; cykl to energia oddana z ogniw ÷ 7,2 MWh. A trzyma limit w każdej dobie razem z korektami RDB; B narastająco, bo aktywacje przychodzą z zewnątrz. Gwarancja liczona jako energia do sieci ÷ 8 MWh daje limit luźniejszy o ok. 18%
Spadek sprawności do końca życia2 pktzałożenie; rośnie ze spadkiem SOH
Potrzeby własne10 kWklimatyzacja i BMS, kupowane po cenie RDN; wpisz dane dostawcy
Zegar zdarzeń: odczyt stanu, wysłanie, zapas przed bramką2 · 5 · 2 minrazem wyznaczają, czy zlecenie zdąży przed zamknięciem handlu i jaka jest najbliższa dostawa; wpisz czasy zmierzone w pilotażu
Rekordy rozliczeń PSE: dni od publikacji4CEN i aktywacje aFRR bywają publikowane ponownie do D+4, a pierwotnych wersji nie mamy, więc decyzje biorą je 4 dni po pierwszej publikacji; 0 tylko jako wrażliwość
Tryb danychścisły„demonstracyjny” tylko do nauki na niepełnych danych; wyniki są wtedy oznaczone
Gotówka startowa500 000 złtylko do salda gotówki na Pulpicie
Dni pracy w roku330tylko do wyniku rocznego; reszta to przestoje, serwis i testy
A · RDNStrategia automatuoptymalizacja DP na prognozie„prosta strategia 4 h” to punkt odniesienia, z którym porównujemy wszystkie inne; scenariuszowa przy dużej zmienności; wyrocznia tylko do porównań
Prognoza cenśrednia 7 dób„profil dnia tygodnia” przy wyraźnych weekendach; „idealna” pokazuje koszt błędu prognozy
SoC na koniec doby50%cel planu dobowego; DP planuje 2 doby naprzód, więc stan o północy wynika z opłacalności
Awersja do ryzyka0,3tylko strategia scenariuszowa; wyżej to mniej złych dób kosztem średniego wyniku
Cena transakcji na RDBgorsza z RDB i RDNostrożna wycena z kosztem wejścia; „średnia ważona RDB” i „gorsza z RDB i CEN” to testy wrażliwości, a nie przedział
Sygnał RDB w strategii RDN + RDBbrakprognoza RDB = cena RDN; odchylenie z ostatniej godziny („live”) wymaga podglądu transakcji na bieżąco i jest wrażliwością
Korekty na RDB w trakcie dobytylko notowania ciągłeaukcje IDA mają stałe terminy, więc korekty w trakcie doby idą na notowaniach ciągłych; „cała sesja” to wrażliwość
Koszt wejścia na RDB20 zł/MWhspread i poślizg ponad cenę z pola wyżej; założenie do zastąpienia danymi z pilotażu
Maks. udział w obrocie RDB10%obrotu notowań ciągłych w kwadransie; kwadrans bez transakcji ciągłych nie daje realizacji (w nocy handel ciągły jest tylko w ok. 10% kwadransów)
B · rynek bilansującyStrategia automaturezerwa aFRR + arbitraż RDN„pełna rezerwa” do porównań; strategie z ofertami energii z wolnej mocy to wariant hipotetyczny, nie scenariusz WDB 6/2026
Rezerwa aFRR2 MWgórna granica; automat co dobę wybiera 0; 0,5; … 2 MW i resztę mocy daje na arbitraż
Wielkość oferty na rezerwęautomatycznie„zawsze pełna wielkość” tylko do porównań; przy dużej konkurencji daje mniej
Stawka rezerwyceny z danych PSE„stała stawka” tylko przy starym pliku w trybie demonstracyjnym
Oferta cenowa na rezerwę30 zł/MW/haukcja płaci cenę rozliczeniową, a oferta przegrywa, gdy ta cena spadnie poniżej oferty
Nowe magazyny w aFRR0 MWtest konkurencji: 250, 500 i 1000 MW nowych magazynów obniża cenę rezerwy
Zapotrzebowanie PSE, nachylenie γz raportu zmb · 1,0400 MW w polu działa tylko w trybie demonstracyjnym bez raportu zmb
Stała stawka w górę / w dół120 zł/MW/h · 100%tylko przy „stałej stawce”; w 2025 r. aukcja PSE płaciła średnio 169 zł w górę i 113 zł w dół
Cena oferty energii dla mocy z rezerwycena RDN ± narzut 0 zł/MWhaktywacja, gdy cena energii aFRR z rozliczeń PSE pokrywa ofertę; narzut 150–300 zł/MWh i „koszt odtworzenia” to wrażliwość, nie wybór po wyniku
Bramki korekt SoCRDB i program pracykorekta musi zdążyć przed zamknięciem RDB (60 min przed dostawą) i programu pracy (55 min przed godziną); bramka 60 min obowiązuje do 1.01.2029 (derogacja URE z 27.11.2025); dostawa wypada 5–8 kwadransów po odczycie stanu
Oferty energii: percentyle zakup / sprzedaż25 / 75tylko w strategiach z ofertami energii z wolnej mocy (wariant hipotetyczny)
Aktywacje w trybie demonstracyjnym100 · 800 zł/MWh · 1tylko bez wolumenów aktywacji z raportu eb-rozl; w danych PSE wolumen to energia aktywowana przez PSE podzielona przez moc aFRR kupioną w danej godzinie
Kara za niedostępność w górę / w dół58% / 122% ceny aukcjiponad utraconą zapłatę, za kierunek, w którym stan naładowania nie pokrywa pasma gotowości; wartości z WDB PSE przy średnich cenach 2025 r., raczej górne przybliżenie
Pasmo gotowości0,5 henergia, którą rezerwa musi mieć zawsze; założenie
Zapas energii ponad pasmozmienny, 95. percentylenergia aktywowana przez PSE w oknie od decyzji o korekcie do jej dostawy według zegara zdarzeń; reguła ustalona przed testem, a 99. percentyl i stały zapas 1,25 MWh to wrażliwość
Prowizja partnera POB/DUB20%od przychodu z rezerwy, aktywacji i energii bilansującej; wpisz stawkę z oferty partnera
Średnia roczna stawka rezerwy141 zł/MW/htylko do wyniku rocznego B: średnia aukcji PSE z 2025 r.; 0 = średnia z okresu danych

Eksperymenty na początek

Liczby z wersji 11 przy parametrach zamrożonych w wersji 10, w mln zł na MW rocznie przy 330 dniach pracy. Wynik to marża gotówkowa; koszt zużycia jest osobno. Każda liczba ma wiersz z nazwą przebiegu w pliku bess-app/wyniki/wyniki-v11.csv.

  1. Wynik na pełnym zakresie. W Laboratorium otwórz panel pełnego zakresu. Na 12 miesiącach przed strojeniem (21.08.2025–20.08.2026) DP daje 0,497 wobec 0,489 prostej strategii „ładuj w najtańszych 4 h, oddawaj w najdroższych”, czyli o 1,7% więcej gotówkowo i o 0,8% po koszcie zużycia (0,427 wobec 0,424). RDN + RDB daje 0,466 i przegrywa z obiema, a wyrocznia 0,564. DP wygrywa w 13 z 25 pełnych miesięcy, głównie od września do marca, a od maja do sierpnia co roku nieznacznie przegrywa. Wynik miesięczny DP waha się od 0,147 w grudniu 2025 r. do 0,815 we wrześniu 2026 r., więc przewaga kilku procent jest mała wobec tej zmienności.
  2. Magazyn B na pełnym zakresie. Na tych samych 12 miesiącach B daje 1,484 przy stawkach rezerwy z aukcji (średnio 185 zł/MW/h w górę i 147 w dół) i 1,303 przy stawkach sprowadzonych do 141 zł/MW/h. Przy 250 i 500 MW nowych magazynów B spada do 0,713 i 0,511, czyli do poziomu A albo niżej. To główne ryzyko biznesowe rynku bilansującego.
  3. Pulpit to wyjątkowy okres. Na 31 dobach Pulpitu (28.08–27.09.2026) DP daje 0,827, prosta strategia 0,804, RDN + RDB 0,772, a B 1,466 przy 141 zł/MW/h i 2,141 przy stawkach z okresu. Roczny wynik A jest o ok. 40% niższy, więc do rocznych przychodów pasuje wynik 12 miesięcy, a nie Pulpit. Rozliczenie po RCE zamiast po cenie SDAC daje na tych dobach 0,846 i 0,825, czyli dokładnie wyniki wersji 10.
  4. Składniki B. Na Pulpicie przy 141 zł/MW/h: rezerwa 1,343, aktywacje brutto 0,760, kary −0,189, prowizja partnera −0,421, potrzeby własne −0,026. Gotowość to 83,4% w górę i 96,1% w dół, bo korekty idą tylko na notowaniach ciągłych, a w nocy prawie ich nie ma. Zmień Korekty na RDB w trakcie doby na „cała sesja”: B rośnie do 1,656, co pokazuje, ile wyniku zależy od płynności nocnych notowań ciągłych.
  5. Mniejsza rozpiętość cen. Na Pulpicie w scenariuszach rozpiętości 80% i 60% DP daje 0,633 i 0,441, prosta strategia 0,618 i 0,433, a B przy stawce 141 daje 1,326 i 1,177; przy stawce 63 B spada do 0,872, 0,716 i 0,588. Arbitraż zależy od różnicy między drogimi a tanimi godzinami, nie od średniego poziomu cen.
  6. Wrażliwość ceny wykonania. RDN + RDB przy „średniej RDB” daje 0,801, a przy „gorszej z RDB i CEN” 0,746. To testy odporności, a nie przedział ceny wykonania.
  7. Prowizja partnera. Zmień prowizję POB/DUB z 20% na stawkę z oferty partnera i sprawdź, ile zostaje z wyniku B.
Czego model jeszcze nie obejmuje

Wynik na pełnym zakresie to historia zasad rynku z tamtego okresu, a nie prognoza: RDN jest kwadransowy od 1.10.2025, a zmiany WDB 5/2026 obowiązują od 14.08.2026. Do średniej rocznej sprowadzane są tylko ceny rezerwy. A nie płaci prowizji za dostęp do rynku (ocena dla inwestora liczy prowizję partnera od całej marży handlowej). Aktywacje aFRR dzielą się pro rata z filtrem ceny, a PSE aktywuje je według kolejności ofert cenowych. Nie ma arkusza zleceń TGE ani produktów 30- i 60-minutowych, więc płynność RDB przybliża udział 10% obrotu notowań ciągłych i narzut 20 zł/MWh. Do 18.03.2025 RDB to w części dób produkt godzinowy, a 6.04.2026 nie ma notowań ciągłych; wrażliwość na oba uproszczenia zmienia wynik RDN + RDB o mniej niż 0,001. Pierwotnych wersji rekordów PSE nie mamy, dlatego rozliczenia wchodzą do decyzji 4 dni po publikacji. W danych PSE z 31.08 i 2.09.2026 są stałe bloki energii aktywowanej, które wyglądają na wartości zastępcze w źródle. Model nie liczy temperatury i starzenia kalendarzowego, opłat sieciowych samodzielnego magazynu (ocena odejmuje je osobno, ok. 50 tys. zł/MW rocznie), ograniczeń przesyłowych ani kwalifikacji DUB i POB. Siatka mocy DP, wycena arbitrażu przy doborze rezerwy i kolejność ofert aFRR nie weszły do wersji 11, bo po obejrzeniu wyników okresu odłożonego można je sprawdzić już tylko na nowych dobach w trybie cienia. Moduł Hybrydy jest poglądowy, a jego tryb wiatru „smart” to tylko diagnostyka. Ta część opisuje wersję 11.

04Wdrożenie na pełną skalę

Pełna skala oznacza system, który sam pobiera dane co kwadrans, prognozuje ceny, układa jeden plan dla wszystkich rynków naraz, przekazuje oferty partnerowi POB/DUB, a potem steruje fizycznymi magazynami z limitami i wyłącznikiem awaryjnym. Harmonogram trzyma się dat z oceny rynku dla inwestora. Model przyjęty 27.09.2026 obejmuje własne i cudze magazyny, ale najpierw dowód, potem skala. Przychód od 2027 r. dają cudze magazyny 1–50 MW w umowie optymalizacyjnej. Właściciel płaci łącznie 20–25% marży handlowej brutto: 10–15% partnerowi POB/DUB i 8–12% nam, albo stałą opłatę z premią za wynik. Energię, zabezpieczenia i niezbilansowanie finansuje właściciel przez partnera, a nasza odpowiedzialność jest ograniczona do mniej więcej rocznej opłaty. Teraz finansujemy tylko walidację symulatora i pilotaż z partnerem. O większym zespole i własnym magazynie decydujemy na początku stycznia 2027 r., po trzech dowodach opisanych niżej.

Harmonogram

EtapTerminCo powstajeWarunek przejścia dalej
0 · Walidacja i warunki28.09 – 30.11.2026Wersje 9–11 symulatora są gotowe od 28.09.2026 (terminy zleceń, zegar zdarzeń, oferty i aktywacje osobno, nowy import, limit cykli, parametry zamrożone, rozliczenie RDN po cenie SDAC) i policzyły backtest na 836 dobach z testem poza okresem strojenia. Zapytania do 3 partnerów POB/DUB i 3 dostawców do 10.10, pisemne warunki i oferty do 31.10, rachunek operatora i model zwrotu na tych warunkach, wybór partnera i obiektu do 30.11.backtest pobija prostą strategię „ładuj w najtańszych 4 h, oddawaj w najdroższych” po kosztach, prowizjach i ograniczeniach realizacji; marża operatora dodatnia
1 · Tryb cienia z partnerem1.12 – 31.12.2026System podejmuje decyzje na żywych danych dla obiektu partnera, bez wysyłania zleceń, a wyniki porównujemy z rozliczeniem partnera. W tym czasie może ruszyć MARI, jeśli zmiany 6/2026 wejdą w życie 1.12.2026, o co wnioskuje PSE; datę ustali Prezes URE w decyzji. Budujemy i sprawdzamy zabezpieczenia przed handlem rzeczywistym. List intencyjny z właścicielem cudzego magazynu.co najmniej 3 tygodnie decyzji zapisanych przed zdarzeniami, odchylenia wyjaśnione, żadnego naruszenia limitów; na początku stycznia decyzja po trzech dowodach
2 · Pilotaż na żywo01 – 03.2027Handel na obiekcie partnera przez jego węzeł POB/DUB, z wszystkimi zabezpieczeniami. 10 rozmów z listy 30 właścicieli i 5 listów intencyjnych do 31.03.2027.wynik pilotażu zgodny z trybem cienia, 5 listów intencyjnych
3 · Pierwszy obiekt klientado 30.06.2027Cudzy magazyn w umowie optymalizacyjnej; gateway na obiekcie, integracja z EMS producenta, handel z limitami. Tego dnia bramka zakupu pierwszego własnego magazynu; na dzisiejszej historii nie przechodzi.brak obiektu do 30.06.2027 to sygnał stop; bramka według ramki niżej
4 · Skala31.12.2027 – 2029Do końca 2027 r. 10–20 MW pod zarządzaniem, w 2028 r. 30–60 MW, start pierwszego własnego magazynu, jeśli przeszedł bramkę, i wniosek o własny status DUB po przekroczeniu 20 MW (mFRR, potem aFRR z LFC, potem FCR). Do 2029 r. 150–300 MW, handel na rynku dnia bieżącego gotowy na dno przychodów w 2030 r.opłaty pokrywają koszty obsługi obiektów; koszt całego zespołu dopiero przy ok. 20–70 MW (przewaga nad prostą strategią na 12 miesiącach to 1,7–1,8%), więc przy 10–20 MW zespół nadal wymaga finansowania
Ścieżka krytyczna

Oprogramowanie da się zbudować w 6–8 miesięcy. Dłużej trwa to, na co nie mamy wpływu. Kwalifikacja w PSE trwa oficjalnie 3–4 miesiące, a realnie 6–12 miesięcy dla pierwszych magazynów, dlatego pierwszy przychód daje cudzy obiekt obsługiwany przez partnera POB/DUB, który ma już kwalifikację. Własny magazyn potrzebuje przyłącza SN (realnie 18–30 miesięcy od wniosku) i kwalifikacji, więc ruszyłby najwcześniej w 2028 r.; na wyniku 12 miesięcy jego zakup jest dziś odłożony.

Trzy dowody przed decyzją na początku stycznia 2027 r. Pierwszy: backtest za 12 miesięcy poza okresem strojenia pobija prostą strategię 4 h po kosztach i ograniczeniach realizacji, a tryb cienia pokazuje, że decyzje dało się złożyć na czas. Drugi: pisemne warunki POB/DUB z łączną opłatą dla właściciela najwyżej 25%, przy których nasze koszty pokrywa najwyżej ok. 50 MW. Trzeci: na backteście i realnej ofercie dostawcy własny magazyn ma NPV powyżej zera przy rozpiętości cen o 25% mniejszej i DSCR co najmniej 1,3 w każdym roku kredytu.

Bramka zakupu własnego magazynu wymaga realnej oferty z gwarancją w cyklach, warunków przyłączenia w ręku i spełnienia trzeciego dowodu na tej ofercie, z gotówką na obsługę długu (CFADS) uzgodnioną z bankiem. 180 EUR/kWh to tylko próg, od którego oferty w ogóle liczymy. Ocena liczy na magazynie A z aplikacji w wersji 11, strategia domyślna, 12 miesięcy do 20.08.2026 r.: 0,50 mln zł/MW marży rocznie (31 dób końca lata dawało 0,83, rok jest o ok. 40% słabszy). Na tej historii przy 180 EUR/kWh i starcie w 2028 r. IRR projektu po podatku wynosi −1,0% (NPV −2,6 mln zł), bank pożyczy tylko ok. 18% nakładu przy DSCR 1,3, a przy kredycie na 60% nakładu najniższy DSCR to 0,40 w 2035 r. (0,63 bez rezerwy na ogniwa). Zerowy zwrot wypada przy ok. 170 EUR/kWh, a NPV = 0 przy stopie 8% dopiero przy ok. 110 EUR/kWh. Przy rozpiętości cen o 25% mniejszej kryterium NPV daje ok. 70 EUR/kWh, a DSCR 1,3 nie wychodzi w żadnym roku, więc trzeci dowód na historii nie przechodzi i zakup własnego magazynu jest odłożony, dopóki nie spadną ceny baterii albo nie wzrośnie rozpiętość. To wynik tych założeń, a nie nowy próg. Dla porównania: gdyby cały rok wyglądał jak 31 dób końca lata, IRR wyniósłby 10,6%. Dotacja 45% przy 180 EUR/kWh daje 7,8% (NPV około zera), a nakład 120 i 150 EUR/kWh daje 6,5% i 2,5%. Przy 1,05 cyklu na dobę gwarancja 6000 cykli starcza na ok. 17 lat; budżet to 1,21 cyklu na dobę pracy, gdzie cykl to energia oddana z ogniw podzielona przez 7,2 MWh. Gwarancja liczona jako energia oddana do sieci podzielona przez 8 MWh daje limit luźniejszy o ok. 18%, więc w każdej ofercie sprawdzamy, jak dostawca liczy cykle. Jeśli bramka nie przejdzie, zakup przesuwamy, a nie rezygnujemy. Rekomendacja walidacji i pilotażu z partnerem jest bez zmian, bo przychód w najbliższych latach dają cudze magazyny.

Rachunek 1 MW własnego magazynu w 2028 r. według oceny, w tys. zł: sprzedaż energii 895, zakup energii −378, potrzeby własne −21, marża gotówkowa 495 (koszt zużycia aplikacja pokazuje osobno, a model liczy zamiast niego prawdziwy wydatek na ogniwa), prowizja partnera −103, koszty operacyjne −124, EBITDA 268, podatek 0, gotówka na obsługę długu 268, rata przy kredycie na 60% nakładu −313, DSCR 0,86. DSCR spada w kolejnych latach do 0,40 w 2035 r. W latach 2034–2037 po ok. 72 rocznie idzie na rachunek rezerwy, z którego w 2037 r. dokładamy ogniwa (0,58 mln zł dla 2 MW); sam zakup nie pomniejsza już gotówki drugi raz.

Plan na 90 dni

Plan z recenzji, rozpisany na te same terminy co w ocenie dla inwestora. Każdy okres kończy się warunkiem, który da się sprawdzić, a nie datą.

OkresCo robi system i zespółCo robi PabloWarunek zakończenia
Dni 1–30
28.09 – 31.10.2026
Wersje 9–11 symulatora gotowe 28.09.2026: zegar zdarzeń, dziennik zleceń z czasem decyzji i wysłania, oferty energii bilansującej zamiast progu CEN, limit cykli, import w formacie wersji 9, parametry zamrożone, Test łączny, 836 dób danych i test na odłożonym okresie. Przeliczenie oceny dla inwestora na wyniku 12 miesięcy.do 10.10 zapytania do 3 partnerów POB/DUB (stawka, podstawa opłaty, zabezpieczenia, odpowiedzialność, przeniesienie jednostek bez kar) i 3 dostawców (2 MW / 8 MWh i 5–10 MW, gwarancja w cyklach i sposób ich liczenia); do 31.10 pisemne warunki i ofertyspełnione 28.09: pełny zakres danych wczytany, a ten sam zestaw danych daje ten sam wynik (skrypty w bess-app/odtworzenie-v11/); system odrzuca każde zlecenie po zamknięciu handlu; warunki od co najmniej 2 partnerów i 3 oferty dostawców
Dni 31–60
1.11 – 30.11.2026
Backtest za 12 miesięcy poza okresem strojenia jest policzony w wersji 11 (z podziałem na miesiące). Przygotowanie trybu cienia: dane na żywo, zapis decyzji przed zdarzeniami. Rachunek operatora i model zwrotu przeliczone na warunkach i ofertach z października.do 30.11 wybór partnera i obiektu do trybu cieniamarża operatora dodatnia na warunkach z ofert; tryb cienia gotowy do startu 1.12
Dni 61–90
1.12 – 31.12.2026
Tryb cienia na obiekcie partnera, w czasie możliwego startu MARI: decyzje zapisane przed zdarzeniami i porównane z rozliczeniem partnera. Zabezpieczenia przed handlem rzeczywistym.umowa o tryb cienia z partnerem; list intencyjny z właścicielem cudzego magazynuco najmniej 3 tygodnie decyzji bez naruszeń limitów, odchylenia od rozliczenia partnera wyjaśnione

Etap walidacji jest zakończony, gdy spełnione są cztery warunki z drugiej recenzji zewnętrznej (28.09.2026):

WarunekDowódStan w wersji 11
Dane RDB są poprawnie zidentyfikowaneszereg RDB uzgodniony ze źródłem TGE: produkt, początek albo koniec okresu, jednostki MW i MWh, sposób agregacji notowań ciągłych i aukcji IDAspełniony: zgodność z tabelami sesji TGE co do grosza; pełny zakres z tych samych tabel TGE (do 31.08.2025 z archiwum), sprawdzony drugim odczytem
Decyzje nie korzystają z przyszłościodtworzone dane dostępne w chwili każdej decyzji, z wersją rekordu PSEspełniony z założeniami: test zaburzeń bez różnic dla wszystkich strategii, a wyrocznię wykrywa; od wersji 11 test sprawdza też 4-dniowe opóźnienie rekordów rozliczeń PSE, bo pierwotnych wersji nie mamy
Poprawki działają razemjeden test łączący chronologię, wykonanie zleceń, koszty i ograniczenia bateriispełniony: „Test łączny” w Rozliczeniach, 12 chwil cięcia, wszystkie kontrole zaliczone
Wynik nie zależy od strojenia na tych samych dniachtest na odłożonym okresie przy zamrożonych parametrachspełniony: parametry z wersji 10 bez strojenia, kod wersji 11 zamrożony przed pierwszym przebiegiem; na 12 miesiącach DP 0,497 wobec 0,489 prostej strategii (+1,7%), na całym okresie odłożonym +1,8%

Spełnienie warunków znaczy, że wynikowi można ufać jako historycznemu backtestowi, a nie że strategia zarabia wyraźnie więcej niż prosta. Do dokumentu dla zarządu trafia jeden rozstrzygnięty zestaw wyników, z oznaczeniem wersji kodu, danych i założeń: aplikacja w wersji 11 z sumami kontrolnymi w bess-app/zmiany-wersja-11.md.

Na początku stycznia 2027 r. decydujemy o pilotażu na żywo, wielkości zespołu i dalszych pracach nad własnym magazynem, jeśli spełnione są trzy dowody z ramki wyżej. Sygnały stop z oceny: żaden partner nie daje do 30.11 warunków z łączną opłatą do 25%, backtest nie pobija prostej strategii, trybu cienia nie da się wykonać na czas albo rachunek operatora wymaga ponad 50 MW przy opłacie z udziałem w marży (przy stałej opłacie potrzeba 45–73 MW).

Wymagania przed handlem rzeczywistym

Żadne zlecenie nie trafi na rynek ani do magazynu, dopóki nie działa wszystkich osiem zabezpieczeń. Budujemy je w listopadzie i grudniu 2026 r., sprawdzamy w trybie cienia i muszą działać przed pilotażem na żywo.

WymaganieCo to znaczy w praktyceJak sprawdzamy
Niezależny rejestr transakcjikażde zlecenie, potwierdzenie i rozliczenie zapisuje się w osobnej bazie tylko do dopisywania, niezależnej od optymalizatora, z czasem decyzji, wysłania i potwierdzeniacodzienne uzgodnienie rejestru z potwierdzeniami giełdy i rozliczeniem partnera, różnice jako alert
Ochrona przed podwójnym zleceniemkażde zlecenie ma unikalny klucz; ponowne wysłanie po błędzie sieci nie tworzy drugiego zlecenia; bramka odrzuca zlecenie po zamknięciu handlutest z celowo zerwanym połączeniem i ponowieniem
Uprawnienia po stronie serwerarole i limity sprawdza serwer, nie przeglądarka; zlecenia ponad próg zatwierdza druga osoba; każda zmiana ustawień w dziennikupróba wysłania zlecenia z konta bez uprawnień
Limity stratlimit straty dziennej i miesięcznej, limit pozycji na kwadrans i na rynek, limit cykli z gwarancji; przekroczenie zatrzymuje nowe zleceniatest na historii z najgorszymi dobami
Monitoring łącznościsygnał życia z partnerem, giełdą i każdym obiektem co kilka sekund; brak sygnału to alarm dla dyżurućwiczenie awarii łącza raz w miesiącu
Zegar zdarzeńprzy każdej decyzji system wybiera najbliższy produkt, dla którego zdąży się pomiar, obliczenie, wysłanie i przyjęcie zlecenia przed zamknięciem handlu; symulator od wersji 10 ma taki zegar (odczyt +2 min, wysłanie +5 min, zapas 2 min), ale czasy trzeba zmierzyć na prawdziwym łączutest na historii ze zmierzonymi czasami każdego kroku i odrzuceniem zleceń, które nie zdążą
Dane z chwili decyzjidecyzja liczy się wyłącznie z wersji danych dostępnej w chwili decyzji (z czasem publikacji i korektami PSE), także progi cenowe, wybór rezerwy i początkowy stan naładowania planu; nie wystarczy dopisać zleceniu wcześniejszego czasuodtworzenie danych dostępnych przy każdej decyzji z publikacje.csv i korekty.csv i porównanie z decyzją
Bezpieczny tryb sterownikagdy platforma milknie, lokalny sterownik na obiekcie kończy już zakontraktowane dostawy i obowiązki rezerwy, a potem przechodzi w stan bezpieczny; nie przyjmuje nowych poleceń spoza platformytest na obiekcie przed pierwszym handlem i po każdej zmianie oprogramowania

Technologia

Pięć warstw z dokumentu projektu i infrastruktura pod nimi. Na start wybieramy prostsze narzędzia i dokładamy cięższe dopiero przy skali.

WarstwaNa start (etap 0–2)Przy skali (etap 3–4)
DanePython, harmonogram zadań Dagster lub Prefect, PostgreSQL z TimescaleDBRedpanda lub Kafka dla telemetrii, ClickHouse, archiwum S3 + Iceberg
PrognozyLightGBM z regresją kwantylową (P10–P90) na cenach i pogodziezespół modeli z dostrojonymi modelami czasowymi (Chronos, TimesFM)
DecyzjePyomo + HiGHS (open source), MILP stochastyczny, model degradacjiGurobi, handel na rynku dnia bieżącego, uczenie ze wzmocnieniem najpierw w trybie shadow
Wykonaniewymiana plików lub API z partnerem POB/DUBgateway na obiekcie: Modbus TCP, IEC 60870-5-104, OPC UA, IEC 61850; bufor offline; wyłącznik awaryjny; SOWE i LFC PSE
Portal i APIFastAPI, Next.js; obecny symulator jako makieta ekranówWebSockets na żywo, API dla klientów, asystent AI (np. Claude) według zasad niżej
Infrastrukturachmura w UE (Frankfurt), Terraform, Docker, Grafana; polityka bezpieczeństwa i procedury incydentów zgodne z NIS2 od starturegion zapasowy, Kubernetes, ISO 27001, IEC 62443 dla warstwy OT

Rola AI

AI ma zarabiać albo oszczędzać czas, a nie wyglądać nowocześnie. Dlatego ma dwie role z twardą granicą między nimi.

Prognozy

Model liczy się tylko przez wynik

Każdy model prognozujący (LightGBM, Chronos, TimesFM i następne) konkuruje z prostą strategią odniesienia na tym samym okresie, po kosztach i przy tym samym ryzyku. Wchodzi do produkcji tylko wtedy, gdy daje więcej złotych na MW, a nie gdy ma mniejszy błąd prognozy.

Asystent

Wyjaśnia i ostrzega, nie handluje

Asystent językowy tłumaczy operatorowi i klientowi, dlaczego system podjął decyzję, czyta dokumenty PSE i URE, np. zmiany WDB, i raportuje anomalie w danych i wynikach. Nie wysyła zleceń: każde zlecenie przechodzi przez twarde limity i kontrolę wykonania z tabeli wyżej.

Zespół i koszty

Koszt zespołu 4–5 osób z platformą, danymi, dyżurem, prawnikiem i ubezpieczeniem to ok. 2,3 mln zł rocznie, a w wariancie oszczędnym (3 osoby, dyżur u partnera) ok. 1,5 mln zł. Do decyzji w styczniu 2027 r. finansujemy tylko walidację i pilotaż, a nie pełny zespół.

Wariant naszej opłatyNasz przychód na MW rocznieMW do pokrycia 2,3 mln złMW do pokrycia 1,5 mln zł
Udział 10% marży90 / 50 tys. zł26 / 4617 / 30
Stała opłata 30 tys. zł/MW i 20% nadwyżki nad prostą strategią (nadwyżka 1,7–1,8% marży z 12 miesięcy)33 / 32 tys. zł70 / 7345 / 47
Udział 8% i opłata wdrożeniowa 50 tys. zł za obiekt72 / 40 tys. zł32 / 5821 / 38

Pierwsza liczba przy marży właściciela 0,9 mln zł/MW rocznie (obiekt z rezerwą po wejściu 250 MW nowych magazynów, B w wersji 11 ok. 0,9 przed prowizją), druga przy 0,5 mln zł (sam handel energią, A w wersji 11 na 12 miesiącach). Obsługa cudzych magazynów pokrywa koszty zespołu dopiero przy ok. 20–70 MW; stała opłata daje mniej, bo przewaga nad prostą strategią to na 12 miesiącach 1,7–1,8%, ale jest pewniejsza. Dane z 16. wersji oceny dla inwestora (przeliczonej na aplikacji w wersji 11); stawki partnerów to założenie do sprawdzenia w pisemnych warunkach.

Etap 0–2

4–5 osób

Lider techniczny i backend, inżynier danych, specjalista od optymalizacji i prognoz, frontend na pół etatu, ekspert rynku lub trader na pół etatu.

Etap 3–4

+3–4 osoby i dyżur

Inżynier OT do integracji z magazynem, DevOps i bezpieczeństwo, dyżur 24/7 (co najmniej 5 osób w rotacji albo u partnera).

Koszt technologiiEtap 1 · white-labelEtap 2 · skala
Chmura i bazy danych2–6 tys. EUR / mies.8–20 tys. EUR / mies.
Dane pogodowe i rynkowe1–5 tys. EUR / mies.5–12 tys. EUR / mies.
SolverHiGHS, 0 złGurobi, licencja roczna wg wyceny
LLM i agenci0,5–3 tys. EUR / mies.3–8 tys. EUR / mies.
Węzeł komunikacji z PSE0 zł (węzeł partnera; dokument projektu podaje prowizję 20–30% od usług bilansujących, umowa optymalizacyjna zakłada dla partnera 10–15% marży, a aplikacja i rachunek 1 MW przyjmują 20%)200–400 tys. zł jednorazowo
ISO 27001 i cyberbezpieczeństwopolityki40–80 tys. EUR

Koszty technologii pochodzą z dokumentu projektu (rozdz. 9.6) i wymagają potwierdzenia ofertami. Wynagrodzenia zespołu nie są w nich ujęte.

→Najbliższe kroki

  1. Do 10.10.2026. Zapytania do 3 partnerów POB/DUB i 3 dostawców magazynu (Pablo). Przejrzeć w Laboratorium wynik pełnego zakresu i miesiące, w których DP przegrywa z prostą strategią. Przykład z 20.09.2026: w pierwszych czterech godzinach aukcja aFRR płaciła 93–110 zł/MW/h w górę i 350–516 zł/MW/h w dół, a CEN wahała się od 501 do 2120 zł/MWh.
  2. Do 31.10.2026. Pisemne warunki od co najmniej 2 partnerów, z prawem przeniesienia jednostek bez kar, i 3 oferty dostawców. Ocena dla inwestora przeliczona na wyniku 12 miesięcy.
  3. Do 30.11.2026. Tryb cienia przygotowany na danych na żywo, rachunek operatora na warunkach z ofert, wybór partnera i obiektu do trybu cienia.
  4. 1.12 – 31.12.2026. Tryb cienia na obiekcie partnera i list intencyjny z właścicielem cudzego magazynu.
  5. Początek stycznia 2027. Decyzja o pilotażu na żywo (do 31.03.2027), wielkości zespołu i własnym magazynie, jeśli spełnione są trzy dowody.