Skip to content

Deal Capture & ETRM

Deal Capture showing trade entry form with contract type, region, direction, volume, price, counterparty, and AI-assisted natural language entry

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.

Deal TypeDescriptionCommon Use Case
Fixed-for-Float SwapExchange fixed price for NEM spot price (or vice versa)Base load hedge
CapCall option on NEM spot price — payoff when spot > strikeGenerator protection against high prices
FloorPut option on NEM spot price — payoff when spot < strikeRetailer protection against low prices
CollarCombination of cap and floor — limits both upside and downsideTwo-way hedge structure
PPA (Power Purchase Agreement)Long-term contract for renewable energy at fixed priceCorporate renewable procurement
Spot Purchase/SalePhysical spot energy at NEM settlement priceBalancing residual position
Basis SwapExchange prices between two NEM regionsInterconnector spread trading
FCAS ContractContracted FCAS availability or price agreementBESS revenue certainty

Navigating to Middle Office → Deal Capture → New Deal opens the deal entry form:

FieldTypeDescription
deal_typeEnumSwap, Cap, Floor, Collar, PPA, Spot, Basis, FCAS
portfolio_idFKWhich portfolio this deal belongs to
counterparty_idFKRegistered counterparty
region_idEnumNSW1, QLD1, SA1, TAS1, VIC1
directionEnumBuy / Sell
volume_mwFloatNotional volume in MW
start_dateDateContract start
end_dateDateContract end
strike_priceFloatFixed price in $/MWh (swaps and options)
premium_audFloatOption premium paid/received (caps, floors, collars)
trade_dateDateDate deal was agreed
trader_idStringTrader username
brokerStringBroker (if brokered)
notesTextFree text

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

After deal entry, positions are aggregated in gold.positions:

-- Current open positions by region and portfolio
SELECT
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_count
FROM energy_copilot.gold.positions
WHERE status = 'active'
GROUP BY portfolio_name, region_id, deal_type
ORDER BY portfolio_name, region_id;

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:

CounterpartyCredit LimitType
AGL Energy$50MIntegrated
Origin Energy$50MIntegrated
EnergyAustralia$40MRetailer
Shell Energy$30MTrading house
Macquarie Energy$30MFinancier
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 Services
Terminal window
# List all deals
GET /api/deals?portfolio_id=1&status=active
# Create new deal
POST /api/deals
Content-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 deal
PATCH /api/deals/{deal_id}
# Cancel deal
DELETE /api/deals/{deal_id}
# Position summary
GET /api/deals/positions?portfolio_id=1