Market monitor — 2026-05-29
Rules-based streaming projections over the auction record and the append-only event log. Not ML — every flag is explainable to the exact offer, bid, or event that tripped it (the property a regulator needs and an opaque score cannot give). Three detectors fire on synthetic triggers below; eight more are projection-ready.
Synthetic surveillance feed — the triggers are deliberately rigged to demonstrate each detector; figures are illustrative, seed=42.
1 · Capacity-withholding
RSI: RSI = (total_supply − largest_supplier) / load.
RSI<1 means the largest supplier is pivotal — load cannot
be met without it, so it could raise price unilaterally. Combined with a
submitted-vs-rated heatmap (<80% with no outage logged = red).
(PJM/CAISO DMM three-pivotal-supplier test · FERC.)
| Generator | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Aggregator — renewables pool | ||||||||||||||||||||||||
| Cross-border — ZESA interconnect | ||||||||||||||||||||||||
| Eskom Holdings — coal fleet (Generator) | ! | |||||||||||||||||||||||
| Eskom Holdings — OCGT peaker (Generator) | ||||||||||||||||||||||||
| IPP — solar BW5 (Generator) | ||||||||||||||||||||||||
| IPP — wind plant (Generator) |
≥95% offered <80% (outage logged) <80% no outage = withholding suspected
2 · Bilateral wash-trade
A→B at price P matched by B→A at ±P, equal volume, within a 30-minute window — no net economic position changes, the signature of trades placed to paint volume or liquidity. (SEC/CFTC surveillance.) Benign one-way trades and reciprocal pairs outside the window are not flagged.
| Trade id | From → To | Price (R/MWh) | MWh | Minute |
|---|---|---|---|---|
| t-benign-1 | IPP — wind plant (Generator) → Large customer — aluminium smelter | R620.00 | 30 | 09:05 |
| t-wash-A | Aggregator — renewables pool → agg_shadow_02 | R900.00 | 100 | 11:02 |
| t-wash-B | agg_shadow_02 → Aggregator — renewables pool | R901.00 | 100 | 11:14 |
| t-far-A | Large customer — EIUG mine → Distributor — Eskom Distribution | R850.00 | 50 | 14:00 |
| t-far-B | Distributor — Eskom Distribution → Large customer — EIUG mine | R850.00 | 50 | 14:45 |
3 · Price-spike vs trailing-30-day band
Today's hourly SMP against the p5–p95 of a trailing-30-day band for the same hour. Outside-band hours auto-flag (above p95 = red, below p5 = amber). (AEMO Average Price Tables.)
| Hour | p5 | p95 | Today SMP | Band (p5 ▮ p95) · today ◆ |
|---|---|---|---|---|
| 00 | R791.47 | R888.98 | R847.93 | |
| 01 | R804.65 | R920.67 | R864.61 | |
| 02 | R796.05 | R911.03 | R850.02 | |
| 03 | R793.66 | R916.32 | R853.69 | |
| 04 | R777.17 | R891.33 | R831.08 | |
| 05 | R775.73 | R882.16 | R831.49 | |
| 06 | R792.15 | R902.49 | R842.14 | |
| 07 | R771.36 | R886.32 | R832.98 | |
| 08 | R791.16 | R899.27 | R847.24 | |
| 09 | R798.41 | R913.42 | R854.47 | |
| 10 | R791.75 | R887.84 | R837.18 | |
| 11 | R791.89 | R908.36 | R847.35 | |
| 12 | R786.90 | R903.96 | R847.99 | |
| 13 | R779.17 | R887.21 | R841.83 | |
| 14 | R786.22 | R905.08 | R849.01 | |
| 15 | R779.72 | R893.52 | R838.92 | |
| 16 | R803.25 | R927.55 | R865.47 | |
| 17 | R2042.73 | R2354.06 | R2188.35 | |
| 18 | R2075.52 | R2335.90 | R3737.44 | |
| 19 | R2056.49 | R2385.26 | R2219.54 | |
| 20 | R2049.87 | R2310.77 | R2196.73 | |
| 21 | R794.04 | R909.59 | R845.94 | |
| 22 | R788.95 | R901.80 | R853.57 | |
| 23 | R778.42 | R898.31 | R836.77 |
Projection-ready detectors
The same event-log substrate supports these additional detectors (built if budget allows). Each is a rules-based projection, not ML.
Gate-open→close offer mutations: capacity offered early then pulled before gate-close.
Precedent FERC offer-mitigation screens
Cross-party bid-price correlation above a threshold across rolling windows.
Precedent CFTC/EU REMIT collusion screens
Third-party volume vs the Trading Rules R2 §08 ramp cap (20/30/40/50%): amber approaching, hard-block + NERSA-notification event when exceeded. Ties to F6.
Precedent Trading Rules R2 §08
>80% of posted margin used → margin call; >100% → default-waterfall projection.
Precedent SGX EMC default-waterfall
<95% of expected meter telemetry reporting for the hour → reduced-confidence banner.
Precedent AEMO data-quality flags
Nightly re-run from the event log; any divergence from the published receipt is a P0.
Precedent event-sourcing / deterministic-replay invariant
Clustering of offers on round price points (e.g. exact R/MWh hundreds) as a soft signal.
Precedent behavioural-finance round-number bias
Price×volume scatter to surface suspiciously tight offer clusters across parties.
Precedent visual market-monitor exploratory tool