Part II: Petroleum Data Engineering

Chapter 9

Production Decline Curve Analysis

schedule15 min readfitness_center10 exercises

Why This Chapter Exists

Every well ever drilled will eventually stop producing. The question is not if production will decline, but how fast, by how much, and how much oil or gas remains to be recovered. These questions drive some of the largest financial decisions in the industry: whether to drill additional wells, when to invest in artificial lift, how to value an asset for acquisition, and when to abandon a field.

Decline Curve Analysis (DCA) is the primary tool for answering these questions. It fits mathematical models to a well's production history and extrapolates into the future. The method is deceptively simple --- you are fitting a curve to data points --- but the engineering judgment required to do it well is substantial. A poorly chosen model or a careless fit can overestimate reserves by millions of barrels, leading to investment decisions that destroy value.

This chapter teaches you to do DCA properly: understanding the physics behind each model, fitting them rigorously with Python, quantifying uncertainty, and knowing when each model applies and when it breaks down.

infoWhat You'll Learn

  • The physical basis for production decline in oil and gas wells
  • Arps' three decline models: exponential, hyperbolic, and harmonic
  • Fitting decline parameters to production data using scipy.optimize
  • Calculating Estimated Ultimate Recovery (EUR) and remaining reserves
  • Modified Hyperbolic and Duong models for unconventional wells
  • Probabilistic DCA: generating P10, P50, and P90 forecasts
  • Automating DCA across a portfolio of wells

The Physics of Decline

Before touching any equations, you need to understand why production declines in the first place.

When a well first begins producing, the reservoir pressure near the wellbore is high. Hydrocarbons flow toward the well driven by the pressure difference between the reservoir and the wellbore. Over time, as fluid is withdrawn, the pressure around the well drops. The driving force weakens. Flow rates decrease.

How quickly this happens depends on several factors:

  • Reservoir permeability --- how easily fluid moves through the rock. High-permeability reservoirs deliver fluid quickly but can also deplete quickly.
  • Drive mechanism --- whether the reservoir has natural energy support (water drive, gas cap expansion) or relies solely on fluid expansion.
  • Well completion --- the number and placement of perforations, the length of the horizontal section, whether hydraulic fracturing was performed.
  • Fluid properties --- gas wells decline differently from oil wells because gas is compressible and its flow behavior changes with pressure.

These physical factors determine the shape of the decline curve. Arps' empirical models capture that shape mathematically.

Arps' Decline Models

In 1945, J.J. Arps published a framework that remains the foundation of DCA to this day. He defined decline in terms of the loss ratio, which describes how quickly the production rate changes relative to its current value. From this single concept, three models emerge depending on how the loss ratio behaves over time.

The Loss Ratio

The instantaneous decline rate DD is defined as:

D=1qdqdtD = -\frac{1}{q}\frac{dq}{dt}

This is the fractional rate of change of production. If a well produces 1,000 bbl/d today and loses 10 bbl/d per day, D=0.01D = 0.01 per day, or about 3.65 per year.

What matters is how DD changes over time:

  • If DD is constant --- the decline rate never changes --- you get exponential decline.
  • If DD decreases over time at a rate proportional to DD itself --- you get hyperbolic decline.
  • If DD decreases such that 1/D1/D increases linearly --- you get harmonic decline (a special case of hyperbolic where b=1b = 1).

Exponential Decline ($b = 0$)

The simplest case. The production rate decays as:

q(t)=qieDitq(t) = q_i \cdot e^{-D_i t}

where qiq_i is the initial rate and DiD_i is the constant decline rate.

This model applies when the reservoir is in boundary-dominated flow with a strong drive mechanism --- typically a well producing under constant bottomhole pressure from a closed reservoir with good permeability. In practice, pure exponential decline is uncommon in the early life of a well but is often a reasonable assumption for mature wells in late-stage depletion.

The EUR (Estimated Ultimate Recovery) for exponential decline has a clean closed-form solution:

EUR=qiDiEUR = \frac{q_i}{D_i}

This is one of the most useful results in petroleum engineering. If you know the initial rate and the decline rate, you know the total recoverable volume.

Hyperbolic Decline ($0 < b < 1$)

Most real wells follow hyperbolic decline, where the decline rate itself slows over time:

q(t)=qi(1+bDit)1/bq(t) = \frac{q_i}{(1 + b D_i t)^{1/b}}

The parameter bb controls the curvature. When b=0b = 0, the equation reduces to exponential. When b=1b = 1, it becomes harmonic. Values between 0 and 1 produce curves that decline steeply at first, then flatten.

The physical interpretation: early in a well's life, the near-wellbore region depletes rapidly, causing steep decline. As the drainage area expands, the decline slows because the well is drawing from a larger volume of rock.

The EUR for hyperbolic decline is:

EUR=qiDi(1b)[1(qabqi)1b]EUR = \frac{q_i}{D_i(1-b)} \left[ 1 - \left(\frac{q_{ab}}{q_i}\right)^{1-b} \right]

where qabq_{ab} is the abandonment rate --- the rate below which the well is no longer economic to operate.

warningThe $b > 1$ Problem

When b>1b > 1, the EUR integral diverges --- it predicts infinite recovery. This is physically impossible. If your curve fit returns b>1b > 1, something is wrong: the well may still be in transient flow, the data may contain artifacts, or the hyperbolic model may not be appropriate. This is one of the most common mistakes in DCA.

Harmonic Decline ($b = 1$)

A special case where:

q(t)=qi1+Ditq(t) = \frac{q_i}{1 + D_i t}

Harmonic decline produces the slowest rate of decline among Arps' models. It is occasionally observed in heavy oil reservoirs with strong water drive, where the displacement process maintains relatively high reservoir pressure.

Fitting Decline Curves in Python

With the theory established, let's build the tools to apply it.

main.py

These three functions are the core of every DCA analysis. Each takes time as input and returns the predicted production rate. The parameters (qiq_i, DiD_i, and optionally bb) are what we need to estimate from data.

Loading and Preparing Production Data

Production data in the real world arrives as monthly or daily records, often with gaps, unit inconsistencies, and noise. Before fitting any model, the data must be cleaned.

main.py

The cleaning step is critical. Shut-in periods, equipment failures, and well interventions create zeros or anomalous values that distort curve fits. Removing them is not "cheating" --- it is separating operational events from reservoir behavior.

Fitting the Models

Now we fit each of the three Arps models to the cleaned data and compare their quality of fit.

main.py

The RMSE (Root Mean Square Error) tells you how well each model reproduces the observed data. Lower is better. But RMSE alone is not sufficient for model selection --- a model can fit historical data well and still produce unreasonable forecasts. Engineering judgment matters.

Visualizing the Fits

main.py

The semi-log plot is standard practice in DCA. On a semi-log scale, exponential decline appears as a straight line. Deviation from a straight line indicates hyperbolic or harmonic behavior. This visual check is one of the fastest ways to identify the appropriate model.

Calculating EUR and Remaining Reserves

The primary deliverable of any DCA analysis is a reserves estimate. EUR (Estimated Ultimate Recovery) represents the total volume of oil or gas a well will produce over its entire economic life.

main.py

The spread between model estimates is important. A narrow spread means all models agree, and you can report EUR with reasonable confidence. A wide spread means the data does not clearly distinguish between decline behaviors, and you need either more production history or additional engineering judgment to select the appropriate model.

warningEUR Is Not Reserves

EUR is a technical estimate of total recoverable volume under current operating conditions. Proved reserves (1P), probable reserves (2P), and possible reserves (3P) are formal classifications defined by the SPE Petroleum Resources Management System (PRMS) and involve additional considerations including economics, regulatory approval, and development plans. DCA informs reserves estimation but does not replace it.

Modified Hyperbolic Decline for Unconventional Wells

Unconventional wells --- horizontal wells with multi-stage hydraulic fractures in shale or tight rock --- present a challenge for standard Arps models. These wells often exhibit bb values greater than 1 during early transient flow, which causes the hyperbolic model to predict infinite EUR.

The Modified Hyperbolic (also called the Robertson method) addresses this by switching from hyperbolic decline to exponential decline at a specified minimum decline rate DminD_{min}:

q(t)={qi(1+bDit)1/bif D(t)>DminqswitcheDmin(ttswitch)if D(t)Dminq(t) = \begin{cases} \frac{q_i}{(1 + b D_i t)^{1/b}} & \text{if } D(t) > D_{min} \\[6pt] q_{switch} \cdot e^{-D_{min}(t - t_{switch})} & \text{if } D(t) \leq D_{min} \end{cases}

The switch point occurs when the instantaneous decline rate of the hyperbolic model drops to DminD_{min}. After that, the well declines exponentially at a constant rate.

main.py

Probabilistic DCA: P10, P50, P90

A single best-fit curve gives a single EUR estimate. But all curve fits carry uncertainty --- the data has noise, the model is an approximation, and the future is unknown. Reporting a single number without quantifying uncertainty is misleading.

Probabilistic DCA generates a distribution of possible outcomes. The industry standard is to report three percentiles:

  • P90 --- the conservative estimate. There is a 90% probability that actual recovery will exceed this value.
  • P50 --- the most likely estimate. Equal probability of exceeding or falling short.
  • P10 --- the optimistic estimate. Only a 10% probability of exceeding this value.
main.py
main.py

The shaded region between P10 and P90 represents the range of plausible outcomes. A narrow band means the forecast is confident. A wide band means more data or additional engineering analysis is needed before committing capital.

Multi-Well DCA Automation

In practice, you rarely analyze a single well. A field evaluation requires DCA for every producing well --- often dozens or hundreds. Automating this process is where Python's value becomes undeniable.

main.py

This is the kind of workflow that takes days in a spreadsheet and minutes in Python. Each well gets a rigorous fit, quality metrics, and reserves estimates. The results are in a single table ready for reporting or further analysis.

Summary

  • Production decline is caused by reservoir pressure depletion as fluids are withdrawn. The rate and shape of decline depend on reservoir properties, drive mechanism, and well completion.
  • Arps' framework defines three models based on how the decline rate changes over time: exponential (b=0b=0), hyperbolic (0<b<10 < b < 1), and harmonic (b=1b=1).
  • Exponential decline assumes a constant decline rate. It is the simplest model and applies best to mature wells in boundary-dominated flow. EUR = qi/Diq_i / D_i.
  • Hyperbolic decline is the most commonly used model. The decline rate itself decreases over time, producing a curve that flattens. The bb-factor controls the curvature.
  • EUR is calculated by integrating the decline curve to an economic abandonment rate. Different models can produce significantly different EUR estimates from the same data.
  • Modified Hyperbolic addresses the problem of b>1b > 1 in unconventional wells by switching to exponential decline at a minimum decline rate.
  • Probabilistic DCA quantifies uncertainty by generating P10, P50, and P90 forecasts using bootstrap resampling. Single-point estimates without uncertainty ranges are incomplete.
  • Multi-well automation is where Python transforms DCA from a well-by-well exercise into a portfolio-scale analysis.

Exercises

fitness_center
Exercise 9.1Practice

-- Exponential vs. Hyperbolic

A well has the following monthly production data (bbl/d): 1800, 1650, 1520, 1400, 1295, 1200, 1110, 1030, 958, 892, 832, 778. Fit both exponential and...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.2Practice

-- The b-Factor

Using the well data from Exercise 9.1, what is the fitted bbb-factor? What does its value tell you about the decline behavior? Research: what range of...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.3Practice

-- Sensitivity to Data Length

Take the 60-month synthetic dataset from this chapter. Fit a hyperbolic model using only the first 12 months, then 24, then 36, then all 60. How do th...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.4Practice

-- Abandonment Rate Sensitivity

Using the hyperbolic fit from this chapter, calculate EUR for abandonment rates of 5, 10, 20, 50, and 100 bbl/d. Plot EUR vs. abandonment rate. Why do...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.5Practice

-- Modified Hyperbolic Implementation

A shale gas well has b=1.4b = 1.4b=1.4 from a standard hyperbolic fit. Implement the Modified Hyperbolic model with DminD_{min}Dmin​ values of 0.3%, 0...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.6Practice

-- Rate-Cumulative Plot

An alternative to rate-time analysis is the rate-cumulative plot, where you plot rate (qqq) on the y-axis and cumulative production (NpN_pNp​) on the ...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.7Practice

-- Detecting a Change in Decline

Take the 60-month synthetic dataset and modify it: after month 36, increase the decline rate by 50% (simulating water breakthrough or mechanical failu...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.8Practice

-- Portfolio Analysis

Generate synthetic production data for 20 wells with varied parameters. Run the auto_dca() function on all of them. Create a summary report that inclu...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.9Practice

-- Comparing DCA to Volumetric Estimates

Volumetric OOIP is calculated as N=7758×A×h×ϕ×(1−Sw)BoN = \frac{7758 \times A \times h \times \phi \times (1 - S_w)}{B_o}N=Bo​7758×A×h×ϕ×(1−Sw​)​. For...

arrow_forward
codePythonSolve Nowarrow_forward
fitness_center
Exercise 9.10Practice

-- Real Data Challenge

Download production data for a real well from a public database (the North Dakota Industrial Commission publishes monthly production for every well in...

arrow_forward
codePythonSolve Nowarrow_forward