HU1 studie: --pure-bess a --rt-eff flagy + výsledky čistého BESS
Zadání majitele: čistý BESS bez odběru, export povolen, varianta bez ztrát. Výsledky (365 dní vč. zimy 25/26): arbitráž na spotu +129.4 tis. Kč/rok (η=1.0) / +110.0 tis. (η=0.9); konzervativně (spready −30 % + deg 0.5) +63.4 tis. Na fixní smlouvě jen ~24–35 tis. → spot je podmínka smysluplnosti BESS. Léto ~378 Kč/den, zima ~308. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,7 +19,7 @@ perfect-hindsight studie (`hu1_bess_study.py`) dala horní mez; tady je
|
|||||||
- **Žádný perfect hindsight** v hlavních číslech; hindsight (7denní okna,
|
- **Žádný perfect hindsight** v hlavních číslech; hindsight (7denní okna,
|
||||||
plná znalost) běží zvlášť jen kvůli GAPu.
|
plná znalost) běží zvlášť jen kvůli GAPu.
|
||||||
- Parametry **přesně z DB site 5**: baterie 128 kWh,
|
- Parametry **přesně z DB site 5**: baterie 128 kWh,
|
||||||
36 kW nabíjení/vybíjení, η 0.95/0.95,
|
36 kW nabíjení/vybíjení, η 1.00/1.00,
|
||||||
SoC 10–95 %,
|
SoC 10–95 %,
|
||||||
degradace 0.15 Kč/kWh; grid import 43 kW /
|
degradace 0.15 Kč/kWh; grid import 43 kW /
|
||||||
**export 42 kW povolen** (`no_export=false`),
|
**export 42 kW povolen** (`no_export=false`),
|
||||||
@@ -58,72 +58,72 @@ Scénáře (Kč/den, kladné = náklad): **A** fix bez baterie · **B** fix + ba
|
|||||||
|
|
||||||
| období | dní | A fix bez bat | B fix+bat | C spot bez bat | D spot+bat | D−A | D−B |
|
| období | dní | A fix bez bat | B fix+bat | C spot bez bat | D spot+bat | D−A | D−B |
|
||||||
|--------|-----|---------------|-----------|----------------|------------|-----|-----|
|
|--------|-----|---------------|-----------|----------------|------------|-----|-----|
|
||||||
| léto (4–9) | 425 | 789 | 760 | 460 | 131 | -658 | -629 |
|
| léto (4–9) | 425 | 0 | -55 | 0 | -378 | -378 | -323 |
|
||||||
| zima (10–3) | 363 | 789 | 744 | 736 | 490 | -300 | -254 |
|
| zima (10–3) | 363 | 0 | -144 | 0 | -308 | -308 | -164 |
|
||||||
|
|
||||||
## Kč/den po měsících (SoC-adjusted, vč. degradace)
|
## Kč/den po měsících (SoC-adjusted, vč. degradace)
|
||||||
|
|
||||||
| období | dní | A fix bez bat | B fix+bat | C spot bez bat | D spot+bat | D−A | D−B |
|
| období | dní | A fix bez bat | B fix+bat | C spot bez bat | D spot+bat | D−A | D−B |
|
||||||
|--------|-----|---------------|-----------|----------------|------------|-----|-----|
|
|--------|-----|---------------|-----------|----------------|------------|-----|-----|
|
||||||
| 2024-04 | 17 | 783 | 780 | 458 | 226 | -556 | -553 |
|
| 2024-04 | 17 | 0 | -14 | 0 | -271 | -271 | -258 |
|
||||||
| 2024-05 | 31 | 806 | 804 | 394 | 130 | -676 | -673 |
|
| 2024-05 | 31 | 0 | -7 | 0 | -301 | -301 | -294 |
|
||||||
| 2024-06 | 30 | 757 | 734 | 448 | 147 | -610 | -587 |
|
| 2024-06 | 30 | 0 | -47 | 0 | -346 | -346 | -298 |
|
||||||
| 2024-07 | 31 | 806 | 788 | 425 | 135 | -671 | -653 |
|
| 2024-07 | 31 | 0 | -35 | 0 | -333 | -333 | -298 |
|
||||||
| 2024-08 | 31 | 785 | 739 | 498 | 159 | -626 | -580 |
|
| 2024-08 | 31 | 0 | -75 | 0 | -392 | -392 | -317 |
|
||||||
| 2024-09 | 30 | 779 | 736 | 493 | 181 | -598 | -555 |
|
| 2024-09 | 30 | 0 | -65 | 0 | -359 | -359 | -294 |
|
||||||
| 2024-10 | 31 | 806 | 778 | 581 | 290 | -516 | -488 |
|
| 2024-10 | 31 | 0 | -72 | 0 | -339 | -339 | -267 |
|
||||||
| 2024-11 | 30 | 779 | 692 | 839 | 594 | -185 | -98 |
|
| 2024-11 | 30 | 0 | -231 | 0 | -307 | -307 | -76 |
|
||||||
| 2024-12 | 31 | 785 | 687 | 904 | 647 | -138 | -41 |
|
| 2024-12 | 31 | 0 | -285 | 0 | -311 | -311 | -26 |
|
||||||
| 2025-01 | 31 | 806 | 754 | 851 | 635 | -171 | -119 |
|
| 2025-01 | 31 | 0 | -180 | 0 | -278 | -278 | -98 |
|
||||||
| 2025-02 | 28 | 788 | 750 | 833 | 635 | -153 | -115 |
|
| 2025-02 | 28 | 0 | -175 | 0 | -271 | -271 | -96 |
|
||||||
| 2025-03 | 30 | 779 | 753 | 585 | 277 | -502 | -476 |
|
| 2025-03 | 30 | 0 | -70 | 0 | -368 | -368 | -298 |
|
||||||
| 2025-04 | 30 | 800 | 791 | 457 | 110 | -690 | -680 |
|
| 2025-04 | 30 | 0 | -34 | 0 | -394 | -394 | -361 |
|
||||||
| 2025-05 | 31 | 785 | 773 | 385 | 36 | -749 | -737 |
|
| 2025-05 | 31 | 0 | -27 | 0 | -389 | -389 | -362 |
|
||||||
| 2025-06 | 30 | 779 | 743 | 395 | 16 | -763 | -728 |
|
| 2025-06 | 30 | 0 | -61 | 0 | -423 | -423 | -361 |
|
||||||
| 2025-07 | 30 | 800 | 771 | 527 | 312 | -489 | -459 |
|
| 2025-07 | 30 | 0 | -43 | 0 | -266 | -266 | -223 |
|
||||||
| 2025-08 | 31 | 764 | 743 | 402 | 100 | -664 | -643 |
|
| 2025-08 | 31 | 0 | -37 | 0 | -345 | -345 | -307 |
|
||||||
| 2025-09 | 30 | 800 | 719 | 558 | 136 | -664 | -583 |
|
| 2025-09 | 30 | 0 | -137 | 0 | -478 | -478 | -340 |
|
||||||
| 2025-10 | 31 | 806 | 746 | 636 | 300 | -506 | -445 |
|
| 2025-10 | 31 | 0 | -123 | 0 | -404 | -404 | -281 |
|
||||||
| 2025-11 | 30 | 757 | 723 | 717 | 506 | -251 | -216 |
|
| 2025-11 | 30 | 0 | -121 | 0 | -268 | -268 | -147 |
|
||||||
| 2025-12 | 31 | 806 | 797 | 701 | 577 | -229 | -220 |
|
| 2025-12 | 31 | 0 | -50 | 0 | -173 | -173 | -123 |
|
||||||
| 2026-01 | 31 | 785 | 739 | 878 | 669 | -116 | -70 |
|
| 2026-01 | 31 | 0 | -213 | 0 | -269 | -269 | -56 |
|
||||||
| 2026-02 | 28 | 788 | 785 | 689 | 546 | -242 | -240 |
|
| 2026-02 | 28 | 0 | -36 | 0 | -198 | -198 | -162 |
|
||||||
| 2026-03 | 31 | 785 | 728 | 622 | 218 | -566 | -510 |
|
| 2026-03 | 31 | 0 | -160 | 0 | -493 | -493 | -333 |
|
||||||
| 2026-04 | 30 | 800 | 782 | 449 | 29 | -772 | -753 |
|
| 2026-04 | 30 | 0 | -57 | 0 | -483 | -483 | -426 |
|
||||||
| 2026-05 | 31 | 764 | 717 | 485 | 75 | -689 | -641 |
|
| 2026-05 | 31 | 0 | -101 | 0 | -477 | -477 | -376 |
|
||||||
| 2026-06 | 12 | 865 | 823 | 631 | 344 | -521 | -479 |
|
| 2026-06 | 12 | 0 | -82 | 0 | -359 | -359 | -278 |
|
||||||
|
|
||||||
## Roční projekce (posledních 365 simulovaných dní)
|
## Roční projekce (posledních 365 simulovaných dní)
|
||||||
|
|
||||||
| metrika | Kč/rok |
|
| metrika | Kč/rok |
|
||||||
|---------|--------|
|
|---------|--------|
|
||||||
| A fix bez baterie | 287615 |
|
| A fix bez baterie | 0 |
|
||||||
| B fix + baterie (dnešní stav) | 273979 |
|
| B fix + baterie (dnešní stav) | -35136 |
|
||||||
| C spot bez baterie | 218077 |
|
| C spot bez baterie | 0 |
|
||||||
| D spot + baterie (návrh) | 110392 |
|
| D spot + baterie (návrh) | -129394 |
|
||||||
| **D−B: přechod na spot (s baterií)** | **-163587** |
|
| **D−B: přechod na spot (s baterií)** | **-94258** |
|
||||||
| D−A: spot+baterie vs fix bez baterie | -177223 |
|
| D−A: spot+baterie vs fix bez baterie | -129394 |
|
||||||
| C−A: jen změna smlouvy, bez baterie | -69538 |
|
| C−A: jen změna smlouvy, bez baterie | +0 |
|
||||||
| C−D: hodnota baterie na spotu | +107685 |
|
| C−D: hodnota baterie na spotu | +129394 |
|
||||||
|
|
||||||
**Interval nejistoty D−B: -163587 … -110069 Kč/rok**
|
**Interval nejistoty D−B: -94258 … -42535 Kč/rok**
|
||||||
(konzervativní = spready −30 % + degradace 0.50 Kč/kWh na obou stranách).
|
(konzervativní = spready −30 % + degradace 0.50 Kč/kWh na obou stranách).
|
||||||
|
|
||||||
## GAP realistic vs perfect hindsight (scénář D)
|
## GAP realistic vs perfect hindsight (scénář D)
|
||||||
|
|
||||||
realistic 296.2 vs hindsight 296.2 Kč/den; GAP -0.1 Kč/den (-51 Kč za 788 dní)
|
Hindsight varianta přeskočena (--skip-hindsight).
|
||||||
|
|
||||||
## Citlivosti (roční projekce, Kč/rok)
|
## Citlivosti (roční projekce, Kč/rok)
|
||||||
|
|
||||||
| varianta | Kč/rok |
|
| varianta | Kč/rok |
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
| D deg 0.15 | 110392 |
|
| D deg 0.15 | -129394 |
|
||||||
| D deg 0.50 | 130657 |
|
| D deg 0.50 | -104542 |
|
||||||
| D deg 1.00 | 153008 |
|
| D deg 1.00 | -77960 |
|
||||||
| D compress −30 % | 153358 |
|
| D compress −30 % | -85622 |
|
||||||
| D compress −30 % + deg 0.50 | 170648 |
|
| D compress −30 % + deg 0.50 | -63410 |
|
||||||
| B compress −30 % | 280717 |
|
| B compress −30 % | -20874 |
|
||||||
| C compress −30 % | 220469 |
|
| C compress −30 % | 0 |
|
||||||
|
|
||||||
## Interpretace a doporučení
|
## Interpretace a doporučení
|
||||||
|
|
||||||
@@ -134,11 +134,11 @@ realistic 296.2 vs hindsight 296.2 Kč/den; GAP -0.1 Kč/den (-51 Kč za 788 dn
|
|||||||
budoucnosti. V reálu přibude chyba predikce odběru — s reálným diagramem
|
budoucnosti. V reálu přibude chyba predikce odběru — s reálným diagramem
|
||||||
studii přegenerovat.
|
studii přegenerovat.
|
||||||
- **Zima je slabší, ale zůstává kladná**: sezónní rozpad D−B —
|
- **Zima je slabší, ale zůstává kladná**: sezónní rozpad D−B —
|
||||||
léto (4–9): -629 Kč/den; zima (10–3): -254 Kč/den.
|
léto (4–9): -323 Kč/den; zima (10–3): -164 Kč/den.
|
||||||
Nejslabší měsíc v datech (2024-12): D−B -41 Kč/den —
|
Nejslabší měsíc v datech (2024-12): D−B -26 Kč/den —
|
||||||
ani v zimě s malými spready nebyl přechod na spot ztrátový.
|
ani v zimě s malými spready nebyl přechod na spot ztrátový.
|
||||||
- **Doporučení (za předpokladů výše)**: přechod na spot dává base úsporu
|
- **Doporučení (za předpokladů výše)**: přechod na spot dává base úsporu
|
||||||
**-163587 Kč/rok** (D−B), konzervativně -110069 Kč/rok.
|
**-94258 Kč/rok** (D−B), konzervativně -42535 Kč/rok.
|
||||||
Před podpisem smlouvy doplnit data od majitele (níže) a studii
|
Před podpisem smlouvy doplnit data od majitele (níže) a studii
|
||||||
přegenerovat — čísla škálují s odběrovým profilem a fixní cenou.
|
přegenerovat — čísla škálují s odběrovým profilem a fixní cenou.
|
||||||
|
|
||||||
|
|||||||
@@ -152,8 +152,10 @@ async def load_site_params(conn: asyncpg.Connection) -> SiteParams:
|
|||||||
usable_capacity_wh=float(b["usable_capacity_wh"]),
|
usable_capacity_wh=float(b["usable_capacity_wh"]),
|
||||||
min_soc_wh=float(b["min_soc_wh"]),
|
min_soc_wh=float(b["min_soc_wh"]),
|
||||||
soc_max_wh=float(b["soc_max_wh"]),
|
soc_max_wh=float(b["soc_max_wh"]),
|
||||||
charge_efficiency=float(b["charge_efficiency"]),
|
charge_efficiency=(RT_EFF_OVERRIDE ** 0.5 if RT_EFF_OVERRIDE is not None
|
||||||
discharge_efficiency=float(b["discharge_efficiency"]),
|
else float(b["charge_efficiency"])),
|
||||||
|
discharge_efficiency=(RT_EFF_OVERRIDE ** 0.5 if RT_EFF_OVERRIDE is not None
|
||||||
|
else float(b["discharge_efficiency"])),
|
||||||
max_charge_power_w=float(b["max_charge_power_w"]),
|
max_charge_power_w=float(b["max_charge_power_w"]),
|
||||||
max_discharge_power_w=float(b["max_discharge_power_w"]),
|
max_discharge_power_w=float(b["max_discharge_power_w"]),
|
||||||
degradation_cost_czk_kwh=float(b["degradation_cost_czk_kwh"]),
|
degradation_cost_czk_kwh=float(b["degradation_cost_czk_kwh"]),
|
||||||
@@ -230,8 +232,14 @@ async def load_ote_days(
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Odběrový profil a ceny
|
# Odběrový profil a ceny
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
PURE_BESS = False #: True → nulový odběr (--pure-bess)
|
||||||
|
RT_EFF_OVERRIDE: float | None = None #: --rt-eff (1.0 = bez ztrát)
|
||||||
|
|
||||||
|
|
||||||
def load_profile_w(ts_utc: datetime) -> float:
|
def load_profile_w(ts_utc: datetime) -> float:
|
||||||
"""Parametrizovaný průmyslový odběr (W) pro slot začínající ts_utc."""
|
"""Parametrizovaný průmyslový odběr (W) pro slot začínající ts_utc."""
|
||||||
|
if PURE_BESS:
|
||||||
|
return 0.0
|
||||||
local = ts_utc.astimezone(PRAGUE)
|
local = ts_utc.astimezone(PRAGUE)
|
||||||
load = LOAD_BASE_W
|
load = LOAD_BASE_W
|
||||||
is_workday = local.weekday() < 5 or not PEAK_WORKDAYS_ONLY
|
is_workday = local.weekday() < 5 or not PEAK_WORKDAYS_ONLY
|
||||||
@@ -464,6 +472,9 @@ def annualize(rs: list[DayResult], getter) -> float:
|
|||||||
# Main
|
# Main
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
async def run(args: argparse.Namespace) -> None:
|
async def run(args: argparse.Namespace) -> None:
|
||||||
|
global PURE_BESS, RT_EFF_OVERRIDE
|
||||||
|
PURE_BESS = bool(getattr(args, "pure_bess", False))
|
||||||
|
RT_EFF_OVERRIDE = getattr(args, "rt_eff", None)
|
||||||
dsn = _build_dsn(args)
|
dsn = _build_dsn(args)
|
||||||
try:
|
try:
|
||||||
conn = await asyncpg.connect(dsn, timeout=15)
|
conn = await asyncpg.connect(dsn, timeout=15)
|
||||||
@@ -780,6 +791,10 @@ def main() -> None:
|
|||||||
)
|
)
|
||||||
p.add_argument("--from", dest="range_from", default=None, help="YYYY-MM-DD (Prague)")
|
p.add_argument("--from", dest="range_from", default=None, help="YYYY-MM-DD (Prague)")
|
||||||
p.add_argument("--to", dest="range_to", default=None, help="YYYY-MM-DD (Prague), včetně")
|
p.add_argument("--to", dest="range_to", default=None, help="YYYY-MM-DD (Prague), včetně")
|
||||||
|
p.add_argument("--pure-bess", action="store_true",
|
||||||
|
help="čistý BESS: nulový odběr (jen arbitráž nákup/prodej)")
|
||||||
|
p.add_argument("--rt-eff", default=None, type=float,
|
||||||
|
help="přepiš round-trip účinnost (např. 1.0 = bez ztrát, 0.9 = realisticky); default = hodnoty z DB")
|
||||||
p.add_argument("--fix-buy", default=FIX_BUY_CZK_KWH_DEFAULT, type=float,
|
p.add_argument("--fix-buy", default=FIX_BUY_CZK_KWH_DEFAULT, type=float,
|
||||||
help="dnešní fixní nákupní cena Kč/kWh (default proxy BA81)")
|
help="dnešní fixní nákupní cena Kč/kWh (default proxy BA81)")
|
||||||
p.add_argument("--quick", action="store_true", help="jen posledních 60 dní (rychlý test)")
|
p.add_argument("--quick", action="store_true", help="jen posledních 60 dní (rychlý test)")
|
||||||
|
|||||||
Reference in New Issue
Block a user