Competitive Pricing Dynamics

A small System Dynamics model of two competitors setting prices against each other.
Keywords

system dynamics, systemdynamics, pricing, competition, bptk, bptk-py, python, business simulation

Competitive Pricing Model

We create our model using the Model class as follows:

The stock and flow model consists of six parts:

  • Production and inventory
  • Demand formation
  • Price adjustment
  • Profit
  • Perceived Inventory
  • Expected Profitability

The following sections explain each part in more detail. Furthermore, they demonstrate the composition of stocks, flows, converters and constants.

Creating model

1) Production and Inventory

Stocks: production capacity, production, inventory

Flows: production start rate, production rate, consumption rate

Converters: effect of profitability on capacity utilization,capacity utilization, inventory coverage

Constants: production time

Normalized expected profitability and demand are not constants. They are results of other parts.

2) Demand formation

This model does not have any stocks or flows.

Converters: relative value of product, effect of relative value on demand, reference demand, demand

Constants: price of substitutes, size of shock, market shock on

Price is not a constant. It is a result of another part.

3) Price Adjustment

This section contains two models. The first model determines the minimum price. The second describes the formation of the product’s price.

This model does not have any stocks, flows or constants. Unit variable cost and unit capacity cost are results of other parts.

Converters: capacity cost per unit, minimum price

Stocks: expected price

Flows: change in expected price

Converters: indicated price, effect of inventory coverage on price, price

Constants:

Minimum price and normalized inventory coverage are not constants. Minimum price is a result of the previous model and normalized inventory coverage is a result of another part.

4) Profit

This model has no stocks and flows. Production capacity is not a stock of this part. It is a result of the “Production and Inventory” part from the beginning.

Converters: capacity cost, variable cost, cost, revenue, profit

Constants: unit capacity cost, unit variable cost

Production rate, price and consumption rate are not constants of this model. They are results of other parts. Production rate and consumption rate are converters of the “Production and Inventory” model. Price is a converter of the “Price Adjustment” part.

5) Perceived Inventory

Commodity Pricing Dynamics

Stocks: perceived inventory coverage

Flows: change in perceived inventory coverage

Converters: normalized perceived inventory coverage

Constants: inventory coverage perception time, reference inventory coverage

Inventory coverage is not a constant of this part. It is a converter and a result of the “Production and Inventory” model.

6) Expected Profitability

Stocks: expected profitability

Flows: change in expected profitability

Converters: normalized expected profitability

Constants: profit adjustment time, reference expected profitability

Profit is not a constant of this part. It is a result of the “Profit” model.

Initializing the stocks

Defining Equations

Production and Inventory

The stocks production and inventory have inflows and outflows.

We define the effect of profitability on capacity utilzation in our model using a non-linear relationship (depending on the normalized expected profitability). We capture this relationship in a lookup table that we store in the points property of the model (using a Python list):

Demand Formation

Price Adjustment

Profit

Perceived Inventory Coverage

Expected Profitability

Scenario Management

We now use the scenario management of the BPTK-Py framework. We first import the library.

Then we set up a scenario manager using a Python dictionary. The scenario manager identifies the baseline constants of the model:

The next step is to register the scenario manager as follows:

Once we have this, we can define and register more scenarios as follows:

Using the plot_lookup function on the bptk class, we can compare the lookup functions between different scenarios.

Scenario Experiments

Base Case

Let’s quickly run through the base case first, which starts the model in equilibrium.

The equilibrium price for our product is set at EUR 3. This is equal to both the indicated price and the expected price. The minimum price (the amount we need to be profitable) is at EUR 1.5

Initially there is a reference demand of 100 units per month. Because the market is in equilibrium, the reference demand (i.e. the demand given the equilibrium price) equals the actual demand.

Our production capacity is 200 units per month - but we only produce 100 units per month to avoid overstocking and are thus at a utilization of 50%. 300 units are “work in progress” within production.

Capacity utilization is thus at 50%.

The inventory is also at 300 and the consumption rate equals the demand, i.e. is at 100.

This leads to an inventory coverage of 3.

Market Shock

Let’s investigate what happens if there is a sudden increase in the underlying demand of 50% at timestep 10. Note that the increase in demand is at the current level of pricing.

The graph below shows how the actual demand and the inventory develops - as expected, there is an inital demand peak. But this causes the inventory to drop, which increases the price. The increase price leads to increased production, which then lowers the price and thus increases demand.

This is because the actual price affects the demand - if the price is higher then the reference price, demand drops, if the price is lower, demand increases compared to the reference demand.

The plot below shows how the dependency is quantified in this model using a non-linear function - the exact shape of this function will depend on your specific situation.

We also assume that prices are sensitive to the availability of the product. If the product becomes scare (i.e. the inventory coverage falls), prices go up, and vice versa. The dependency is modelled using the following table function:

The production rate increases to a new, much higher level.

The price increases initially, because of the drop in inventory coverage. But the inventory coverage quickly recoveres due to increase production. Because inventory coverage influences the price, this leads to a price that is actually lower than the original price, but also to a demand that is higher than that indicated by the initial market shock.

even though the overall demand incrase is only at around 75%, our profits more than double, as seen in the graph below.

This is because we are utilizing our production capacity better: we go from a utilization of 50% to a utilization above 90%, as seen in the graph below.

The figures above show that with the given shock of a 50% increase in underlying demand, we get close to our capacity limits.

Try It Yourself

The scenarios above are fixed: a base case and a 50 % demand shock. The cell below registers one more that is yours to change. Two constants are the interesting ones - sizeOfShock is the size of the demand jump in percent, and marketShockOn switches it on at all - and the chart underneath compares your scenario against the base case.

Change a number, press play, and the chart redraws. A shock of 20 rather than 50 is a good first move: does the profit still more than double?