Deal Capture & ETRM

Overview
Section titled “Overview”The Deal Capture module is the front-end of Energy Copilot’s ETRM system. It allows traders to enter, amend, and cancel energy derivative deals, which are then reflected immediately in portfolio positions and MtM valuations.
Supported Deal Types
Section titled “Supported Deal Types”| Deal Type | Description | Common Use Case |
|---|---|---|
| Fixed-for-Float Swap | Exchange fixed price for NEM spot price (or vice versa) | Base load hedge |
| Cap | Call option on NEM spot price — payoff when spot > strike | Generator protection against high prices |
| Floor | Put option on NEM spot price — payoff when spot < strike | Retailer protection against low prices |
| Collar | Combination of cap and floor — limits both upside and downside | Two-way hedge structure |
| PPA (Power Purchase Agreement) | Long-term contract for renewable energy at fixed price | Corporate renewable procurement |
| Spot Purchase/Sale | Physical spot energy at NEM settlement price | Balancing residual position |
| Basis Swap | Exchange prices between two NEM regions | Interconnector spread trading |
| FCAS Contract | Contracted FCAS availability or price agreement | BESS revenue certainty |
Deal Entry
Section titled “Deal Entry”Deal Form Fields
Section titled “Deal Form Fields”Navigating to Middle Office → Deal Capture → New Deal opens the deal entry form:
| Field | Type | Description |
|---|---|---|
deal_type | Enum | Swap, Cap, Floor, Collar, PPA, Spot, Basis, FCAS |
portfolio_id | FK | Which portfolio this deal belongs to |
counterparty_id | FK | Registered counterparty |
region_id | Enum | NSW1, QLD1, SA1, TAS1, VIC1 |
direction | Enum | Buy / Sell |
volume_mw | Float | Notional volume in MW |
start_date | Date | Contract start |
end_date | Date | Contract end |
strike_price | Float | Fixed price in $/MWh (swaps and options) |
premium_aud | Float | Option premium paid/received (caps, floors, collars) |
trade_date | Date | Date deal was agreed |
trader_id | String | Trader username |
broker | String | Broker (if brokered) |
notes | Text | Free text |
Validation
Section titled “Validation”On submission, the deal form validates:
- Counterparty credit limit not exceeded (raises warning if within 10% of limit)
- Start date before end date
- Volume is positive
- Strike price is within reasonable market bounds ($0–$20,000/MWh)
- Portfolio exists and trader has write permission
Position Tracking
Section titled “Position Tracking”After deal entry, positions are aggregated in gold.positions:
-- Current open positions by region and portfolioSELECT portfolio_name, region_id, deal_type, SUM(volume_mw * direction_sign) AS net_position_mw, SUM(volume_mw * direction_sign * strike_price) AS notional_aud, COUNT(*) AS deal_countFROM energy_copilot.gold.positionsWHERE status = 'active'GROUP BY portfolio_name, region_id, deal_typeORDER BY portfolio_name, region_id;Counterparty Management
Section titled “Counterparty Management”The counterparty registry (gold.counterparties) stores:
- Company name and ABN
- Credit limit (AUD)
- Current exposure (updated daily from MtM)
- ISDA EFET master agreement details
- Payment terms (settlement lag in days)
Pre-seeded counterparties:
| Counterparty | Credit Limit | Type |
|---|---|---|
| AGL Energy | $50M | Integrated |
| Origin Energy | $50M | Integrated |
| EnergyAustralia | $40M | Retailer |
| Shell Energy | $30M | Trading house |
| Macquarie Energy | $30M | Financier |
Portfolio Hierarchy
Section titled “Portfolio Hierarchy”Master Portfolio├── Wholesale Portfolio│ ├── NSW Hedges│ ├── QLD Hedges│ └── SA Hedges├── Retail Hedge Portfolio│ ├── Residential Load Hedges│ └── C&I Load Hedges└── FCAS Portfolio ├── Regulation Services └── Contingency ServicesAPI Endpoints
Section titled “API Endpoints”# List all dealsGET /api/deals?portfolio_id=1&status=active
# Create new dealPOST /api/dealsContent-Type: application/json{ "deal_type": "swap", "portfolio_id": 1, "counterparty_id": 2, "region_id": "SA1", "direction": "buy", "volume_mw": 100, "start_date": "2025-04-01", "end_date": "2025-12-31", "strike_price": 120.00, "trade_date": "2025-03-21"}
# Amend dealPATCH /api/deals/{deal_id}
# Cancel dealDELETE /api/deals/{deal_id}
# Position summaryGET /api/deals/positions?portfolio_id=1