These specifications are confidential and are the exclusive Intellectual Property of pdView Pty Ltd.
All pdBidr price variables are priced at the RRP, ie. at the node. This includes SRMC and trader price parameters. Hence bid Pricebands must be divided by the MLF in any calculations or conditions so that all price values are from the same frame of reference. For example if volume is to be allocated to the first PriceBand < SRMC it implies the first Priceband/MLF < SRMC.
pdBidr allocation logic includes a condition that ensures volume cannot be allocated to PB9 or PB10. This condition may be disabled.
Constraint_status data source is currently set by the Bid Parameter “Constraint Status” which should be set to 0 (no constraints) or 1 (constrained off). Under no circumstances should it be set to -1 (constrained on). Our analysis to date suggests that a dynamic constraint_status provides no measureable benefit but increases rebids, increases code complexity and makes retrospective analysis more difficult.
Renewable bid allocation - no FCAS
Summary
The allocation logic aims to maximise value in a similar way to how Traders intuitive and dynamically bid renewable plant. That is, Traders price volume depending on the expected price and the expected price trajectory.
Traders use their market knowledge to set key inputs in pdBidr. These inputs are four priceband values and two trader parameters called Trader Price Max (TPmax) and Trader Price Min (TPmin). Volume is then allocated to one of the four pricebands (or priceband1) as a function of these two Trader Parameters as well as the SRMC (or turn down price) and forecast prices. TPmax, TPmin and SRMC are Bid Parameters.
Inputs and definitions
Information | Source | Description |
---|---|---|
SRMC + Raise Contingency Liability = SRMC+ | SRMC is a Bid Parameter. Raise Contigency Liability is calculated by the Solver. | This is intended to represent the static SRMC plus the Raise Contingency FCAS liability (which is usually very small). Note that the addition of the FCAS liability is currently disabled. |
FRRP | User selected price forecast source | The forecast energy price |
TraderPriceMinimum and TraderPriceMaximum (TPmin and TPmax) | Trader parameters | These parameters define the PriceType and consequently PricePhase (see below) and also provide the lower and upper limit of the pricebands where volume may be allocated (other than priceband 1 which volume may also be allocated to). |
Constraint_status | MMS.dispatch_local_price | Constraint_status is equal to 1 if local_price_adjustment is positive and represents the unit is at risk of being constrained OFF, 0 means there are no binding constraints for that unit and -1 means that the local_price_adjustment is negative and represents the unit is at risk of being constrained ON. As of the time of writing we consider it best to enter the constraint_status as a static trader parameter. |
max_capacity (MC) | MMS.dudetail | The volume to allocate in the chosen priceband. |
Formulas
The complete formulas are provided at the end of this page under the heading “Formulas - complete” and are written to be programmatically unambiguous. To simplify the concept the following section excludes the dynamic FCAS liability and is headed “Formulas - simplified”.
Formulas - simplified
These formulas apply when either the Raise Contingency FCAS liability is ignored or negligible.
Price_type
The allocation rules are formulated to accommodate price uncertainty and are a function of both the expected price and the expected direction of price.
The forecast price for each dispatch interval is characterised as one of four “price_types (PT)” where the PT is assigned a label (which is entirely arbitrary) of either -10, -1, 1 or 10. PT is a function of the TPmin, SRMC and TPmax. PT is defined as follows:
PT | Condition | Explanation |
---|---|---|
10 | TPmax < FRRP | Expected price is sufficiently above SRMC that I want to ensure unit operates at full capacity |
1 | SRMC < FRRP <= TPmax | Expected price is above SRMC but I’m willing to move volume out of PB1 |
-1 | TPmin < FRRP <= SRMC | Expected price is below SRMC but I want to allocate volume near SRMC |
-10 | FRRP <= TPmin | Expected price is significantly below SRMC and I want to avoid being dispatched whilst prices are likely to stay very low |
PT for the next three dispatch intervals
The latest dispatch price (ActRRP) is also included in the definition of PT for the first three dispatch intervals. The actual RRP is included to allow for the scenario where actual prices are low but forecast prices are not low. Without this logic it is possible for actual prices to be very low (e.g. -$500) but volume will remain in PB1 because forecast prices are high (e.g. $0)). Hence the following definition applies for the next three dispatch intervals in a bid:
iff for dispatch interval at time t where
t <= current_datetime + 15 (minutes) then
if min(ActRRP, FRRPt) > max(TPmax , SRMC+) then PTt = 10
if min(ActRRP, FRRPt) > min(TPmax , SRMC+) and min(ActRRP, FRRPt) <= max(TPmax , SRMC+) then PTt= 1
if min(ActRRP, FRRPt) > min(TPmin , SRMC+) and min(ActRRP, FRRPt) <= min(TPmax , SRMC+) then PTt = -1
if min(ActRRP, FRRPt) <= min(TPmin , SRMC+) then PTt = -10
The reason to include ActRRP for the first three dispatch intervals is that we have found earnings outcomes can be consistently improved when the dispatch price is below SRMC but the forecastRRP is greater than TPmax. Effectively the price forecast is not reflecting actual price outcomes and hence without considering dispatch price the bid allocation can maintain volume allocation to priceband 1 which ensures a positive target even though prices are below SRMC.
Price_phase
The price_phase (PP) defines the trajectory of expected prices.
One of four price_phases is assigned to every dispatch interval, where a price_phase is defined as follows:
if PT = 10 then PP = 10
else PP = min(PTi to n) where PTi <> 10 for all i (where i is a dispatch interval)
end
Relative prices
The bid allocation rules defines price_type and price_phase as a function of TPmin, SRMC and TPmax.
Depending on the price_type and price_phase of a dispatch interval, volume is assigned to one of five Pricebands shown in the diagramme below. Note that the allocation rules are defined in the following section, the diagramme below simply shows the definition of PT as a function of TPmin, SRMC and TPmax (and by inference the definition of PP) and the relative position of the five possible pricebands that may be allocated volume.
*Note that in the diagramme above, PB2-5 could be any set of pricebands.
Allocation Rules - Simplified
All equations below are shortened and imply first priceband that meets the conditions. For example <TPmin means “allocate MC to the first PB <TPmin “
Different rules for different constraint_status are in bold.
Constraint_status = Any (-1, 0, 1)
If PT = 10 then allocate MC to PB1 |
---|
Constraint_status = 0
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | > TPmin |
PP = -1 | N/A | <SRMC+ | >TPmin |
PP = -10 | <TPmax | >SRMC+ | < SRMC+ |
Constraint_status = 1 (constrained off)
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | PB1 |
PP = -1 | N/A | <SRMC+ | >TPmin |
PP = -10 | <TPmax | >SRMC+ | <SRMC+ |
Constraint_status = -1 (constrained on)
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | >TPmin |
PP = -1 | N/A | <TPmax | >TPmin |
PP = -10 | PB10 | PB10 | <TPmax |
Choosing values for Traderprice max and min
The aim of the volume allocation rules is for generation to be zero before prices become materially less than SRMC+ and for generation to be at a maximum before prices move materially greater than SRMC+ . To realise this aim volume should be allocated in anticipation of prices that would, or might, transition from prices that would result in positive earnings to prices that would result in negative earnings (and vice versa).
Trader judgement process
The physical trader has an important role in selecting appropriate values for TPmin , SRMC, TPmax and the pricebands (as bid). The approach below is by way of illustration or suggestion only.
Review the supply curve around your SRMC (say -$40, an example is shown below).
Choose a price point that is 100MW (say) below your SRMC but where the price point is not too much less than SRMC (enter this price point under Settings/Algo Bid Parameters as trader priceband min, TPmin). In the example I’ve chosen -$52.
Similarly choose a price point 100MW (say) above your SRMC but where the price point is not too much greater than SRMC (enter this price point as trader priceband max, TPmax). In the example I’ve chosen -$35.
Then choose PB2, PB3, PB4 and PB5 as shown below. Note that you may wish to reserve PB2 and PB3 for very low prices in the event that the spot trader wishes to take control of the bidding process. Hence the relevant priceband values (i.e. the first PB > TPmin, first PB < SRMC, first PB > SRMC and first PB < TPmax) could equally be PB4, PB5, PB6 and PB7.
Formulas - complete version
Price_type (PT)
The allocation rules are designed to ensure that the unit will not be generating if a FRRP less than the TPmin is likely to occur. Similarly they are designed so that the unit will be generating at full capacity if the unit is operating between TPmin and TPmax but the FRRP is likely to increase above TPmax. The allocation rules are also designed to accommodate price uncertainty.
The forecast price for each dispatch interval is characterised as a “price_type (PT)” where the PT is assigned a label (which is entirely arbitrary) of either -10, -1, 1 or 10. PT is a function of the TraderPrices and SRMC+. PT is defined as follows.
if FRRP > max(TPmax , SRMC+) then PT = 10
if FRRP > min(TPmax , SRMC+) and FRRP <= max(TPmax , SRMC+) then PT = 1
if FRRP > min(TPmin , SRMC+) and FRRP <= min(TPmax , SRMC+) then PT = -1
if FRRP <= min(TPmin , SRMC+) then PT = -10
PT for the next three dispatch intervals
The latest dispatch price (ActRRP) is also included in the definition of PT for the first three dispatch intervals. The actual RRP is included to allow for the scenario where the actual prices are low but forecast prices were not low. Without this logic it is possible for actual prices to be very low (e.g. -$500) but volume will remain in PB1 because forecast prices are high (e.g. $0)). Hence the following definition applies for the next three dispatch intervals in a bid:
iff for dispatch interval at time t where
t <= current_datetime + 15 (minutes) then
if min(ActRRP, FRRPt) > max(TPmax , SRMC+) then PTt = 10
if min(ActRRP, FRRPt) > min(TPmax , SRMC+) and min(ActRRP, FRRPt) <= max(TPmax , SRMC+) then PTt= 1
if min(ActRRP, FRRPt) > min(TPmin , SRMC+) and min(ActRRP, FRRPt) <= min(TPmax , SRMC+) then PTt = -1
if min(ActRRP, FRRPt) <= min(TPmin , SRMC+) then PTt = -10
The reason to include ActRRP for the first three dispatch intervals is that we have found earnings outcomes can be consistently improved when the dispatch price is below SRMC but the forecastRRP is greater than TPmax. Effectively the price forecast is not reflecting actual price outcomes and hence without considering dispatch price the bid allocation can maintain volume allocation to priceband 1 which ensures a positive target even though prices are below SRMC.
Price_phase (PP)
A Price_phase (PP) is assigned to each dispatch interval and is a function of the current and future PT. The idea is to characterise the future price expectations beyond any given dispatch interval. The PP is defined as follows.
if PT = 10 then PP = 10
else PP = min(PTi=1 to n) where PTi <> 10 for all i
end
Allocation Rules
All equations below are shortened and imply PB. I.e. max(<TPmin , >SRMC+ ) means “allocate MC to the first PB where max(PB<TPmin , PB>SRMC+ )”
Different rules for different constraint_status relative to constraint_status = 0 are in bold.
Constraint_status = Any (-1, 0, 1)
If PT = 10 then allocate MC to PB1 |
---|
Constraint_status = 0
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | min(>TPmin , <SRMC+ ) |
PP = -1 | N/A | min(<TPmax , <SRMC+ ) | min(>TPmin , <SRMC+ ) |
PP = -10 | max(<TPmax , >SRMC+ ) | min(<TPmax , >SRMC+ ) | min(<TPmax , <SRMC+ ) |
Constraint_status = 1 (constrained off)
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | PB1 |
PP = -1 | N/A | min(<TPmax , <SRMC+ ) | min(>TPmin , <SRMC+ ) |
PP = -10 | max(<TPmax , >SRMC+ ) | min(<TPmax , >SRMC+ ) | min(<TPmax , <SRMC+ ) |
Constraint_status = -1 (constrained on)
PT = -10 | PT = -1 | PT = 1 | |
---|---|---|---|
PP = 1 | N/A | N/A | min(>TPmin , <SRMC+ ) |
PP = -1 | N/A | max(<TPmax , <SRMC+ ) | min(>TPmin , <SRMC+ ) |
PP = -10 | PB10 | PB10 | max(<TPmax , <SRMC+ ) |