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.
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.
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 raport | Pole | Kiedy dostępne | Koszt |
|---|---|---|---|---|
| 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_pln | D−1 ok. 13:40 | 0 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 kwadrans | rce_pln | D−1 ok. 14:05 | 0 zł |
| Cena niezbilansowania CEN 15 min, zł/MWh | PSE, raport Ceny rozliczeniowe RB · API crb-rozl | cen_cost | następnego dnia ok. 14:10–14:45; część dób PSE publikuje ponownie po 3–4 dniach | 0 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 kierunku | ceb_sr_afrrg_cost, ceb_sr_afrrd_cost | jak CEN | 0 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 onmb | D−1 po aukcji, godzinowo | 0 zł |
| Energia aktywowana aFRR 15 min, MWh | PSE, API eb-rozl; wolumen, który PSE aktywowało w danym kierunku | eb_afrrg, eb_afrrd | następnego dnia ok. 14:00–15:40 czasu polskiego | 0 zł |
| Zapotrzebowanie PSE na moc aFRR MW | PSE, API zmb; po zmianach WDB 5/2026 może się zmieniać w czasie | zmb_afrrg, zmb_afrrd | D−1 rano | 0 zł |
| Kontrola i rynki UE | ENTSO-E Transparency · strefa PL (10YPL-AREA-----S), ceny DA i niezbilansowania | biblioteka entsoe-py | D−1 | 0 zł, token API na e-mail |
| Oficjalne wyniki giełdy | TGE, wyniki RDN · archiwum w większym zakresie odpłatnie | tabela na stronie | D−1 po aukcji | strona 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 godzinowy | w trybie ścisłym wymagana dla magazynu B i strategii A „RDN + RDB”; w starym pliku opcjonalna 4. kolumna | po dobie dostawy | strona 0 zł |
| Pogoda (do prognoz, etap wdrożenia) | Open-Meteo, ECMWF Open Data, DWD ICON-EU | wiatr, nasłonecznienie, temperatura | prognozy co 1–6 h | 0 zł na start |
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'.
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.
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:
- 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.
- Network access ustaw na Custom. W Allowed domains wpisz w osobnych wierszach
api.raporty.pse.pl,tge.pli*.tge.pl. Zaznacz „Also include default list of common package managers” i kliknij Create environment. - 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.
| Plik | Co zawiera |
|---|---|
kwadranse_RRRR-MM.csv | jeden 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.csv | dla 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.csv | każ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.csv | każ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.txt | ską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.
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
- Zainstaluj Pythona 3 z python.org. Na Windows zaznacz w instalatorze „Add Python to PATH”. Dodatkowe biblioteki nie są potrzebne.
- Zapisz skrypt
pobierz_ceny_pse.pyw dowolnym folderze. Pobierz go tutaj: pobierz_ceny_pse.py. Jego treść jest też poniżej. - Uruchom go w tym folderze, podając pierwszą i ostatnią dobę. Na Windows zamiast
python3wpiszpy.Powstanie plikpython3 pobierz_ceny_pse.py 2026-06-01 2026-09-20
ceny_pse.csv. Skrypt wypisze, ile dób zapisał, które pominął i jaką średnią stawkę rezerwy aFRR zobaczył. - Wczytaj plik w aplikacji: Ustawienia → Dane cenowe → Wybierz plik → Wczytaj plik.
- 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
- 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. - 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.
- Zapisz jako CSV (rozdzielany średnikami) i wczytaj jak w kroku 4 powyżej.
| Zasada pliku | Szczegóły |
|---|---|
| Wiersz | 2026-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. |
| Zakres | co 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. |
| Braki | doba 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 aktywacje | stary 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 |
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”.
| Zastosowanie | Dziś | Czego brakuje | Kiedy |
|---|---|---|---|
| Nauka rynku i warsztaty | Tak, z listą uproszczeń z ramki „Czego model jeszcze nie obejmuje” | nic, poza pokazywaniem uproszczeń przy wynikach | już teraz |
| Porównywanie strategii | Warunkowo, 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 dobach | tryb cienia od 1.12.2026 |
| Ocena inwestycji i bramka zakupu | Jako wejście: wynik 12 miesięcy to historyczny backtest na zasadach z tamtego okresu, a nie prognoza | realna 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 Pulpitu | backtest do 30.11.2026, bramka do 30.06.2027 |
| Rozmowy z klientami o przychodach | Nie, bez obietnic rentowności | tryb cienia z partnerem: decyzje zapisane przed zdarzeniami i porównane z wykonaniem i rozliczeniem | po trybie cienia w grudniu 2026 i decyzji w styczniu 2027 |
| Rynek mFRR i platforma MARI | Nie, brak w modelu | produkty mFRR i oferty energii FRR ze zmian WDB 6/2026; w wersji 11 oferty energii z wolnej mocy są tylko wariantem hipotetycznym | po zatwierdzeniu zmian 6/2026 przez URE |
| Sterowanie prawdziwym magazynem | Nie | osobna warstwa wykonania, kontrola ryzyka i integracja z partnerem POB/DUB, według wymagań przed handlem rzeczywistym | pilotaż przez partnera do 31.03.2027 |
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
- Otwórz aplikację i kliknij Udostępnij (Share).
- 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ć.
- 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
| Element | Co robi |
|---|---|
| Rozlicz dobę | zamyka aukcję i rozlicza jedną dobę po cenach rzeczywistych; nowe doby z codziennej aktualizacji rozliczają się same przy otwarciu |
| Odtwarzaj | rozlicza kolejne doby automatycznie, jak film; drugi klik zatrzymuje |
| Do końca | rozlicza wszystkie pozostałe doby naraz, najwyżej 400 na kliknięcie; przy długiej historii strona jest wtedy zablokowana nawet przez kilka minut |
| Od nowa | wraca 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 |
| Zegar | ostatnia rozliczona doba, doba, na którą trwa aukcja RDN, i postęp całego okresu |
Moduły
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
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.
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.
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.
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.
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.
Ryzyko
Rozkład wyników dobowych, VaR, obsunięcia, wrażliwość na stawkę aFRR (wynik za okres danych).
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.
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.
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
- Pulpit. Sprawdź wynik wczorajszej doby, stan naładowania i alerty, np. przekroczony limit cykli.
- Rynek. Obejrzyj ceny ostatnich dób i porównaj je z prognozą na dobę aukcji.
- 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.
- 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.
- 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”.
- 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”.
| Grupa | Parametr | Domyślnie | Kiedy zmieniać |
|---|---|---|---|
| Oba magazyny | Moc / pojemność | 2 MW / 8 MWh | test innego magazynu, np. 10 MW / 40 MWh |
| SoC min / max | 5% / 95% | wymagania gwarancji producenta | |
| Sprawność cyklu | 88% | dane z karty katalogowej lub pomiarów | |
| Koszt zużycia w decyzjach | 60 zł/MWh | działa w decyzjach automatu; wynik gotówkowy go nie odejmuje, jest pokazany osobno | |
| Opłaty rynkowe | 1 zł/MWh | po poznaniu stawek TGE i IRGIT | |
| Żywotność, SOH na koniec życia | 6000 · 80% | warunki gwarancji; SOH obniża pojemność i sprawność | |
| Limit cykli na dobę (w planie) | 1,21 | 6000 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 życia | 2 pkt | założenie; rośnie ze spadkiem SOH | |
| Potrzeby własne | 10 kW | klimatyzacja i BMS, kupowane po cenie RDN; wpisz dane dostawcy | |
| Zegar zdarzeń: odczyt stanu, wysłanie, zapas przed bramką | 2 · 5 · 2 min | razem 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 publikacji | 4 | CEN 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 startowa | 500 000 zł | tylko do salda gotówki na Pulpicie | |
| Dni pracy w roku | 330 | tylko do wyniku rocznego; reszta to przestoje, serwis i testy | |
| A · RDN | Strategia automatu | optymalizacja 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 doby | 50% | cel planu dobowego; DP planuje 2 doby naprzód, więc stan o północy wynika z opłacalności | |
| Awersja do ryzyka | 0,3 | tylko strategia scenariuszowa; wyżej to mniej złych dób kosztem średniego wyniku | |
| Cena transakcji na RDB | gorsza z RDB i RDN | ostroż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 + RDB | brak | prognoza 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 doby | tylko notowania ciągłe | aukcje 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 RDB | 20 zł/MWh | spread i poślizg ponad cenę z pola wyżej; założenie do zastąpienia danymi z pilotażu | |
| Maks. udział w obrocie RDB | 10% | 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ący | Strategia automatu | rezerwa 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 aFRR | 2 MW | gó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 rezerwy | ceny z danych PSE | „stała stawka” tylko przy starym pliku w trybie demonstracyjnym | |
| Oferta cenowa na rezerwę | 30 zł/MW/h | aukcja płaci cenę rozliczeniową, a oferta przegrywa, gdy ta cena spadnie poniżej oferty | |
| Nowe magazyny w aFRR | 0 MW | test konkurencji: 250, 500 i 1000 MW nowych magazynów obniża cenę rezerwy | |
| Zapotrzebowanie PSE, nachylenie γ | z raportu zmb · 1,0 | 400 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 rezerwy | cena RDN ± narzut 0 zł/MWh | aktywacja, 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 SoC | RDB i program pracy | korekta 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 / 75 | tylko w strategiach z ofertami energii z wolnej mocy (wariant hipotetyczny) | |
| Aktywacje w trybie demonstracyjnym | 100 · 800 zł/MWh · 1 | tylko 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 aukcji | ponad 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ści | 0,5 h | energia, którą rezerwa musi mieć zawsze; założenie | |
| Zapas energii ponad pasmo | zmienny, 95. percentyl | energia 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/DUB | 20% | od przychodu z rezerwy, aktywacji i energii bilansującej; wpisz stawkę z oferty partnera | |
| Średnia roczna stawka rezerwy | 141 zł/MW/h | tylko 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Prowizja partnera. Zmień prowizję POB/DUB z 20% na stawkę z oferty partnera i sprawdź, ile zostaje z wyniku B.
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
| Etap | Termin | Co powstaje | Warunek przejścia dalej |
|---|---|---|---|
| 0 · Walidacja i warunki | 28.09 – 30.11.2026 | Wersje 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 partnerem | 1.12 – 31.12.2026 | System 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 żywo | 01 – 03.2027 | Handel 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 klienta | do 30.06.2027 | Cudzy 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 · Skala | 31.12.2027 – 2029 | Do 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 |
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ą.
| Okres | Co robi system i zespół | Co robi Pablo | Warunek 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 oferty | speł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 cienia | marż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 magazynu | co 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):
| Warunek | Dowód | Stan w wersji 11 |
|---|---|---|
| Dane RDB są poprawnie zidentyfikowane | szereg 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 IDA | speł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ści | odtworzone dane dostępne w chwili każdej decyzji, z wersją rekordu PSE | speł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ą razem | jeden test łączący chronologię, wykonanie zleceń, koszty i ograniczenia baterii | spełniony: „Test łączny” w Rozliczeniach, 12 chwil cięcia, wszystkie kontrole zaliczone |
| Wynik nie zależy od strojenia na tych samych dniach | test na odłożonym okresie przy zamrożonych parametrach | speł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.
| Wymaganie | Co to znaczy w praktyce | Jak sprawdzamy |
|---|---|---|
| Niezależny rejestr transakcji | każde zlecenie, potwierdzenie i rozliczenie zapisuje się w osobnej bazie tylko do dopisywania, niezależnej od optymalizatora, z czasem decyzji, wysłania i potwierdzenia | codzienne uzgodnienie rejestru z potwierdzeniami giełdy i rozliczeniem partnera, różnice jako alert |
| Ochrona przed podwójnym zleceniem | każde zlecenie ma unikalny klucz; ponowne wysłanie po błędzie sieci nie tworzy drugiego zlecenia; bramka odrzuca zlecenie po zamknięciu handlu | test z celowo zerwanym połączeniem i ponowieniem |
| Uprawnienia po stronie serwera | role i limity sprawdza serwer, nie przeglądarka; zlecenia ponad próg zatwierdza druga osoba; każda zmiana ustawień w dzienniku | próba wysłania zlecenia z konta bez uprawnień |
| Limity strat | limit straty dziennej i miesięcznej, limit pozycji na kwadrans i na rynek, limit cykli z gwarancji; przekroczenie zatrzymuje nowe zlecenia | test na historii z najgorszymi dobami |
| Monitoring łączności | sygnał ż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 łączu | test na historii ze zmierzonymi czasami każdego kroku i odrzuceniem zleceń, które nie zdążą |
| Dane z chwili decyzji | decyzja 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 czasu | odtworzenie danych dostępnych przy każdej decyzji z publikacje.csv i korekty.csv i porównanie z decyzją |
| Bezpieczny tryb sterownika | gdy 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 platformy | test 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.
| Warstwa | Na start (etap 0–2) | Przy skali (etap 3–4) |
|---|---|---|
| Dane | Python, harmonogram zadań Dagster lub Prefect, PostgreSQL z TimescaleDB | Redpanda lub Kafka dla telemetrii, ClickHouse, archiwum S3 + Iceberg |
| Prognozy | LightGBM z regresją kwantylową (P10–P90) na cenach i pogodzie | zespół modeli z dostrojonymi modelami czasowymi (Chronos, TimesFM) |
| Decyzje | Pyomo + HiGHS (open source), MILP stochastyczny, model degradacji | Gurobi, handel na rynku dnia bieżącego, uczenie ze wzmocnieniem najpierw w trybie shadow |
| Wykonanie | wymiana plików lub API z partnerem POB/DUB | gateway na obiekcie: Modbus TCP, IEC 60870-5-104, OPC UA, IEC 61850; bufor offline; wyłącznik awaryjny; SOWE i LFC PSE |
| Portal i API | FastAPI, Next.js; obecny symulator jako makieta ekranów | WebSockets na żywo, API dla klientów, asystent AI (np. Claude) według zasad niżej |
| Infrastruktura | chmura w UE (Frankfurt), Terraform, Docker, Grafana; polityka bezpieczeństwa i procedury incydentów zgodne z NIS2 od startu | region 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.
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.
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łaty | Nasz przychód na MW rocznie | MW do pokrycia 2,3 mln zł | MW do pokrycia 1,5 mln zł |
|---|---|---|---|
| Udział 10% marży | 90 / 50 tys. zł | 26 / 46 | 17 / 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 / 73 | 45 / 47 |
| Udział 8% i opłata wdrożeniowa 50 tys. zł za obiekt | 72 / 40 tys. zł | 32 / 58 | 21 / 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.
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.
+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 technologii | Etap 1 · white-label | Etap 2 · skala |
|---|---|---|
| Chmura i bazy danych | 2–6 tys. EUR / mies. | 8–20 tys. EUR / mies. |
| Dane pogodowe i rynkowe | 1–5 tys. EUR / mies. | 5–12 tys. EUR / mies. |
| Solver | HiGHS, 0 zł | Gurobi, licencja roczna wg wyceny |
| LLM i agenci | 0,5–3 tys. EUR / mies. | 3–8 tys. EUR / mies. |
| Węzeł komunikacji z PSE | 0 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ństwo | polityki | 40–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
- 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.
- 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.
- 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.
- 1.12 – 31.12.2026. Tryb cienia na obiekcie partnera i list intencyjny z właścicielem cudzego magazynu.
- 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.