Arte SheetsLearn. Try. Understand.

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)FormulaVerified 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.

Further reading