{"schema":"battery-lab-explain-eval/v1","version":"explain-eval-v1","set_hash":"a5447527ab6c","feature":"explain-schedule-eval","settings":{"seed":20261010,"perStratum":6,"B":4000,"level":0.95,"words":{"target":180,"min":90,"max":270},"revenueTolerance":0.01,"revenuePrecisionCap":0.05,"concurrency":2},"checks":[{"id":"valid","label":"Valid reply","short":"Valid","rule":"A reply arrived, was not a refusal or cut off, and matched the JSON schema.","limits":"Says nothing about the content. Network, key and rate-limit failures are not scored."},{"id":"grounded","label":"Grounded","short":"Grounded","rule":"Every number and clock time it checks (24-hour or am/pm) can be found in the snapshot that was sent (the Lab's grounding check).","limits":"Lexical: a true number in a wrong sentence passes. Whole numbers from 0 to 10 are not checked."},{"id":"charging_times","label":"Charging times","short":"Buy times","rule":"The charging section cites at least one clock time (14:30, 2:30 pm, noon or midnight all count), and every time it cites falls inside a charging block.","limits":"A time mentioned for context (\"it waits past the 04:00 dip\") fails it, and in \"from 1 to 3 pm\" only 3 pm is read; the reviewer can overrule."},{"id":"selling_times","label":"Selling times","short":"Sell times","rule":"The selling section cites at least one clock time, and every time it cites falls inside a selling block.","limits":"As for charging times."},{"id":"revenue","label":"Revenue stated","short":"Revenue","rule":"The headline or the economics section states the day's revenue (gross or net of fixed O&M) within 1%, or to the precision it is written with up to 5% (\"about $6.3 million\"), and with the right sign: a loss must read as a loss, and no revenue figure may be reported with the wrong sign.","limits":"Any number that close counts, so a coincidental match passes. The sign is read from a minus sign and the words next to the figure (\"lost\", \"a loss of\", \"earned\"), so an unusual sentence can fool it. Not applicable when the revenue is under $1."},{"id":"length","label":"Length","short":"Length","rule":"90 to 270 words in total (the prompt asks for about 180).","limits":"Instruction-following only."}],"system_prompt":"You are a careful energy-market analyst on a teaching site about grid-battery arbitrage in Victoria's electricity spot market (NEM region VIC1).\nYou explain one day's battery schedule. You receive a JSON snapshot: the day's price summary, the battery settings, the schedule as charging and selling blocks with times, prices and energy, its revenue, and every strategy's revenue on the same day.\nRules:\n- Use only numbers and clock times that appear in the snapshot (rounding is fine). Do not compute new figures, do not invent prices or times, and do not guess about other days.\n- charging and selling: say when the battery buys and sells and why those half-hours, citing the block times and average prices.\n- economics: explain the revenue using the snapshot's energy, average prices, spread and round-trip efficiency. Energy is lost on every round trip, so only large enough price gaps are worth trading.\n- comparison: compare with perfect foresight and the other strategies using the shares and revenues given. If the strategy does not see future prices, never say it knew a price in advance.\n- The battery is a price taker: never claim its trades moved the price.\n- This is a historical simulation for learning, not trading or investment advice.\n- If the snapshot does not support a claim, say that it is not available.\n- Plain Australian English, no markdown, about 180 words in total.","items":[{"id":"E1","date":"2020-07-17","stratum":"edge","strategy":"perfect","maxCycles":null,"reason":"Deliverable 1's day: the brief's own worked example, no cycle limit.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2020-07-17","label":"Fri 17 Jul 2020","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":39.75,"time":"13:30"},"max":{"price":163.47,"time":"17:30"},"mean":71.48,"negative_half_hours":0,"cheapest_half_hours":[{"time":"13:30","price":39.75},{"time":"14:00","price":39.94},{"time":"14:30","price":39.97},{"time":"15:00","price":42.72}],"dearest_half_hours":[{"time":"17:30","price":163.47},{"time":"08:00","price":153.81},{"time":"18:00","price":137.1},{"time":"10:00","price":110.29}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":51350,"revenue_net_of_fixed_om":44692,"bought_from_grid_mwh":1288.9,"sold_to_grid_mwh":1044,"removed_from_storage_mwh":1160,"full_cycles":2,"avg_buy_price":50.77,"avg_sell_price":112.31,"avg_price_spread":61.54,"charging_blocks":[{"from":"03:00","to":"04:00","half_hours":2,"avg_price":54.95,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":16335},{"from":"04:30","to":"05:00","half_hours":1,"avg_price":67.32,"avg_grid_mw":88.9,"energy_from_grid_mwh":44.4,"cost":2965},{"from":"05:30","to":"06:30","half_hours":2,"avg_price":65.17,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":19375},{"from":"13:00","to":"15:30","half_hours":5,"avg_price":40.98,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":26174}],"selling_blocks":[{"from":"07:30","to":"09:00","half_hours":3,"avg_price":111.51,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":42764},{"from":"10:00","to":"10:30","half_hours":1,"avg_price":110.29,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":14755},{"from":"17:00","to":"18:30","half_hours":3,"avg_price":127.2,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":48785},{"from":"20:00","to":"20:30","half_hours":1,"avg_price":73.96,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":9895}],"stored_energy_after_each_block":[{"time":"04:00","mwh":270},{"time":"05:00","mwh":310},{"time":"06:30","mwh":580},{"time":"09:00","mwh":150},{"time":"10:30","mwh":0},{"time":"15:30","mwh":580},{"time":"18:30","mwh":150},{"time":"20:30","mwh":0}],"idle_half_hours":30,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":51350,"share_of_perfect":1,"full_cycles":2,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":31021,"share_of_perfect":0.604,"full_cycles":2.23,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":9988,"share_of_perfect":0.195,"full_cycles":3.04,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-22540,"share_of_perfect":-0.439,"full_cycles":0.78,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":28980,"share_of_perfect":0.564,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"E2","date":"2020-07-17","stratum":"edge","strategy":"perfect","maxCycles":1,"reason":"The same day with the brief's one-cycle limit, which binds.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2020-07-17","label":"Fri 17 Jul 2020","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":{"cycles":1,"max_discharge_mwh":580}},"prices":{"min":{"price":39.75,"time":"13:30"},"max":{"price":163.47,"time":"17:30"},"mean":71.48,"negative_half_hours":0,"cheapest_half_hours":[{"time":"13:30","price":39.75},{"time":"14:00","price":39.94},{"time":"14:30","price":39.97},{"time":"15:00","price":42.72}],"dearest_half_hours":[{"time":"17:30","price":163.47},{"time":"08:00","price":153.81},{"time":"18:00","price":137.1},{"time":"10:00","price":110.29}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":43360,"revenue_net_of_fixed_om":36702,"bought_from_grid_mwh":644.4,"sold_to_grid_mwh":522,"removed_from_storage_mwh":580,"full_cycles":1,"avg_buy_price":47.31,"avg_sell_price":142.23,"avg_price_spread":94.92,"charging_blocks":[{"from":"03:00","to":"04:00","half_hours":2,"avg_price":54.95,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":16335},{"from":"05:30","to":"06:00","half_hours":1,"avg_price":64.99,"avg_grid_mw":22.2,"energy_from_grid_mwh":11.1,"cost":716},{"from":"13:30","to":"15:00","half_hours":3,"avg_price":39.86,"avg_grid_mw":222.2,"energy_from_grid_mwh":333.3,"cost":13166}],"selling_blocks":[{"from":"08:00","to":"08:30","half_hours":1,"avg_price":153.81,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":20577},{"from":"10:00","to":"10:30","half_hours":1,"avg_price":110.29,"avg_storage_mw":260,"energy_to_grid_mwh":117,"revenue":12788},{"from":"17:30","to":"18:30","half_hours":2,"avg_price":150.29,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":40212}],"stored_energy_after_each_block":[{"time":"04:00","mwh":270},{"time":"06:00","mwh":280},{"time":"08:30","mwh":130},{"time":"10:30","mwh":0},{"time":"15:00","mwh":300},{"time":"18:30","mwh":0}],"idle_half_hours":38,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":43360,"share_of_perfect":1,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":31541,"share_of_perfect":0.727,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":22104,"share_of_perfect":0.51,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":13376,"share_of_perfect":0.308,"full_cycles":0.78,"stored_at_midnight_mwh":130},{"name":"Time of day","revenue":10152,"share_of_perfect":0.234,"full_cycles":1,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"E3","date":"2025-10-10","stratum":"edge","strategy":"perfect","maxCycles":null,"reason":"Most negative half-hours in 2025 (48 of 48): the battery is paid to charge.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-10-10","label":"Fri 10 Oct 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-70.92,"time":"12:30"},"max":{"price":-0.14,"time":"23:30"},"mean":-25.14,"negative_half_hours":48,"cheapest_half_hours":[{"time":"12:30","price":-70.92},{"time":"13:00","price":-70.09},{"time":"13:30","price":-64.65},{"time":"14:00","price":-63.04}],"dearest_half_hours":[{"time":"23:30","price":-0.14},{"time":"05:30","price":-0.85},{"time":"23:00","price":-1.73},{"time":"06:00","price":-2.17}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":63877,"revenue_net_of_fixed_om":57219,"bought_from_grid_mwh":3344.4,"sold_to_grid_mwh":2187,"removed_from_storage_mwh":2430,"full_cycles":4.19,"avg_buy_price":-31.56,"avg_sell_price":-18.78,"avg_price_spread":12.77,"charging_blocks":[{"from":"00:00","to":"02:00","half_hours":4,"avg_price":-6.42,"avg_grid_mw":275,"energy_from_grid_mwh":550,"cost":-3499},{"from":"02:30","to":"03:00","half_hours":1,"avg_price":-6.5,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-966},{"from":"03:30","to":"04:00","half_hours":1,"avg_price":-6.5,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-966},{"from":"04:30","to":"05:00","half_hours":1,"avg_price":-8.74,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-1299},{"from":"07:00","to":"07:30","half_hours":1,"avg_price":-49.43,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-7347},{"from":"08:00","to":"09:30","half_hours":3,"avg_price":-52.55,"avg_grid_mw":233.3,"energy_from_grid_mwh":350,"cost":-18226},{"from":"10:30","to":"11:00","half_hours":1,"avg_price":-55.3,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-8220},{"from":"11:30","to":"12:00","half_hours":1,"avg_price":-53.78,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-7995},{"from":"12:30","to":"15:00","half_hours":5,"avg_price":-66.63,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":-42554},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":-20.19,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-3001},{"from":"17:30","to":"18:00","half_hours":1,"avg_price":-44.74,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-6650},{"from":"19:30","to":"20:00","half_hours":1,"avg_price":-6.5,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-966},{"from":"21:00","to":"22:00","half_hours":2,"avg_price":-6.5,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":-1932},{"from":"22:30","to":"23:00","half_hours":1,"avg_price":-6.5,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-966}],"selling_blocks":[{"from":"02:00","to":"02:30","half_hours":1,"avg_price":-6.5,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-870},{"from":"03:00","to":"03:30","half_hours":1,"avg_price":-6.5,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-870},{"from":"04:00","to":"04:30","half_hours":1,"avg_price":-6.5,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-870},{"from":"05:00","to":"06:30","half_hours":3,"avg_price":-3.17,"avg_storage_mw":300,"energy_to_grid_mwh":405,"revenue":-1273},{"from":"07:30","to":"08:00","half_hours":1,"avg_price":-38.55,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-4641},{"from":"09:30","to":"10:30","half_hours":2,"avg_price":-38.93,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":-10415},{"from":"11:00","to":"11:30","half_hours":1,"avg_price":-51.83,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-6934},{"from":"12:00","to":"12:30","half_hours":1,"avg_price":-57.54,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-6928},{"from":"16:00","to":"16:30","half_hours":1,"avg_price":-23.54,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-2834},{"from":"17:00","to":"17:30","half_hours":1,"avg_price":-18.95,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-2282},{"from":"19:00","to":"19:30","half_hours":1,"avg_price":-6.5,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-870},{"from":"20:00","to":"21:00","half_hours":2,"avg_price":-5.24,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":-1403},{"from":"22:00","to":"22:30","half_hours":1,"avg_price":-6.5,"avg_storage_mw":180,"energy_to_grid_mwh":81,"revenue":-522}],"stored_energy_after_each_block":[{"time":"02:00","mwh":495},{"time":"02:30","mwh":345},{"time":"03:00","mwh":480},{"time":"03:30","mwh":330},{"time":"04:00","mwh":465},{"time":"04:30","mwh":315},{"time":"05:00","mwh":450},{"time":"06:30","mwh":0},{"time":"07:30","mwh":135},{"time":"08:00","mwh":0},{"time":"09:30","mwh":315},{"time":"10:30","mwh":15},{"time":"11:00","mwh":150},{"time":"11:30","mwh":0},{"time":"12:00","mwh":135},{"time":"12:30","mwh":0},{"time":"15:00","mwh":580},{"time":"16:30","mwh":445},{"time":"17:00","mwh":580},{"time":"17:30","mwh":445},{"time":"18:00","mwh":580},{"time":"19:30","mwh":430},{"time":"20:00","mwh":565},{"time":"21:00","mwh":265},{"time":"22:00","mwh":535},{"time":"22:30","mwh":445},{"time":"23:00","mwh":580}],"idle_half_hours":7,"stored_at_midnight_mwh":580,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":63877,"share_of_perfect":1,"full_cycles":4.19,"stored_at_midnight_mwh":580},{"name":"Rolling persistence","revenue":23189,"share_of_perfect":0.363,"full_cycles":1.57,"stored_at_midnight_mwh":580},{"name":"Day-ahead persistence","revenue":37648,"share_of_perfect":0.589,"full_cycles":3.3,"stored_at_midnight_mwh":135},{"name":"Price thresholds","revenue":4085,"share_of_perfect":0.064,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":13042,"share_of_perfect":0.204,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"E4","date":"2025-06-12","stratum":"edge","strategy":"perfect","maxCycles":null,"reason":"Highest half-hourly price in 2025 ($14,649/MWh): one spike dominates the day.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-06-12","label":"Thu 12 Jun 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":141.79,"time":"13:30"},"max":{"price":14648.8,"time":"19:30"},"mean":1786.27,"negative_half_hours":0,"cheapest_half_hours":[{"time":"13:30","price":141.79},{"time":"03:00","price":162.86},{"time":"03:30","price":164.58},{"time":"14:00","price":166.73}],"dearest_half_hours":[{"time":"19:30","price":14648.8},{"time":"19:00","price":13174.58},{"time":"17:30","price":11165.05},{"time":"18:00","price":9860.06}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":6321342,"revenue_net_of_fixed_om":6314684,"bought_from_grid_mwh":1477.8,"sold_to_grid_mwh":1197,"removed_from_storage_mwh":1330,"full_cycles":2.29,"avg_buy_price":172.35,"avg_sell_price":5541.73,"avg_price_spread":5369.38,"charging_blocks":[{"from":"01:00","to":"01:30","half_hours":1,"avg_price":182.2,"avg_grid_mw":88.9,"energy_from_grid_mwh":44.4,"cost":8025},{"from":"03:00","to":"05:00","half_hours":4,"avg_price":168.94,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":100453},{"from":"09:00","to":"10:00","half_hours":2,"avg_price":203.58,"avg_grid_mw":188.9,"energy_from_grid_mwh":188.9,"cost":38108},{"from":"12:00","to":"14:30","half_hours":5,"avg_price":165.69,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":105817}],"selling_blocks":[{"from":"06:30","to":"08:00","half_hours":3,"avg_price":349.22,"avg_storage_mw":300,"energy_to_grid_mwh":405,"revenue":140159},{"from":"10:00","to":"11:00","half_hours":2,"avg_price":277.58,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":74273},{"from":"17:30","to":"18:30","half_hours":2,"avg_price":10559.16,"avg_storage_mw":280,"energy_to_grid_mwh":252,"revenue":2636960},{"from":"19:00","to":"20:00","half_hours":2,"avg_price":13911.69,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":3722352}],"stored_energy_after_each_block":[{"time":"01:30","mwh":40},{"time":"05:00","mwh":580},{"time":"08:00","mwh":130},{"time":"10:00","mwh":300},{"time":"11:00","mwh":0},{"time":"14:30","mwh":580},{"time":"18:30","mwh":300},{"time":"20:00","mwh":0}],"idle_half_hours":27,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":6321342,"share_of_perfect":1,"full_cycles":2.29,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":4941990,"share_of_perfect":0.782,"full_cycles":2.16,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":3620674,"share_of_perfect":0.573,"full_cycles":2.23,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":0,"share_of_perfect":0,"full_cycles":0,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":3997994,"share_of_perfect":0.632,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"E5","date":"2021-07-06","stratum":"edge","strategy":"rolling","maxCycles":null,"reason":"The test window's most valuable day for perfect foresight, explained for a policy that cannot see it coming.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-07-06","label":"Tue 6 Jul 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":101.24,"time":"04:00"},"max":{"price":2618.09,"time":"17:30"},"mean":264.83,"negative_half_hours":0,"cheapest_half_hours":[{"time":"04:00","price":101.24},{"time":"04:30","price":105.73},{"time":"05:00","price":111.22},{"time":"02:00","price":114.14}],"dearest_half_hours":[{"time":"17:30","price":2618.09},{"time":"18:00","price":619.6},{"time":"18:30","price":369.02},{"time":"08:30","price":301.74}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":51067,"revenue_net_of_fixed_om":44410,"bought_from_grid_mwh":966.7,"sold_to_grid_mwh":783,"removed_from_storage_mwh":870,"full_cycles":1.5,"avg_buy_price":128.43,"avg_sell_price":224.37,"avg_price_spread":95.94,"charging_blocks":[{"from":"04:00","to":"05:30","half_hours":3,"avg_price":107.44,"avg_grid_mw":233.3,"energy_from_grid_mwh":350,"cost":37266},{"from":"13:30","to":"15:00","half_hours":3,"avg_price":135,"avg_grid_mw":300,"energy_from_grid_mwh":450,"cost":60202},{"from":"21:30","to":"22:00","half_hours":1,"avg_price":154.4,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":22952},{"from":"22:30","to":"23:00","half_hours":1,"avg_price":158.24,"avg_grid_mw":33.3,"energy_from_grid_mwh":16.7,"cost":2614}],"selling_blocks":[{"from":"05:30","to":"06:30","half_hours":2,"avg_price":181.79,"avg_storage_mw":285,"energy_to_grid_mwh":256.5,"revenue":46210},{"from":"07:00","to":"07:30","half_hours":1,"avg_price":242.63,"avg_storage_mw":60,"energy_to_grid_mwh":27,"revenue":6492},{"from":"15:30","to":"16:00","half_hours":1,"avg_price":265.74,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":35552},{"from":"16:30","to":"17:30","half_hours":2,"avg_price":285.92,"avg_storage_mw":255,"energy_to_grid_mwh":229.5,"revenue":65028},{"from":"23:30","to":"24:00","half_hours":1,"avg_price":155.61,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":20818}],"stored_energy_after_each_block":[{"time":"05:30","mwh":315},{"time":"06:30","mwh":30},{"time":"07:30","mwh":0},{"time":"15:00","mwh":405},{"time":"16:00","mwh":255},{"time":"17:30","mwh":0},{"time":"22:00","mwh":135},{"time":"23:00","mwh":150},{"time":"24:00","mwh":0}],"idle_half_hours":33,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":535324,"share_of_perfect":1,"full_cycles":3.59,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":51067,"share_of_perfect":0.095,"full_cycles":1.5,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":11758,"share_of_perfect":0.022,"full_cycles":3.48,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":0,"share_of_perfect":0,"full_cycles":0,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":404917,"share_of_perfect":0.756,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"E6","date":"2025-11-17","stratum":"edge","strategy":"time_of_day","maxCycles":null,"reason":"The least valuable day of 2025 for perfect foresight: a fixed schedule on a day with little worth trading.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-11-17","label":"Mon 17 Nov 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-16.14,"time":"13:30"},"max":{"price":9.43,"time":"23:00"},"mean":-6.42,"negative_half_hours":39,"cheapest_half_hours":[{"time":"13:30","price":-16.14},{"time":"18:00","price":-15.04},{"time":"17:30","price":-14.23},{"time":"13:00","price":-13.42}],"dearest_half_hours":[{"time":"23:00","price":9.43},{"time":"20:30","price":9.13},{"time":"23:30","price":8.09},{"time":"05:00","price":6.21}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":1529,"revenue_net_of_fixed_om":-5128,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":-9.63,"avg_sell_price":-10.36,"avg_price_spread":-0.73,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":-8.01,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":-5118},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":-11.37,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-6760}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":-10.31,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":-4964},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":-5.77,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-772},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":-12.03,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":-4612}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":26745,"share_of_perfect":1,"full_cycles":5.02,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":8572,"share_of_perfect":0.321,"full_cycles":2.75,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":3061,"share_of_perfect":0.114,"full_cycles":3,"stored_at_midnight_mwh":580},{"name":"Price thresholds","revenue":4197,"share_of_perfect":0.157,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":1529,"share_of_perfect":0.057,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T1","date":"2021-07-08","stratum":"test","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-07-08","label":"Thu 8 Jul 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":80.65,"time":"03:30"},"max":{"price":373.25,"time":"23:00"},"mean":250.26,"negative_half_hours":0,"cheapest_half_hours":[{"time":"03:30","price":80.65},{"time":"03:00","price":84.82},{"time":"02:30","price":101.31},{"time":"04:00","price":103.13}],"dearest_half_hours":[{"time":"23:00","price":373.25},{"time":"23:30","price":324.27},{"time":"15:30","price":322.82},{"time":"09:00","price":314.67}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":148225,"revenue_net_of_fixed_om":141568,"bought_from_grid_mwh":1094.4,"sold_to_grid_mwh":886.5,"removed_from_storage_mwh":985,"full_cycles":1.7,"avg_buy_price":126.05,"avg_sell_price":324.33,"avg_price_spread":198.29,"charging_blocks":[{"from":"02:30","to":"05:00","half_hours":5,"avg_price":95.5,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":60990},{"from":"11:30","to":"12:30","half_hours":2,"avg_price":173.65,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":51625},{"from":"18:30","to":"19:00","half_hours":1,"avg_price":162.09,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":24095}],"selling_blocks":[{"from":"08:00","to":"08:30","half_hours":1,"avg_price":306.81,"avg_storage_mw":170,"energy_to_grid_mwh":76.5,"revenue":23260},{"from":"09:00","to":"10:00","half_hours":2,"avg_price":313.4,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":83855},{"from":"15:00","to":"16:00","half_hours":2,"avg_price":315.82,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":84503},{"from":"23:00","to":"24:00","half_hours":2,"avg_price":348.76,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":93318}],"stored_energy_after_each_block":[{"time":"05:00","mwh":580},{"time":"08:30","mwh":495},{"time":"10:00","mwh":195},{"time":"12:30","mwh":465},{"time":"16:00","mwh":165},{"time":"19:00","mwh":300},{"time":"24:00","mwh":0}],"idle_half_hours":33,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":148225,"share_of_perfect":1,"full_cycles":1.7,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":62754,"share_of_perfect":0.423,"full_cycles":1.07,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":45018,"share_of_perfect":0.304,"full_cycles":2.93,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":15882,"share_of_perfect":0.107,"full_cycles":0.47,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":72610,"share_of_perfect":0.49,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T2","date":"2021-07-18","stratum":"test","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-07-18","label":"Sun 18 Jul 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":11.08,"time":"03:30"},"max":{"price":281.75,"time":"18:30"},"mean":83.82,"negative_half_hours":0,"cheapest_half_hours":[{"time":"03:30","price":11.08},{"time":"02:30","price":14.27},{"time":"03:00","price":23.49},{"time":"02:00","price":31.11}],"dearest_half_hours":[{"time":"18:30","price":281.75},{"time":"19:00","price":262.95},{"time":"16:00","price":235.22},{"time":"20:30","price":224.19}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":70785,"revenue_net_of_fixed_om":64128,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":29.43,"avg_sell_price":107.19,"avg_price_spread":77.76,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":21.57,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":13774},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":37.87,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":22519}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":48.49,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":23352},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":139.57,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":18672},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":169.62,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":65053}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":138568,"share_of_perfect":1,"full_cycles":3.18,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":4612,"share_of_perfect":0.033,"full_cycles":0.49,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":64395,"share_of_perfect":0.465,"full_cycles":3.4,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":48329,"share_of_perfect":0.349,"full_cycles":1,"stored_at_midnight_mwh":135},{"name":"Time of day","revenue":70785,"share_of_perfect":0.511,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T3","date":"2021-07-26","stratum":"test","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-07-26","label":"Mon 26 Jul 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-18.46,"time":"03:30"},"max":{"price":229.84,"time":"17:30"},"mean":39.1,"negative_half_hours":5,"cheapest_half_hours":[{"time":"03:30","price":-18.46},{"time":"04:30","price":-3.14},{"time":"04:00","price":-2.47},{"time":"02:30","price":-2.31}],"dearest_half_hours":[{"time":"17:30","price":229.84},{"time":"17:00","price":124.22},{"time":"09:00","price":105.19},{"time":"18:00","price":101.76}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":89678,"revenue_net_of_fixed_om":83021,"bought_from_grid_mwh":1727.8,"sold_to_grid_mwh":1399.5,"removed_from_storage_mwh":1555,"full_cycles":2.68,"avg_buy_price":7.48,"avg_sell_price":73.9,"avg_price_spread":66.42,"charging_blocks":[{"from":"00:30","to":"01:30","half_hours":2,"avg_price":7.73,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":1277},{"from":"03:30","to":"05:30","half_hours":4,"avg_price":-5.97,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-3553},{"from":"11:00","to":"11:30","half_hours":1,"avg_price":-1.98,"avg_grid_mw":88.9,"energy_from_grid_mwh":44.4,"cost":-87},{"from":"12:00","to":"13:00","half_hours":2,"avg_price":5.4,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":1604},{"from":"13:30","to":"14:30","half_hours":2,"avg_price":16.31,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":4849},{"from":"20:30","to":"21:00","half_hours":1,"avg_price":45.52,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":6767},{"from":"22:30","to":"23:30","half_hours":2,"avg_price":11.84,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":1956}],"selling_blocks":[{"from":"01:30","to":"02:00","half_hours":1,"avg_price":3.01,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":403},{"from":"05:30","to":"07:30","half_hours":4,"avg_price":38.22,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":18409},{"from":"17:00","to":"19:00","half_hours":4,"avg_price":140.48,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":72668},{"from":"21:00","to":"21:30","half_hours":1,"avg_price":66.86,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":8050},{"from":"23:30","to":"24:00","half_hours":1,"avg_price":22.13,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":2961}],"stored_energy_after_each_block":[{"time":"01:30","mwh":150},{"time":"02:00","mwh":0},{"time":"05:30","mwh":540},{"time":"07:30","mwh":0},{"time":"11:30","mwh":40},{"time":"13:00","mwh":310},{"time":"14:30","mwh":580},{"time":"19:00","mwh":0},{"time":"21:00","mwh":135},{"time":"21:30","mwh":0},{"time":"23:30","mwh":150},{"time":"24:00","mwh":0}],"idle_half_hours":23,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":129630,"share_of_perfect":1,"full_cycles":3.64,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":89678,"share_of_perfect":0.692,"full_cycles":2.68,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":89158,"share_of_perfect":0.688,"full_cycles":3.38,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":17860,"share_of_perfect":0.138,"full_cycles":0.52,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":90222,"share_of_perfect":0.696,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T4","date":"2021-07-29","stratum":"test","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-07-29","label":"Thu 29 Jul 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-31.34,"time":"14:30"},"max":{"price":280.58,"time":"18:00"},"mean":36.53,"negative_half_hours":20,"cheapest_half_hours":[{"time":"14:30","price":-31.34},{"time":"13:30","price":-28.68},{"time":"13:00","price":-26.79},{"time":"02:30","price":-25.58}],"dearest_half_hours":[{"time":"18:00","price":280.58},{"time":"17:30","price":190.04},{"time":"18:30","price":171.53},{"time":"07:00","price":140.8}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":194858,"revenue_net_of_fixed_om":188200,"bought_from_grid_mwh":1861.1,"sold_to_grid_mwh":1507.5,"removed_from_storage_mwh":1675,"full_cycles":2.89,"avg_buy_price":-19.1,"avg_sell_price":106.85,"avg_price_spread":125.95,"charging_blocks":[{"from":"00:00","to":"02:00","half_hours":4,"avg_price":-13.75,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-8174},{"from":"02:30","to":"03:00","half_hours":1,"avg_price":-25.58,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-3802},{"from":"03:30","to":"04:00","half_hours":1,"avg_price":-12.15,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-1806},{"from":"11:00","to":"12:00","half_hours":2,"avg_price":-22.7,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":-3749},{"from":"12:30","to":"15:00","half_hours":5,"avg_price":-27.59,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":-17623},{"from":"22:30","to":"23:00","half_hours":1,"avg_price":-0.53,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-79}],"selling_blocks":[{"from":"02:00","to":"02:30","half_hours":1,"avg_price":-3.99,"avg_storage_mw":190,"energy_to_grid_mwh":85.5,"revenue":-338},{"from":"03:00","to":"03:30","half_hours":1,"avg_price":-2.94,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-354},{"from":"06:30","to":"08:30","half_hours":4,"avg_price":121.52,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":62864},{"from":"12:00","to":"12:30","half_hours":1,"avg_price":-16.76,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-2242},{"from":"17:00","to":"19:00","half_hours":4,"avg_price":190.22,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":98399},{"from":"23:00","to":"23:30","half_hours":1,"avg_price":10.76,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":1296}],"stored_energy_after_each_block":[{"time":"02:00","mwh":540},{"time":"02:30","mwh":445},{"time":"03:00","mwh":580},{"time":"03:30","mwh":445},{"time":"04:00","mwh":580},{"time":"08:30","mwh":0},{"time":"12:00","mwh":150},{"time":"12:30","mwh":0},{"time":"15:00","mwh":580},{"time":"19:00","mwh":0},{"time":"23:00","mwh":135},{"time":"23:30","mwh":0}],"idle_half_hours":22,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":194858,"share_of_perfect":1,"full_cycles":2.89,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":102158,"share_of_perfect":0.524,"full_cycles":1.7,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":163673,"share_of_perfect":0.84,"full_cycles":3.33,"stored_at_midnight_mwh":270},{"name":"Price thresholds","revenue":78329,"share_of_perfect":0.402,"full_cycles":1.29,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":168162,"share_of_perfect":0.863,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T5","date":"2021-08-06","stratum":"test","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-08-06","label":"Fri 6 Aug 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":3.25,"time":"04:00"},"max":{"price":152.93,"time":"17:30"},"mean":65.94,"negative_half_hours":0,"cheapest_half_hours":[{"time":"04:00","price":3.25},{"time":"04:30","price":9.48},{"time":"03:00","price":9.75},{"time":"03:30","price":11.69}],"dearest_half_hours":[{"time":"17:30","price":152.93},{"time":"18:00","price":123},{"time":"18:30","price":119.24},{"time":"09:00","price":99.69}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":64621,"revenue_net_of_fixed_om":57963,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":30.02,"avg_sell_price":101.75,"avg_price_spread":71.73,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":11.1,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":7087},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":50.35,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":29937}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":80.52,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":38780},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":90.62,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":12124},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":132.3,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":50741}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":82842,"share_of_perfect":1,"full_cycles":2.69,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":52385,"share_of_perfect":0.632,"full_cycles":1.3,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":53849,"share_of_perfect":0.65,"full_cycles":2.72,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-16600,"share_of_perfect":-0.2,"full_cycles":0.78,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":64621,"share_of_perfect":0.78,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"T6","date":"2021-08-07","stratum":"test","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-08-07","label":"Sat 7 Aug 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":3.21,"time":"13:00"},"max":{"price":282.28,"time":"18:00"},"mean":74.06,"negative_half_hours":0,"cheapest_half_hours":[{"time":"13:00","price":3.21},{"time":"14:00","price":5.11},{"time":"13:30","price":6.11},{"time":"12:30","price":9.4}],"dearest_half_hours":[{"time":"18:00","price":282.28},{"time":"17:30","price":225.23},{"time":"18:30","price":198.62},{"time":"20:00","price":158.23}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":88231,"revenue_net_of_fixed_om":81574,"bought_from_grid_mwh":788.9,"sold_to_grid_mwh":639,"removed_from_storage_mwh":710,"full_cycles":1.22,"avg_buy_price":38.36,"avg_sell_price":186.69,"avg_price_spread":148.33,"charging_blocks":[{"from":"04:00","to":"06:30","half_hours":5,"avg_price":40.26,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":25714},{"from":"10:00","to":"10:30","half_hours":1,"avg_price":29.86,"avg_grid_mw":288.9,"energy_from_grid_mwh":144.4,"cost":4274}],"selling_blocks":[{"from":"08:30","to":"09:00","half_hours":1,"avg_price":75.54,"avg_storage_mw":260,"energy_to_grid_mwh":117,"revenue":8759},{"from":"17:30","to":"19:30","half_hours":4,"avg_price":211.6,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":109460}],"stored_energy_after_each_block":[{"time":"06:30","mwh":580},{"time":"09:00","mwh":450},{"time":"10:30","mwh":580},{"time":"19:30","mwh":0}],"idle_half_hours":37,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":121200,"share_of_perfect":1,"full_cycles":2.16,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":88231,"share_of_perfect":0.728,"full_cycles":1.22,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":96678,"share_of_perfect":0.798,"full_cycles":2.69,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":63164,"share_of_perfect":0.521,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":102753,"share_of_perfect":0.848,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C1","date":"2021-01-06","stratum":"cv","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-01-06","label":"Wed 6 Jan 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-50.15,"time":"12:00"},"max":{"price":34.53,"time":"00:00"},"mean":-1.81,"negative_half_hours":19,"cheapest_half_hours":[{"time":"12:00","price":-50.15},{"time":"15:00","price":-48.47},{"time":"15:30","price":-47.03},{"time":"14:30","price":-46.23}],"dearest_half_hours":[{"time":"00:00","price":34.53},{"time":"20:00","price":34.4},{"time":"20:30","price":32.37},{"time":"06:30","price":31.79}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":68308,"revenue_net_of_fixed_om":61651,"bought_from_grid_mwh":2388.9,"sold_to_grid_mwh":1935,"removed_from_storage_mwh":2150,"full_cycles":3.71,"avg_buy_price":-16.71,"avg_sell_price":15,"avg_price_spread":31.7,"charging_blocks":[{"from":"01:30","to":"04:00","half_hours":5,"avg_price":8.42,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":5377},{"from":"05:30","to":"06:00","half_hours":1,"avg_price":13.94,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":2072},{"from":"08:00","to":"08:30","half_hours":1,"avg_price":-23.42,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-3481},{"from":"09:30","to":"10:30","half_hours":2,"avg_price":-21.88,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":-3614},{"from":"12:00","to":"12:30","half_hours":1,"avg_price":-50.15,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-7455},{"from":"13:00","to":"13:30","half_hours":1,"avg_price":-41.08,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":-6107},{"from":"14:00","to":"16:30","half_hours":5,"avg_price":-45.46,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":-29032},{"from":"21:30","to":"23:00","half_hours":3,"avg_price":8.14,"avg_grid_mw":222.2,"energy_from_grid_mwh":333.3,"cost":2690}],"selling_blocks":[{"from":"05:00","to":"05:30","half_hours":1,"avg_price":23.12,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":3093},{"from":"06:00","to":"08:00","half_hours":4,"avg_price":27.07,"avg_storage_mw":282.5,"energy_to_grid_mwh":508.5,"revenue":13639},{"from":"08:30","to":"09:00","half_hours":1,"avg_price":7.04,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":848},{"from":"10:30","to":"11:00","half_hours":1,"avg_price":-11.31,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-1513},{"from":"12:30","to":"13:00","half_hours":1,"avg_price":-36.72,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-4421},{"from":"13:30","to":"14:00","half_hours":1,"avg_price":-38.92,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":-4686},{"from":"19:00","to":"19:30","half_hours":1,"avg_price":18.01,"avg_storage_mw":260,"energy_to_grid_mwh":117,"revenue":2088},{"from":"20:00","to":"21:30","half_hours":3,"avg_price":28.74,"avg_storage_mw":300,"energy_to_grid_mwh":405,"revenue":11535},{"from":"23:00","to":"24:00","half_hours":2,"avg_price":30.56,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":8177}],"stored_energy_after_each_block":[{"time":"04:00","mwh":580},{"time":"05:30","mwh":430},{"time":"06:00","mwh":565},{"time":"08:00","mwh":0},{"time":"08:30","mwh":135},{"time":"09:00","mwh":0},{"time":"10:30","mwh":150},{"time":"11:00","mwh":0},{"time":"12:30","mwh":135},{"time":"13:00","mwh":0},{"time":"13:30","mwh":135},{"time":"14:00","mwh":0},{"time":"16:30","mwh":580},{"time":"19:30","mwh":450},{"time":"21:30","mwh":0},{"time":"23:00","mwh":300},{"time":"24:00","mwh":0}],"idle_half_hours":14,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":68308,"share_of_perfect":1,"full_cycles":3.71,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":27420,"share_of_perfect":0.401,"full_cycles":2.05,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":35814,"share_of_perfect":0.524,"full_cycles":3.61,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-12345,"share_of_perfect":-0.181,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":17673,"share_of_perfect":0.259,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C2","date":"2021-01-26","stratum":"cv","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-01-26","label":"Tue 26 Jan 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-44.88,"time":"14:00"},"max":{"price":53.47,"time":"20:00"},"mean":10.89,"negative_half_hours":16,"cheapest_half_hours":[{"time":"14:00","price":-44.88},{"time":"13:30","price":-40.77},{"time":"16:00","price":-38.86},{"time":"17:00","price":-35.21}],"dearest_half_hours":[{"time":"20:00","price":53.47},{"time":"19:30","price":49.94},{"time":"19:00","price":43.69},{"time":"00:30","price":41.46}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":11539,"revenue_net_of_fixed_om":4881,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":-0.99,"avg_sell_price":10.33,"avg_price_spread":11.32,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":20.36,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":13004},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":-23.93,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-14227}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":26.85,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":12931},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":-32.95,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-4408},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":4.67,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":1793}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":60391,"share_of_perfect":1,"full_cycles":3.46,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":3136,"share_of_perfect":0.052,"full_cycles":1.55,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":1448,"share_of_perfect":0.024,"full_cycles":2.19,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-24977,"share_of_perfect":-0.414,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":11539,"share_of_perfect":0.191,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C3","date":"2021-02-15","stratum":"cv","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-02-15","label":"Mon 15 Feb 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":0.84,"time":"02:30"},"max":{"price":47.15,"time":"18:30"},"mean":19.27,"negative_half_hours":0,"cheapest_half_hours":[{"time":"02:30","price":0.84},{"time":"10:00","price":1.94},{"time":"10:30","price":2.91},{"time":"11:00","price":3.12}],"dearest_half_hours":[{"time":"18:30","price":47.15},{"time":"18:00","price":42.83},{"time":"17:30","price":39.95},{"time":"19:00","price":38.72}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":10340,"revenue_net_of_fixed_om":3683,"bought_from_grid_mwh":644.4,"sold_to_grid_mwh":522,"removed_from_storage_mwh":580,"full_cycles":1,"avg_buy_price":6.95,"avg_sell_price":28.57,"avg_price_spread":21.62,"charging_blocks":[{"from":"00:00","to":"02:30","half_hours":5,"avg_price":6.95,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":4441}],"selling_blocks":[{"from":"05:00","to":"07:00","half_hours":4,"avg_price":28.57,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":14782}],"stored_energy_after_each_block":[{"time":"02:30","mwh":580},{"time":"07:00","mwh":0}],"idle_half_hours":39,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":33991,"share_of_perfect":1,"full_cycles":2.23,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":10340,"share_of_perfect":0.304,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":9984,"share_of_perfect":0.294,"full_cycles":2.76,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-4441,"share_of_perfect":-0.131,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":24405,"share_of_perfect":0.718,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C4","date":"2021-02-21","stratum":"cv","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-02-21","label":"Sun 21 Feb 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-12.25,"time":"15:00"},"max":{"price":38.97,"time":"18:30"},"mean":23.2,"negative_half_hours":3,"cheapest_half_hours":[{"time":"15:00","price":-12.25},{"time":"14:30","price":-8.27},{"time":"16:00","price":-2.57},{"time":"12:30","price":3.19}],"dearest_half_hours":[{"time":"18:30","price":38.97},{"time":"18:00","price":35.34},{"time":"19:00","price":34.89},{"time":"23:30","price":33.1}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":25174,"revenue_net_of_fixed_om":18516,"bought_from_grid_mwh":1611.1,"sold_to_grid_mwh":1305,"removed_from_storage_mwh":1450,"full_cycles":2.5,"avg_buy_price":7.55,"avg_sell_price":28.79,"avg_price_spread":21.24,"charging_blocks":[{"from":"07:30","to":"08:00","half_hours":1,"avg_price":24.03,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":3572},{"from":"11:00","to":"11:30","half_hours":1,"avg_price":9.74,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":1448},{"from":"12:00","to":"13:30","half_hours":3,"avg_price":4.84,"avg_grid_mw":251.9,"energy_from_grid_mwh":377.8,"cost":1812},{"from":"14:30","to":"16:30","half_hours":4,"avg_price":-4.4,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-2618},{"from":"21:30","to":"23:00","half_hours":3,"avg_price":23.74,"avg_grid_mw":222.2,"energy_from_grid_mwh":333.3,"cost":7842}],"selling_blocks":[{"from":"08:30","to":"09:00","half_hours":1,"avg_price":29.99,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":3611},{"from":"11:30","to":"12:00","half_hours":1,"avg_price":13.33,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":1605},{"from":"13:30","to":"14:30","half_hours":2,"avg_price":18.48,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":4945},{"from":"18:00","to":"20:00","half_hours":4,"avg_price":35.54,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":18386},{"from":"23:00","to":"24:00","half_hours":2,"avg_price":32.46,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":8684}],"stored_energy_after_each_block":[{"time":"08:00","mwh":135},{"time":"09:00","mwh":0},{"time":"11:30","mwh":135},{"time":"12:00","mwh":0},{"time":"13:30","mwh":340},{"time":"14:30","mwh":40},{"time":"16:30","mwh":580},{"time":"20:00","mwh":0},{"time":"23:00","mwh":300},{"time":"24:00","mwh":0}],"idle_half_hours":26,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":25174,"share_of_perfect":1,"full_cycles":2.5,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":383,"share_of_perfect":0.015,"full_cycles":1.47,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":8795,"share_of_perfect":0.349,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-19487,"share_of_perfect":-0.774,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":4420,"share_of_perfect":0.176,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C5","date":"2021-04-14","stratum":"cv","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-04-14","label":"Wed 14 Apr 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-36.07,"time":"12:30"},"max":{"price":134.14,"time":"18:00"},"mean":7.09,"negative_half_hours":25,"cheapest_half_hours":[{"time":"12:30","price":-36.07},{"time":"03:30","price":-35.17},{"time":"02:30","price":-34.08},{"time":"02:00","price":-32.34}],"dearest_half_hours":[{"time":"18:00","price":134.14},{"time":"18:30","price":72.13},{"time":"17:30","price":71.85},{"time":"20:30","price":56.82}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":80935,"revenue_net_of_fixed_om":74278,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":-30.15,"avg_sell_price":43.8,"avg_price_spread":73.95,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":-32.88,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":-20997},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":-27.23,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":-16189}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":12.46,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":6001},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":13.65,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":1826},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":93.66,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":35922}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":95188,"share_of_perfect":1,"full_cycles":3.42,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":56318,"share_of_perfect":0.592,"full_cycles":1.68,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":58833,"share_of_perfect":0.618,"full_cycles":3.48,"stored_at_midnight_mwh":120},{"name":"Price thresholds","revenue":18955,"share_of_perfect":0.199,"full_cycles":0.26,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":80935,"share_of_perfect":0.85,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"C6","date":"2021-04-17","stratum":"cv","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2021-04-17","label":"Sat 17 Apr 2021","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":1.59,"time":"14:30"},"max":{"price":230.14,"time":"18:00"},"mean":55.62,"negative_half_hours":0,"cheapest_half_hours":[{"time":"14:30","price":1.59},{"time":"14:00","price":3.93},{"time":"13:30","price":4.52},{"time":"12:30","price":4.62}],"dearest_half_hours":[{"time":"18:00","price":230.14},{"time":"07:00","price":201.17},{"time":"18:30","price":176.11},{"time":"06:30","price":139.18}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":100079,"revenue_net_of_fixed_om":93422,"bought_from_grid_mwh":988.9,"sold_to_grid_mwh":801,"removed_from_storage_mwh":890,"full_cycles":1.53,"avg_buy_price":24.2,"avg_sell_price":155.96,"avg_price_spread":131.75,"charging_blocks":[{"from":"02:30","to":"04:00","half_hours":3,"avg_price":38.5,"avg_grid_mw":229.6,"energy_from_grid_mwh":344.4,"cost":13143},{"from":"09:30","to":"12:00","half_hours":5,"avg_price":16.56,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":10574}],"selling_blocks":[{"from":"06:00","to":"07:30","half_hours":3,"avg_price":166.45,"avg_storage_mw":206.7,"energy_to_grid_mwh":279,"revenue":46022},{"from":"17:00","to":"19:00","half_hours":4,"avg_price":150.35,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":77774}],"stored_energy_after_each_block":[{"time":"04:00","mwh":310},{"time":"07:30","mwh":0},{"time":"12:00","mwh":580},{"time":"19:00","mwh":0}],"idle_half_hours":33,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":116745,"share_of_perfect":1,"full_cycles":2.55,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":100079,"share_of_perfect":0.857,"full_cycles":1.53,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":103696,"share_of_perfect":0.888,"full_cycles":2,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":28169,"share_of_perfect":0.241,"full_cycles":1.29,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":90997,"share_of_perfect":0.779,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y1","date":"2025-01-21","stratum":"y2025","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-01-21","label":"Tue 21 Jan 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":12.13,"time":"09:00"},"max":{"price":199.99,"time":"06:00"},"mean":124.44,"negative_half_hours":0,"cheapest_half_hours":[{"time":"09:00","price":12.13},{"time":"09:30","price":14.72},{"time":"08:30","price":27.82},{"time":"10:00","price":34.67}],"dearest_half_hours":[{"time":"06:00","price":199.99},{"time":"05:30","price":197.59},{"time":"14:00","price":178.37},{"time":"05:00","price":173.51}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":106407,"revenue_net_of_fixed_om":99749,"bought_from_grid_mwh":1894.4,"sold_to_grid_mwh":1534.5,"removed_from_storage_mwh":1705,"full_cycles":2.94,"avg_buy_price":74.76,"avg_sell_price":162.26,"avg_price_spread":87.51,"charging_blocks":[{"from":"01:00","to":"02:30","half_hours":3,"avg_price":131.41,"avg_grid_mw":300,"energy_from_grid_mwh":450,"cost":58601},{"from":"03:30","to":"04:00","half_hours":1,"avg_price":136.34,"avg_grid_mw":100,"energy_from_grid_mwh":50,"cost":6755},{"from":"08:00","to":"10:30","half_hours":5,"avg_price":26.62,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":16999},{"from":"12:30","to":"13:00","half_hours":1,"avg_price":97.02,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":14422},{"from":"15:00","to":"17:00","half_hours":4,"avg_price":73.27,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":43569}],"selling_blocks":[{"from":"05:00","to":"06:30","half_hours":3,"avg_price":190.36,"avg_storage_mw":300,"energy_to_grid_mwh":405,"revenue":76403},{"from":"11:00","to":"12:00","half_hours":2,"avg_price":144.55,"avg_storage_mw":225,"energy_to_grid_mwh":202.5,"revenue":29009},{"from":"13:30","to":"15:00","half_hours":3,"avg_price":147,"avg_storage_mw":300,"energy_to_grid_mwh":405,"revenue":58999},{"from":"17:30","to":"18:30","half_hours":2,"avg_price":157.71,"avg_storage_mw":280,"energy_to_grid_mwh":252,"revenue":39385},{"from":"19:00","to":"19:30","half_hours":1,"avg_price":165.51,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":22143},{"from":"21:30","to":"22:00","half_hours":1,"avg_price":155.59,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":20816}],"stored_energy_after_each_block":[{"time":"02:30","mwh":405},{"time":"04:00","mwh":450},{"time":"06:30","mwh":0},{"time":"10:30","mwh":580},{"time":"12:00","mwh":355},{"time":"13:00","mwh":490},{"time":"15:00","mwh":40},{"time":"17:00","mwh":580},{"time":"18:30","mwh":300},{"time":"19:30","mwh":150},{"time":"22:00","mwh":0}],"idle_half_hours":22,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":106407,"share_of_perfect":1,"full_cycles":2.94,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":49826,"share_of_perfect":0.468,"full_cycles":1.47,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":24182,"share_of_perfect":0.227,"full_cycles":2.45,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":75983,"share_of_perfect":0.714,"full_cycles":1.93,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":-31131,"share_of_perfect":-0.293,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y2","date":"2025-02-07","stratum":"y2025","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-02-07","label":"Fri 7 Feb 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-37.4,"time":"17:00"},"max":{"price":246.72,"time":"05:30"},"mean":89.3,"negative_half_hours":6,"cheapest_half_hours":[{"time":"17:00","price":-37.4},{"time":"17:30","price":-16.86},{"time":"14:30","price":-14.76},{"time":"15:00","price":-8.76}],"dearest_half_hours":[{"time":"05:30","price":246.72},{"time":"06:00","price":230.5},{"time":"04:30","price":196.73},{"time":"08:00","price":196.16}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":-52360,"revenue_net_of_fixed_om":-59017,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":112.04,"avg_sell_price":85.9,"avg_price_spread":-26.13,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":156.81,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":100148},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":63.95,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":38024}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":140.57,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":67700},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":-2.73,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":-365},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":48.18,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":18478}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":104771,"share_of_perfect":1,"full_cycles":3.29,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":15661,"share_of_perfect":0.149,"full_cycles":1.28,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":19995,"share_of_perfect":0.191,"full_cycles":2.7,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":-34500,"share_of_perfect":-0.329,"full_cycles":0,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":-52360,"share_of_perfect":-0.5,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y3","date":"2025-04-26","stratum":"y2025","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-04-26","label":"Sat 26 Apr 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":35.06,"time":"09:30"},"max":{"price":140.4,"time":"18:00"},"mean":97.93,"negative_half_hours":0,"cheapest_half_hours":[{"time":"09:30","price":35.06},{"time":"12:30","price":43.14},{"time":"14:30","price":46.82},{"time":"10:00","price":50.32}],"dearest_half_hours":[{"time":"18:00","price":140.4},{"time":"20:30","price":139.68},{"time":"17:30","price":137.61},{"time":"17:00","price":134.04}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":36975,"revenue_net_of_fixed_om":30317,"bought_from_grid_mwh":688.9,"sold_to_grid_mwh":558,"removed_from_storage_mwh":620,"full_cycles":1.07,"avg_buy_price":52.03,"avg_sell_price":131.1,"avg_price_spread":79.07,"charging_blocks":[{"from":"09:30","to":"10:00","half_hours":1,"avg_price":35.06,"avg_grid_mw":88.9,"energy_from_grid_mwh":44.4,"cost":1544},{"from":"12:00","to":"13:00","half_hours":2,"avg_price":44.9,"avg_grid_mw":194.4,"energy_from_grid_mwh":194.4,"cost":8652},{"from":"14:00","to":"15:30","half_hours":3,"avg_price":56.79,"avg_grid_mw":300,"energy_from_grid_mwh":450,"cost":25325}],"selling_blocks":[{"from":"11:00","to":"11:30","half_hours":1,"avg_price":59.91,"avg_storage_mw":80,"energy_to_grid_mwh":36,"revenue":2137},{"from":"16:30","to":"18:30","half_hours":4,"avg_price":136.01,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":70358}],"stored_energy_after_each_block":[{"time":"10:00","mwh":40},{"time":"11:30","mwh":0},{"time":"13:00","mwh":175},{"time":"15:30","mwh":580},{"time":"18:30","mwh":0}],"idle_half_hours":37,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":43120,"share_of_perfect":1,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":36975,"share_of_perfect":0.857,"full_cycles":1.07,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":31675,"share_of_perfect":0.735,"full_cycles":1.52,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":25172,"share_of_perfect":0.584,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":15931,"share_of_perfect":0.369,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y4","date":"2025-07-16","stratum":"y2025","strategy":"perfect","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-07-16","label":"Wed 16 Jul 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":2.04,"time":"23:30"},"max":{"price":242.31,"time":"17:30"},"mean":88.18,"negative_half_hours":0,"cheapest_half_hours":[{"time":"23:30","price":2.04},{"time":"23:00","price":5.35},{"time":"00:30","price":5.36},{"time":"03:30","price":5.96}],"dearest_half_hours":[{"time":"17:30","price":242.31},{"time":"18:00","price":229.66},{"time":"18:30","price":206.8},{"time":"08:30","price":201.06}]},"strategy":{"id":"perfect","name":"Perfect foresight","sees_future_prices":true,"how_it_decides":"Knows every price of the day in advance. The upper bound (mandatory task)."},"schedule":{"revenue":169707,"revenue_net_of_fixed_om":163049,"bought_from_grid_mwh":1605.6,"sold_to_grid_mwh":1300.5,"removed_from_storage_mwh":1445,"full_cycles":2.49,"avg_buy_price":33.84,"avg_sell_price":173.45,"avg_price_spread":139.62,"charging_blocks":[{"from":"00:30","to":"01:00","half_hours":1,"avg_price":5.36,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":796},{"from":"02:00","to":"03:00","half_hours":2,"avg_price":8.49,"avg_grid_mw":194.4,"energy_from_grid_mwh":194.4,"cost":1636},{"from":"03:30","to":"04:30","half_hours":2,"avg_price":7.45,"avg_grid_mw":300,"energy_from_grid_mwh":300,"cost":2215},{"from":"05:30","to":"06:00","half_hours":1,"avg_price":9.84,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":1462},{"from":"10:30","to":"12:30","half_hours":4,"avg_price":49.22,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":29264},{"from":"13:00","to":"13:30","half_hours":1,"avg_price":63.8,"avg_grid_mw":88.9,"energy_from_grid_mwh":44.4,"cost":2810},{"from":"15:30","to":"16:30","half_hours":2,"avg_price":94.76,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":15651}],"selling_blocks":[{"from":"05:00","to":"05:30","half_hours":1,"avg_price":22.35,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":2691},{"from":"07:00","to":"07:30","half_hours":1,"avg_price":172.47,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":23074},{"from":"08:30","to":"10:00","half_hours":3,"avg_price":171.37,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":65722},{"from":"15:00","to":"15:30","half_hours":1,"avg_price":137.52,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":18398},{"from":"17:30","to":"19:30","half_hours":4,"avg_price":219.71,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":113657}],"stored_energy_after_each_block":[{"time":"01:00","mwh":135},{"time":"03:00","mwh":310},{"time":"04:30","mwh":580},{"time":"05:30","mwh":445},{"time":"06:00","mwh":580},{"time":"07:30","mwh":430},{"time":"10:00","mwh":0},{"time":"12:30","mwh":540},{"time":"13:30","mwh":580},{"time":"15:30","mwh":430},{"time":"16:30","mwh":580},{"time":"19:30","mwh":0}],"idle_half_hours":25,"stored_at_midnight_mwh":0,"proven_optimal":true},"all_strategies":[{"name":"Perfect foresight","revenue":169707,"share_of_perfect":1,"full_cycles":2.49,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":145364,"share_of_perfect":0.857,"full_cycles":2.78,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":107211,"share_of_perfect":0.632,"full_cycles":2,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":81359,"share_of_perfect":0.479,"full_cycles":2,"stored_at_midnight_mwh":580},{"name":"Time of day","revenue":137094,"share_of_perfect":0.808,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y5","date":"2025-08-23","stratum":"y2025","strategy":"time_of_day","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-08-23","label":"Sat 23 Aug 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":3.42,"time":"14:00"},"max":{"price":233.05,"time":"21:30"},"mean":106.7,"negative_half_hours":0,"cheapest_half_hours":[{"time":"14:00","price":3.42},{"time":"14:30","price":6.31},{"time":"15:00","price":13.71},{"time":"10:30","price":21.38}],"dearest_half_hours":[{"time":"21:30","price":233.05},{"time":"21:00","price":221.98},{"time":"20:30","price":196.21},{"time":"07:30","price":183.2}]},"strategy":{"id":"time_of_day","name":"Time of day","sees_future_prices":false,"how_it_decides":"Replays one fixed daily schedule learnt from the 2018-2020 average price shape."},"schedule":{"revenue":82883,"revenue_net_of_fixed_om":76226,"bought_from_grid_mwh":1244.4,"sold_to_grid_mwh":1008,"removed_from_storage_mwh":1120,"full_cycles":1.93,"avg_buy_price":58.81,"avg_sell_price":155.58,"avg_price_spread":96.77,"charging_blocks":[{"from":"02:00","to":"04:30","half_hours":5,"avg_price":91.22,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":58255},{"from":"11:30","to":"13:30","half_hours":4,"avg_price":24.01,"avg_grid_mw":300,"energy_from_grid_mwh":600,"cost":14274}],"selling_blocks":[{"from":"06:30","to":"08:30","half_hours":4,"avg_price":165.45,"avg_storage_mw":270,"energy_to_grid_mwh":486,"revenue":79683},{"from":"16:30","to":"17:00","half_hours":1,"avg_price":134.46,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":17989},{"from":"17:30","to":"19:00","half_hours":3,"avg_price":150.56,"avg_storage_mw":286.7,"energy_to_grid_mwh":387,"revenue":57741}],"stored_energy_after_each_block":[{"time":"04:30","mwh":580},{"time":"08:30","mwh":40},{"time":"13:30","mwh":580},{"time":"17:00","mwh":430},{"time":"19:00","mwh":0}],"idle_half_hours":31,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":131622,"share_of_perfect":1,"full_cycles":2,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":69700,"share_of_perfect":0.53,"full_cycles":1.47,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":88425,"share_of_perfect":0.672,"full_cycles":2.26,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":60685,"share_of_perfect":0.461,"full_cycles":1.47,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":82883,"share_of_perfect":0.63,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}},{"id":"Y6","date":"2025-09-13","stratum":"y2025","strategy":"rolling","maxCycles":null,"reason":"Drawn at random (seeded) from the sample.","snapshot":{"page":"Dispatch Lab: one market day of a grid battery in Victoria (NEM region VIC1)","market_day":{"date":"2025-09-13","label":"Sat 13 Sep 2025","region":"VIC1","times":"Market time (AEST). Each half-hour is named by its start: the block from 14:30 to 15:00 covers one half-hour."},"battery":{"power_mw":300,"capacity_mwh":580,"storage_hours":1.93,"charge_efficiency":0.9,"discharge_efficiency":0.9,"round_trip_efficiency":0.81,"marginal_loss_factor":0.991,"degradation_cost_per_mwh":0,"fixed_om_per_day":6658,"starts_empty":true,"cycle_limit":null},"prices":{"min":{"price":-11.55,"time":"13:30"},"max":{"price":272.63,"time":"18:00"},"mean":113.89,"negative_half_hours":11,"cheapest_half_hours":[{"time":"13:30","price":-11.55},{"time":"13:00","price":-11.15},{"time":"14:00","price":-11.15},{"time":"11:30","price":-10.17}],"dearest_half_hours":[{"time":"18:00","price":272.63},{"time":"19:00","price":260.13},{"time":"18:30","price":259.77},{"time":"17:30","price":258.99}]},"strategy":{"id":"rolling","name":"Rolling persistence","sees_future_prices":false,"how_it_decides":"Every half hour: sees only the current price, assumes the coming half-hours repeat the same half-hours yesterday, re-plans, acts once. In this run it plans only to the end of the day, the fair horizon when each day is scored on its own."},"schedule":{"revenue":91011,"revenue_net_of_fixed_om":84354,"bought_from_grid_mwh":1294.4,"sold_to_grid_mwh":1048.5,"removed_from_storage_mwh":1165,"full_cycles":2.01,"avg_buy_price":79.82,"avg_sell_price":186.13,"avg_price_spread":106.31,"charging_blocks":[{"from":"05:00","to":"06:00","half_hours":2,"avg_price":167.51,"avg_grid_mw":166.7,"energy_from_grid_mwh":166.7,"cost":27668},{"from":"07:30","to":"10:00","half_hours":5,"avg_price":20.5,"avg_grid_mw":257.8,"energy_from_grid_mwh":644.4,"cost":13095},{"from":"15:30","to":"16:00","half_hours":1,"avg_price":86.48,"avg_grid_mw":300,"energy_from_grid_mwh":150,"cost":12856},{"from":"20:30","to":"22:30","half_hours":4,"avg_price":147.65,"avg_grid_mw":166.7,"energy_from_grid_mwh":333.3,"cost":48774}],"selling_blocks":[{"from":"06:00","to":"06:30","half_hours":1,"avg_price":239.66,"avg_storage_mw":300,"energy_to_grid_mwh":135,"revenue":32063},{"from":"15:00","to":"15:30","half_hours":1,"avg_price":62.46,"avg_storage_mw":270,"energy_to_grid_mwh":121.5,"revenue":7521},{"from":"17:00","to":"19:00","half_hours":4,"avg_price":243.37,"avg_storage_mw":290,"energy_to_grid_mwh":522,"revenue":125898},{"from":"23:00","to":"24:00","half_hours":2,"avg_price":104.35,"avg_storage_mw":300,"energy_to_grid_mwh":270,"revenue":27922}],"stored_energy_after_each_block":[{"time":"06:00","mwh":150},{"time":"06:30","mwh":0},{"time":"10:00","mwh":580},{"time":"15:30","mwh":445},{"time":"16:00","mwh":580},{"time":"19:00","mwh":0},{"time":"22:30","mwh":300},{"time":"24:00","mwh":0}],"idle_half_hours":28,"stored_at_midnight_mwh":0},"all_strategies":[{"name":"Perfect foresight","revenue":156181,"share_of_perfect":1,"full_cycles":2.27,"stored_at_midnight_mwh":0},{"name":"Rolling persistence","revenue":91011,"share_of_perfect":0.583,"full_cycles":2.01,"stored_at_midnight_mwh":0},{"name":"Day-ahead persistence","revenue":63370,"share_of_perfect":0.406,"full_cycles":2.29,"stored_at_midnight_mwh":0},{"name":"Price thresholds","revenue":111681,"share_of_perfect":0.715,"full_cycles":1,"stored_at_midnight_mwh":0},{"name":"Time of day","revenue":70487,"share_of_perfect":0.451,"full_cycles":1.93,"stored_at_midnight_mwh":0}],"notes":["Revenue = marginal loss factor x price x energy at the grid connection, minus any degradation cost; buying costs money, selling earns it.","Perfect foresight is the optimiser (an exact solution of the brief's linear program) knowing every price of the day; it is the upper bound.","The no-foresight strategies see only past and current prices.","Every strategy starts the day empty and the day is scored on its own: energy still stored at midnight (stored_at_midnight_mwh) was paid for but earns nothing in this revenue.","share_of_perfect is revenue / perfect-foresight revenue (null when perfect earns under $1,000)."]}}]}