Simulation of Alberta Pool Prices

# Simulation of Alberta Pool Prices

## Simulation of Alberta Pool Prices

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
##### Presentation Transcript

1. Simulation of Alberta Pool Prices Scott MacDonald

2. Outline • High level observations of Alberta power market since deregulation • Load growth, Generation, Historical pool prices • Challenges of simulating prices • What drives price spikes? • Alberta’s merit order • Description of model • Results

3. Summary of Off Peak Prices

4. Summary of On Peak Prices

5. System Marginal Price • Pool Price is the time weighted average of the SMP • Intersection of Alberta Internal Load (AIL) and merit curve determines the price • SMP remains constant as long as AIL is on the price setting block • Many factors effect the merit order (Wind, Imports, DCR)

6. Sample SMP Calculation Adjusted Load = AIL + SK – WIND – 0.44*DCR = 7496 MW 7496 MW (intersect with merit curve) implies SMP = 52.80 \$/MWh

7. Description of Price Simulation Model • Very simple (perhaps too simple?) • Good: • Reproduces historically “reasonable” CDFs • Stats are inline with history • Spikes happen in the right hour endings (8-23) • Back tests calculate margins with 1 to 1.5 std of mean • Bad: • Fails to reproduce the large number of \$10/MWh hours. (Coal units marginal price) • Over parameterized? • Assumes that history is likely to repeat itself

8. Model Process • Query historical data from SQL database • Create shaping matrix • Create noise vector • Create price path

9. Shaping Matrix(for one month) Notation: P_i,{1:24} Day Occurrence Hours 1 through 24

10. Shaping Matrix(aggregate) Notation, M = mean() P_{1:4},{1:24},i Year Label Day Occurrence Hours 1 through 24

11. Noise Vector • Skip the details • Broken out into peak (HE 8-23) and off peak (everything else) • Remove seasonality by doing • log(P_i) – mean(log(P_month))

12. Create Price Path (pseudocode) • Tmp_(i,j) = Smat(i,j) + X*Smat_std(i,j) where X ~ a + b*U(0,1) random variable 2. Tmp = flatten(Tmp) 3. S = S*c where c is scaling constant 4. On_peak_chain = emprand(Nvec_on) • Off_peak_chain = emprand(Nvec_off) 6. IF (HE is peak): P = log(S) + On_peak_chain Else: P = log(S) + Off_peak_chain • P = exp(P) + X where X ~ a + b*U(0,1) random variable

13. Conclusion • Thin supply stack causes wild price variation • Generators dispatching intelligently • Scarcity pricing, shadow bidding • Naïve approach seems to yield reasonable results (back tested over 1 year of data) • Flexible tool to allow users to assess the risk of various hedge scenarios (7x24, 6x16, etc)