GENIE · RESEARCH
Dynamic pricing · a simulation study on one real lot

What a parking space is worth at 4 a.m.

450 spaces 2 years of transaction data

There is no right price for a parking space.

The same 12 square metres are worth one thing at four in the morning, when 350 of 450 spaces sit empty, and something else entirely at two in the afternoon on an event day, when 15 are left. The lot charges €3 for both.

That isn't a mistake anyone made. It's the only thing a static tariff can do.

So we asked a better question: what does that cost, and what would it take to get it back?


01 - the lot

450 spaces, one price, two years

The lot is a 450-space underground facility in a central district of a large Greek city, open 24/7, run by a public exhibition authority. It serves two populations that behave nothing alike: roughly 250 monthly subscribers who arrive on their own schedules and never see the hourly price, and transient drivers who come for shopping, work and events, and are the only ones a price can influence.

First hour€3.00
Second hour€2.00
Third hour onward€1.00
24-hour maximum€27.00

The operator gave us the data. What we did with it is our own analysis on it. The raw material is the lot's full Parking Management System transaction log, roughly 720 daily files covering a continuous two-year window, every gate entry and every exit-with-payment, tagged transient or subscriber. Cleaned and resampled to hourly bins, that's 16,900 operating hours and 439,186 transient arrivals.

The two customer types are not variations on a theme. They are different products sold through the same barrier:

Stay duration distributionshare of stays
0%14%28%42%56%70%10.5≤ 1h26.31–2h24.52–3h16.23–4h19.84–8h2.764.9> 8h
Transient stays (orange) versus subscriber stays (blue), by duration bucket.

Reading it: the median transient stay is 2 hours 32 minutes; the median subscriber stay is over 12 hours. Two thirds of subscriber stays run past eight hours, which is what makes them a capacity problem rather than a pricing opportunity.


02 - demand

The same price for a tenfold swing

Mean arrivals by hour of dayarrivals / hour
0142842567000040812162023arrivals / hour
Transient arrivals (orange) against subscriber arrivals (blue), averaged across two years.

Transient arrivals run near zero through the small hours, climb from 07:00, and peak around 60 an hour at midday and again in the early evening. Subscribers do something completely different, a flat band of 15 to 20 an hour across the whole working day, indifferent to all of it.

Reading it: the orange bars move by a factor of ten between 04:00 and 11:00. The price does not move at all. Every hour in that range is either leaving money on the table or turning away drivers, and the tariff has no way to tell which.

The blue bars matter for a different reason. Subscribers consume physical capacity but never respond to the hourly price, so they are not customers of a pricing policy, they are a constraint on one.

There is also a measurement problem hiding in that chart. When the lot is nearly full, drivers who would have parked never appear in the data, they see the queue at the barrier and keep driving. Those hours record a floor on demand, not demand:

Demand censoring16,900 hours
15,820 hrs · 93.6% · demand visible6.4%1,080 hrs at ≥90% occupancy — demand censored
Roughly 11 hours a week: weekend afternoons, weekday evenings between 17:00 and 19:00, and exhibition days.

Why this matters later: those 1,080 hours are precisely the hours where price has the most room to work.


03 - capacity

You do not have 450 spaces to sell

Before you can price an hour, you have to know how much of the lot is actually for sale in that hour. Published capacity is 450. The number available to a pricing policy is 450 minus whatever the subscribers are occupying, and that moves by hour, by weekday and by season.

Available capacity across the dayspaces
0150300450nominal capacity 450350 free at 04:00175 free at 14:0000040812162023subscriber occupancy (spaces)
Subscriber occupancy (indigo) against nominal capacity of 450. The gap is what a pricing policy can sell.

Subscriber occupancy is forecast from time features alone, hour, weekday, month, event flag, then a buffer is subtracted, because a point forecast that is right on average will still deny entry to a paying subscriber on the days it runs low. The buffer is k standard deviations of the model's own residuals, computed separately for each of the 168 hour-by-weekday bins. Residual spread across those bins ranges from about 1 to 21 spaces, so a single global buffer would be far too cautious at 3 a.m. and far too optimistic on a Monday evening.

Reading it: k is not a taste parameter. We set an operational tolerance first, at most 24 subscriber turn-aways per year, and then solved for the smallest buffer that meets it. That gives k = 2.80, an estimated 23.6 turn-aways a year. Tighten the tolerance and you sell fewer transient spaces; loosen it and you start breaking a contract you already sold.


04 - elasticity

Nobody can tell you how your drivers respond to price

The second thing you need is the answer to if I charge €4 instead of €3, how many drivers do I lose? That quantity, price elasticity of demand, is different for every lot and is not knowable in advance.

The usual move in the literature is to take a number from a published study, fix it, and never revisit it. We treat it as an unknown with uncertainty attached. Every day of operation, the system compares the demand it expected against the demand it got at the price it charged, and updates.

Elasticity posterior convergenceposterior density
true ε = −0.75-1.2-0.9-0.6-0.30.0prior (literature)posterior, 50 daysposterior, 500 daysprice elasticity of demand (ε)
The prior from the literature (violet) narrows onto the lot's true elasticity (dashed) within months.

Reading it: the violet curve is what the literature tells you before you have seen a single transaction, wide enough to contain anything from barely responsive to quite price-sensitive. In this run the lot's real elasticity is −0.75, well outside where the prior expected it.

After 50 days the estimate has moved to −0.713 and the spread has collapsed from σ = 0.20 to 0.042. After 500 days it sits at −0.753, within 0.003 of the truth. The system does not stay trapped in the literature's answer; it converges on this lot's answer, at a pace measured in months.

Because elasticity is drawn from a distribution rather than fixed, the environment the pricing agent acts in is genuinely stochastic. If elasticity were a known constant, the optimal policy could be computed analytically and there would be nothing to learn.


05 - the loop

Four steps, once an hour

The pricing looponce an hour
STEP 0Forecast availablecapacitySTEP 1Forecast transientdemandSTEP 2Estimate elasticityfor this hourSTEP 3Choose the pricefor hour t

The literature on reinforcement-learning parking pricing generally treats capacity as a constant and elasticity as a constant borrowed from someone else's study. Steps 1 and 3 are conventional: a gradient-boosted demand forecast, and a policy that picks a price.


06 - policies

Four ways to set the price

With the same inputs available to all of them, we compared four decision rules. Each adds exactly one capability to the one before it, which is what makes the comparison readable: any gap between two rows is attributable to the thing that changed.

PolicyHow it decidesLooks ahead
M0 staticCharges €3.00. Always. This is what the lot does today.-
M1 reactiveReads current occupancy and raises the price through five fixed thresholds. No forecast, no optimisation.nothing
M2 predictiveScores every candidate price against forecast demand and current elasticity, and takes the best one.1 hour
M3 learningSame inputs as M2, but trained to maximise the whole day rather than the next hour.the day

M1, M2 and M3 all choose from the same nine prices, €2.00 to €6.00 in €0.50 steps, and all vary only the first-hour price, keeping the descending structure of the existing tariff intact underneath. The ceiling of €6 is deliberate. A wider range would give the policy more room at peak, and would also produce prices an operator would refuse to publish.


07 - revenue

What each policy earns in a day

Mean revenue per day€ / day
€562M0static€659M1reactive€942M2predictive€966M3learning
140 test days, 11,200 simulated 24-hour cycles. The learning policy (M3) is in gold.

The learning policy earns 72% more per day than the flat tariff, across 140 held-out test days and 11,200 simulated 24-hour cycles.

That number belongs to this lot. It charges €3 at 4 a.m. and €3 at 2 p.m. on an exhibition day, and has done so for two years without exception. The gap between that and any informed price is unusually wide, a lot that already moves its price by season has far less to recover.

It is also a simulation number. In a live deployment we would expect 20-40%. The difference is everything a simulation cannot see: drivers walking to the lot down the street, drivers learning the pattern and arriving twenty minutes earlier, stay durations that drift, and an operator who overrules the model on the week of a big event.

The useful version of this: how much a lot stands to gain depends almost entirely on how badly it is priced today. A flat 24/7 tariff on a lot with a tenfold intraday demand swing is the maximum case. A lot already running seasonal rates is the minimum case. The answer for any given site is a data question, not a sales question.


08 - the finding

Charging more is not the same as pricing well

Any policy that raises the average price will raise revenue somewhat, and will lose some drivers doing it. The question worth asking is whether the revenue gained is worth the demand given up. So we track the ratio of the two.

Price uplift vs revenue uplift% uplift · ratio ρ
0%20%40%60%80%42.316.7M1ρ = 0.3920.068.8M2ρ = 3.4413.373.5M3ρ = 5.53price upliftrevenue uplift
ρ is revenue uplift ÷ price uplift. Below 1, a policy is buying revenue with lost customers.

The reactive rule raises the average price by 42% and gets 17% more revenue for it. Every point of price it adds costs it roughly two points of volume. It is not pricing; it is charging more and losing customers, and the ratio below 1 says so plainly.

The predictive policy inverts that: 20% more price returns 69% more revenue. The learning policy inverts it further, and this is the number worth remembering, 13% more price returns 73% more revenue. It charges less than either of the other two and earns more than both.

Reading it: a ratio below 1 means the policy is buying revenue with lost customers. Above 1 means it is finding the hours and the drivers where price genuinely has room. The gap between 0.39 and 5.53 is not a gap in aggression. It is the difference between reacting to a full lot and knowing why it is full.


09 - stability

The smart policy is also the calm one

The standing objection to dynamic pricing is that it produces a price board nobody can trust, a number that lurches hour to hour and makes drivers feel gamed. That objection is well-founded, and one of our own policies proves it.

PolicyPrice swing within a dayRevenue per day
M0 static±€0.00€562
M1 reactive±€0.82€659
M2 predictive±€1.25€942
M3 learning±€0.17€966

The predictive policy is the volatile one. It optimises the next hour and only the next hour, so it swings hard between extremes, pricing high while the lot fills, then dropping to recover the occupancy its own last decision cost it. That is the behaviour drivers notice and resent.

The learning policy moves the price by 17 cents around its daily mean, 86% less than the predictive one, while earning more. Not because we penalised volatility into it, though there is a smoothness term in the reward, but because a policy optimising the whole day has no reason to create a problem at 11 a.m. that it has to fix at 1 p.m.

Reading it: for an operator or a municipality, this is the row that matters more than the revenue column. A pricing system that moves the board by less than a euro across the day is one you can put in front of the public. One that moves it by €1.25 is one you will be defending in a council meeting.


10 - limits

What this does not prove

It is simulation, not deployment. The historical record contains only one price, €3, so what happens at €4.50 has to be modelled rather than observed. The environment reproduces arrivals, stay durations and price response faithfully, but it does not contain drivers who divert to a competing lot, drivers who learn the pricing pattern over months, stay durations that shift as the price changes, or an operator who overrides the system. All four would move the numbers, most of them downward.

The congested hours are imputed. The 1,080 hours where the lot ran at 90% or above are filled in from comparable uncongested hours. It improves accuracy overall and introduces a bias of its own: the model systematically over-predicts Monday mornings between 10:00 and 12:00 by 13 to 17 arrivals. A censored-regression treatment would handle it better.

Subscribers are treated as fixed. The system prices around them but never prices to them. Whether a subscription is correctly priced, and how many subscribers a lot should sell at all, is a related optimisation we have not touched.

One lot, one city. The method is written to generalise and nothing in it depends on this particular facility. But it has been demonstrated on one.


what we are doing with it

The next number has to come from a real lot

This work is the algorithmic core of what we are building at GENIE. The honest state of it is that the method is validated in simulation against real demand, and the next thing it needs is a live site, where diversion, driver learning and operator judgement are all present and can be measured rather than assumed.

If you run an off-street facility with a mixed subscriber and transient base, we can tell you how much of this applies to you before anyone commits to anything. It starts with your own historical data and ends with a written diagnosis of what your current tariff is leaving on the table.

Talk to us about your lot

Questions about dynamic parking pricing

Does dynamic parking pricing mean higher prices?

Not necessarily. In this study the best policy raised the average price by just 13% while earning 73% more revenue, and it lowered prices during quiet hours. A cruder rule that simply charged more actually lost customers, raising the price 42% for only 17% more revenue.

How much revenue can dynamic parking pricing add?

In this simulation on two years of real transaction data, the learning policy earned 72% more per day than a flat tariff. In a live deployment we would expect 20-40%. How much a given lot can gain depends almost entirely on how badly it is priced today.

What data does dynamic parking pricing need?

A lot's own historical transaction log, gate entries and exits with payment, tagged transient or subscriber. This study used roughly 720 daily files across a continuous two-year window, resampled to 16,900 hourly observations.

Is dynamic parking pricing fair to drivers?

It can be. The best policy here moved the price by only 17 cents around its daily average, 86% less volatile than a naive hour-by-hour rule, so the board stays stable and predictable rather than lurching from hour to hour.

Data: the complete parking management system transaction log from a 450-space off-street facility operated by a public exhibition authority, roughly 720 daily files across a continuous two-year window, resampled to 16,900 hourly observations. Evaluation: 140 held-out test days, 20 Monte Carlo trajectories per day and policy, 11,200 simulated 24-hour episodes; strictly chronological train/validation/test split. Elasticity prior from Lehner & Peer (2019). Demand and subscriber-occupancy models are gradient-boosted regressors; the learning policy is a deep Q-network. All revenue figures are simulated. The operator provided the data and did not commission, review or endorse this analysis.