Wholesale Electricity Trading & Carbon Markets
Clean Spark Spread, Clean Dark Spread & Fuel-Switch Formula
Calculate Wholesale Power Gross Spark Spread, Carbon-Adjusted Clean Spark Spread (Gas CCGT) vs Clean Dark Spread (Coal), and the Breakeven Carbon Allowance Fuel-Switching Price.
Model coal-to-gas merit-order dispatch switching using thermal efficiency and carbon intensity!
Wholesale power traders and grid dispatchers determine whether Combined-Cycle Gas Turbines (CCGTs) dispatch ahead of hard-coal steam plants by comparing Clean Spark Spread (Gas) against Clean Dark Spread (Coal)! Dividing thermal fuel prices (EUR/MWh_th) by plant electrical efficiency eta_e converts fuel cost to EUR/MWh_e, while dividing fuel combustion emission intensity (0.20 tCO2/MWh_th for pipeline natural gas vs 0.34 tCO2/MWh_th for hard coal) by eta_e yields stack emissions per MWh of electricity generated! Subtracting both fuel and EU ETS carbon allowance cost P_CO2 gives Clean_Spark = P_power - (P_gas / eta_gas) - P_CO2 * (0.20 / eta_gas) and Clean_Dark = P_power - (P_coal / eta_coal) - P_CO2 * (0.34 / eta_coal), equating at Fuel-Switch Carbon Price = ((P_gas / eta_gas) - (P_coal / eta_coal)) / ((0.34 / eta_coal) - (0.20 / eta_gas))!
Verify on a Day-Ahead European Power Desk—Baseload_Power = 110 EUR/MWh (B2), TTF_Natural_Gas = 35 EUR/MWh_th (B3), CCGT_Efficiency eta_gas = 0.50 (50% -> 70 EUR fuel & 0.40 tCO2/MWh_e, B4), API2_Coal = 16 EUR/MWh_th (B5), Coal_Efficiency eta_coal = 0.40 (40% -> 40 EUR fuel & 0.85 tCO2/MWh_e, B6), and Carbon_Allowance_EUA = 80 EUR/tCO2 (B7): Gross Spark Spread is 110 - 70 = 40.00 EUR/MWh (E2); Clean Spark Spread is 40 - 80 * 0.40 = 8.00 EUR/MWh (E3); Clean Dark Spread is (110 - 40) - 80 * 0.85 = 2.00 EUR/MWh (E4); and Coal-to-Gas Fuel-Switch Carbon Price is (70 - 40) / (0.85 - 0.40) = 66.67 EUR/tCO2 (E5—confirming why 80 EUR carbon flips Gas ahead of Coal)!
| Power Merit-Order Metric (Power=110, Gas=35@50%, Coal=16@40%, CO2=80 EUR/t) | Formula | Verified Output |
|---|---|---|
| Gross Spark Spread (Uncarbonized) | P_power - (P_gas / eta_gas) | 40.00 EUR/MWh |
| Clean Spark Spread (CCGT Gas) | Gross_Spark - P_CO2 * (0.20 / eta_gas) | 8.00 EUR/MWh (32.00 @ CO2=20) |
| Clean Dark Spread (Hard Coal) | P_power - P_coal/eta_c - P_CO2*(0.34/eta_c) | 2.00 EUR/MWh (53.00 @ CO2=20) |
| Fuel-Switch Carbon Price (EUR/t) | (Gas_Cost - Coal_Cost) / (e_coal - e_gas) | 66.67 EUR/tCO2 |
Clean Spark Spread, Clean Dark Spread & Carbon Fuel-Switch Formula
Validate P_power > 0, P_gas > 0, P_coal > 0, 0.20 <= eta <= 0.75, P_CO2 >= 0, and higher coal stack emission intensity (0.34 / eta_coal > 0.20 / eta_gas)!
=LET(p_pw, B2, p_gs, B3, et_g, B4, p_cl, B5, et_c, B6, p_co, B7, IF(OR(p_pw <= 0, p_gs <= 0, et_g < 0.2, et_g > 0.75, p_cl <= 0, et_c < 0.2, et_c > 0.75, p_co < 0, (0.34 / et_c) <= (0.2 / et_g)), "Invalid Dispatch Input", ROUND((p_gs / et_g - p_cl / et_c) / ((0.34 / et_c) - (0.2 / et_g)), 2)))Low-Carbon-Price Coal Reversal Check (Set Carbon Price = 20 EUR/tCO2)
Drop Carbon_Allowance B7 to 20 EUR/tCO2 (< 66.67 switch point): Clean Dark Spread E4 jumps to 53.00 EUR/MWh while Clean Spark Spread E3 sits at 32.00 EUR/MWh, reversing merit-order priority!
=IF(ISTEXT(E5), E5, ROUND((B2 - B5 / B6) - B7 * (0.34 / B6), 2))Try the example
Use the original values or change them to test your understanding.