boncourant

Toujours exactement 3 alternatives


Méthode : negotiated-structure.alternatives v1.0.0

Spec : spec-2bis#19


Ce que fait cette méthode


À partir d'une courbe de consommation nette et d'un instantané de marché, elle sélectionne

exactement 3 offres représentatives couvrant l'ensemble du spectre risque/coût :


| Alternative | Archétype principal | Logique |

|---|---|---|

| Sécurité | fixe | Prix bloqué = CAL Y+1 baseload, exposition zéro |

| Équilibré | calendaire_indexe | Indexé au forward annuel, variance réduite |

| Opportuniste | spot_indexe | Indexé au spot J-1 (proxy M+1 si ENTSO-E indisponible) |


Pourquoi toujours 3 ?


La règle "exactement 3" garantit que chaque recommandation présente un éventail complet.

Si un archétype ne peut pas être tarifé (données de marché manquantes), la méthode insère

un emplacement vide libellé « indisponible — données marché manquantes » — jamais un

chiffre inventé.


Paramètres des archétypes candidats


Les paramètres sont dérivés de manière déterministe depuis le snapshot de marché et la

structure de base (optimize()) :


  • fixe : fixed_eur_mwh = CAL Y+1 baseload, term_months issu de la structure recommandée.
  • calendaire_indexe : spread_eur_mwh = 0 (prix marché, pas de marge inventée), horizon CAL Y+1.
  • bloc_calendaire : 70 % baseload + 30 % bloc Q4 peak, spread = 0 (candidat de repli pour Équilibré).
  • spot_indexe : spread = 0, ENTSO-E indisponible → proxy M+1 (déclaré en data_quality: modelled).
  • spot_plus_future : 50 % spot / 50 % CAL Y+1, spread = 0 (candidat de repli pour Opportuniste).

  • Règle de sélection


    Dans chaque bucket, plusieurs candidats sont tarifés via priceOffer (spec-2bis#18).

    Les offres data_quality = "unavailable" sont filtrées avant le classement pour éviter

    qu'un all_in_eur_mwh = 0 ne gagne comme le moins cher.

    Le moins cher parmi les offres disponibles est retenu.


    Garantie de non-fabrication


    Si tous les candidats d'un bucket sont indisponibles (par ex. CAL strip manquant pour fixe),

    la méthode retourne un IndisponiblePlaceholder avec status: "indisponible".

    Elle ne remonte jamais un chiffre arbitraire ni ne dégrade silencieusement vers un autre archétype.


    Lien avec curve-pricer (small B2B)


    La méthode priceB2bOffersAgainstCurve (lib/b2b/pricing/curve-pricer.ts) utilise les mêmes

    labels (Sécurité / Équilibré / Opportuniste) et le même comportement de placeholder.

    Elle opère sur le catalogue b2b_tariff_offers (petits professionnels BT ≤ 250 kVA) ;

    la présente méthode opère sur les archetypes de gros consommateurs (HTA/HTB).