Skip to content

AI Strategy

Oil vs Renewable Decision Modeling

A data-driven comparison between oil and renewable energy using Levelized Cost of Energy (LCOE), Monte Carlo simulations, carbon tax scenarios, and probabilistic forecasting. Explore how uncertainty modeling reshapes strategic energy investment decisions.

Oil or Renewable? Energy Decision Making Under Uncertainty

A Data-Driven Approach with full code explanation

In today’s rapidly evolving energy landscape, decision-making under uncertainty has become a cornerstone of strategic planning. Both renewable and fossil fuel energy sources experience unpredictable changes driven by technological advancements, policy shifts, and market volatility. To navigate these challenges, we can leverage the Levelized Cost of Energy (LCOE) — a key metric in energy economics — combined with Monte Carlo simulations and historical comparisons.

This article explores how we can make more informed decisions about future energy generation costs by using a data-driven approach. The datasets applied in this analysis come from:

  • File: Electricity costs in dollars according to data from Lazard.png — Wikimedia Commons
  • Historical Crude Oil Prices — Energy History (Yale University)

What is LCOE?

The Levelized Cost of Energy (LCOE) represents the average cost of producing electricity over the lifetime of an energy plant. It takes into account capital expenses, operational costs, and fuel costs, making it a widely accepted metric to compare different types of energy generation. LCOE provides a benchmark to evaluate the competitiveness of energy sources such as solar, wind, nuclear, and fossil fuels.

However, LCOE is far from static. Numerous factors — such as technological progress, regulatory changes, and fluctuations in raw material costs — introduce uncertainty, complicating the decision-making process. To overcome this, we can turn to probabilistic modeling and simulations.

LCOE Unit is given by Dollars per megawatt-hour ($/MWh) and it represents the cost of producing 1 MWh (megawatt-hour) of electricity over the lifecycle of the energy plant.

To convert the price of oil (in dollars per barrel) into LCOE (in $/MWh), we need to follow these steps: (i) A single barrel of oil contains 5.8 million British Thermal Units (MMBtu) of energy. (ii) To convert the energy from MMBtu to MWh, we use the conversion factor that 1 MWh = 3.412 MMBtu.

Therefore, if we know the price of oil (in dollars per barrel), we can compute the equivalent LCOE by dividing the price per barrel by the energy content of that barrel in MWh.

  • LCOE ($/MWh) = (Price of Oil per Barrel) / (5.8 MMBtu per barrel / 3.412 MMBtu per MWh)

This plot on Figure 1 provides a comparison of the Levelized Cost of Energy (LCOE) for various energy sources from 2000 to 2023, with oil prices converted to LCOE units for better comparison. The data includes energy sources such as nuclear, gas (peaker), thermal solar, coal, geothermal, natural gas, solar panels, wind, and oil.

Press enter or click to view image in full size

Figure 1 — Levelized Cost of Energy (LCOE) for various energy sources from 2010 to 2023.

The data uses annual average LCOE values, which smooth out short-term fluctuations that might occur due to seasonal effects, temporary market changes, or other anomalies. By using annual averages, we get a clearer view of long-term trends without being distracted by temporary spikes or dips.

The oil prices in the plot have been corrected for inflation to account for the changing value of money over time. This adjustment allows us to more accurately compare oil prices in 2023 dollars to other energy sources, ensuring the comparisons are consistent across the years.

Key Insights from the Plot:

  1. Steep Declines in Renewable Energy Costs (Solar Panels, Wind, Thermal Solar)
  • Solar Panels (green line) show a significant and consistent drop in LCOE, falling from around $360/MWh in 2009 to $40/MWh by 2023. This trend reflects the rapid technological advancements and economies of scale that have made solar power more affordable over time.
  • Wind (yellow line) also experiences a considerable decline, dropping from $120/MWh in 2009 to $30/MWh by 2023, demonstrating similar improvements in technology and cost-efficiency.
  • Thermal Solar (purple line) saw a decline from $300/MWh in 2009 to $90/MWh in 2023, indicating the growing competitiveness of this renewable energy source.

2. Fossil Fuels and Nuclear Costs:

  • Gas (Peaker) (yellow line) and Coal (red line) remain relatively higher in terms of LCOE, with gas peaker plants starting at $350/MWh in 2009 and gradually declining to around $170/MWh by 2023.
  • Nuclear (blue line) remains relatively stable, showing a slight increase in LCOE over time due to high capital and maintenance costs. It started around $96/MWh in 2009 and increased to $138/MWh by 2023.
  • Oil (red line), converted to LCOE using inflation-adjusted prices, fluctuates more than other energy sources. It starts at around $50/MWh in 2009, rises to $65/MWh in 2014, and then drops back to around $50/MWh by 2023. The variability of oil prices reflects the market volatility of this resource, and the prices shown here are smoothed because the data represents annual averages and the prices have been corrected for inflation.

3. Stable Costs in Geothermal and Coal:

  • Geothermal (gray line) shows a fairly stable LCOE over time, starting at around $90/MWh in 2009 and slightly increasing to $90/MWh in 2023, reflecting the limited technological advancements in this sector.
  • Coal (brown line) also shows minor fluctuations, starting at $110/MWh and reducing to around $77/MWh by 2023, reflecting regulatory pressures and market shifts in favor of renewable energy.

Explanation of the Code:

The code 1 performs a Monte Carlo simulation to forecast the Levelized Cost of Energy (LCOE) for different energy sources over the next 10 years (2024–2034). The LCOE values are simulated for multiple energy sources, including nuclear, gas, solar, wind, oil, and others, with uncertainty in growth or decline rates applied to each energy source. The results are then visualized to show the mean forecast and a 95% confidence interval (5th to 95th percentile) for each energy source’s LCOE over time.

Monte Carlo Simulation. Why We Use This Approach?

The Monte Carlo simulation is particularly useful when there is uncertainty in the factors influencing future energy prices. It allows us to model thousands of different scenarios by applying random variations (influenced by a growth rate and standard deviation) to the future LCOE of each energy source. This approach provides not just a point estimate but also confidence intervals that help capture the uncertainty in these forecasts.

This helps energy decision-makers understand the range of possible outcomes and make more informed choices when considering factors such as technology development, market trends, and regulatory changes. We are simulating LCOE values for the years 2024 to 2034.

Code 1
import numpy as np
import matplotlib.pyplot as plt

# Simulation parameters
np.random.seed(42)  # For reproducibility
years = np.arange(2024, 2034)
n_simulations = 1000

# Current LCOE for 2023
lcoe_base = {
    "Nuclear": 138,
    "Gas (Peaker)": 170,
    "Thermal Solar": 90,
    "Coal": 77,
    "Geothermal": 90,
    "Natural Gas": 70,
    "Solar Panels": 40,
    "Wind": 30,
    "Oil": 71.66  # From previous oil LCOE calculation
}

# Growth/decline rates (mean, std_dev) for the LCOE of each energy source
growth_rates = {
    "Nuclear": (0.01, 0.005),       # Small growth due to maintenance, decommissioning costs
    "Gas (Peaker)": (-0.02, 0.02),  # High volatility, possible decrease with efficiency gains
    "Thermal Solar": (-0.04, 0.01), # Decline due to tech advancements
    "Coal": (0.02, 0.015),          # Regulatory pressure increases costs
    "Geothermal": (0.01, 0.01),     # Slow tech advancements
    "Natural Gas": (0.01, 0.03),    # Dependent on fuel prices
    "Solar Panels": (-0.06, 0.02),  # Rapid tech improvements
    "Wind": (-0.03, 0.015),         # Steady tech improvements
    "Oil": (0.03, 0.04)             # High volatility in oil prices
}

# Monte Carlo simulation function
def monte_carlo_simulation(lcoe_base, growth_rates, years, n_simulations):
    results = {energy: np.zeros((n_simulations, len(years))) for energy in lcoe_base}

    for energy in lcoe_base:
        initial_lcoe = lcoe_base[energy]
        mean_growth, std_growth = growth_rates[energy]

        for i in range(n_simulations):
            lcoe = initial_lcoe
            for t, year in enumerate(years):
                growth_factor = np.random.normal(mean_growth, std_growth)
                lcoe *= (1 + growth_factor)  # Apply growth/decline rate
                results[energy][i, t] = lcoe

    return results

# Run the Monte Carlo simulation
simulation_results = monte_carlo_simulation(lcoe_base, growth_rates, years, n_simulations)

# Calculate mean and confidence intervals for the results
mean_lcoe = {energy: np.mean(simulation_results[energy], axis=0) for energy in lcoe_base}
lower_bound = {energy: np.percentile(simulation_results[energy], 5, axis=0) for energy in lcoe_base}
upper_bound = {energy: np.percentile(simulation_results[energy], 95, axis=0) for energy in lcoe_base}

# Plotting the results with oil highlighted in red
plt.figure(figsize=(12, 8))
for energy in lcoe_base:
    if energy == "Oil":
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean)", color='red', linewidth=2)
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], color='red', alpha=0.2)
    else:
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean)")
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], alpha=0.2)

plt.figure(figsize=(12, 8))

# Plot each energy type with improved readability
for energy in lcoe_base:
    if energy == "Oil":
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean)", color='red', linewidth=2, linestyle='-', marker='o')
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], color='red', alpha=0.2)
    else:
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean)", linestyle='--', marker='x')
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], alpha=0.2)

# Adding labels and legend with improved readability
plt.title("10-Year LCOE Forecast with Uncertainty (Monte Carlo Simulation)", fontsize=16)
plt.xlabel("Year", fontsize=14)
plt.ylabel("LCOE ($/MWh)", fontsize=14)
plt.legend(loc="upper left", bbox_to_anchor=(1, 1), fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)

# Improve layout
plt.tight_layout()
plt.show()

The results of code 1 are plotted with the mean LCOE for each energy source and shaded regions representing the 95% confidence intervals. (Figure 2)

Press enter or click to view image in full size

Figure 2 — 10 Years LCOE forecast with Uncertainty from Monte Carlo Simulation and 95% confidence interval.

In the forecast shown in figure 2, we observe:

  • Solar and wind continue to decline in LCOE due to rapid technological advancements.
  • Oil shows a high degree of variability (large confidence intervals), reflecting the uncertainty in global oil prices.
  • Nuclear shows relatively stable LCOE values due to its consistent operational costs, but with a slight upward trend due to maintenance and decommissioning costs.
  • Gas (Peaker) shows high volatility, reflecting uncertainty in future efficiency gains and fuel prices.

A second simulation was conducted to forecast LCOE for Solar Panels, Wind, Geothermal, and Oil while considering different future scenarios and the impact of a carbon tax on oil. (Code 2)

Key Scenarios Considered:

  • Base Scenario (60% probability): Moderate growth rates.
  • High-Tech Advancement (10% probability): Rapid cost reductions in renewables.
  • Regulatory Shock (20% probability): Increased costs due to new regulations.
  • Fuel Price Shock (10% probability): Sudden increases in oil prices.
  • A carbon tax of $20/ton CO2 in 2024 increases by $3/ton each year, affecting oil prices.
Code 2
import numpy as np
import matplotlib.pyplot as plt

# Simulation parameters
np.random.seed(42)
years = np.arange(2024, 2034)
n_simulations = 1000

# Current LCOE for 2023
lcoe_base = {
    "Solar Panels": 40,
    "Wind": 30,
    "Geothermal": 90,
    "Oil": 71.66
}

# Scenario probabilities (sum to 1)
scenario_weights = {
    "Base": 0.6,
    "High-Tech Advancement": 0.1,
    "Regulatory Shock": 0.2,
    "Fuel Price Shock": 0.1
}

# Growth rates for different scenarios (mean, std_dev)
growth_scenarios = {
    "Base": {
        "Solar Panels": (-0.06, 0.02), "Wind": (-0.03, 0.015), "Geothermal": (0.01, 0.01), "Oil": (0.03, 0.04)
    },
    "High-Tech Advancement": {
        "Solar Panels": (-0.08, 0.02), "Wind": (-0.05, 0.02), "Geothermal": (0.005, 0.005), "Oil": (0.02, 0.04)
    },
    "Regulatory Shock": {
        "Solar Panels": (-0.03, 0.01), "Wind": (-0.02, 0.01), "Geothermal": (0.015, 0.01), "Oil": (0.05, 0.06)
    },
    "Fuel Price Shock": {
        "Solar Panels": (-0.03, 0.015), "Wind": (-0.03, 0.015), "Geothermal": (0.01, 0.01), "Oil": (0.08, 0.06)
    }
}

# Carbon tax parameters
initial_carbon_tax = 20  # $/ton CO2 in 2024
carbon_tax_increase_per_year = 3  # $/ton increase per year
emission_factor_oil = 0.43  # tons of CO2 per MWh for oil

# Scenario selection function based on weights
def select_scenario():
    return np.random.choice(list(scenario_weights.keys()), p=list(scenario_weights.values()))

# Monte Carlo simulation with generative scenarios and carbon tax for oil
def generative_ai_with_carbon_tax(lcoe_base, growth_scenarios, years, n_simulations):
    results = {energy: np.zeros((n_simulations, len(years))) for energy in lcoe_base}

    for energy in lcoe_base:
        initial_lcoe = lcoe_base[energy]

        for i in range(n_simulations):
            lcoe = initial_lcoe
            for t, year in enumerate(years):
                scenario = select_scenario()
                mean_growth, std_growth = growth_scenarios[scenario][energy]
                growth_factor = np.random.normal(mean_growth, std_growth)
                lcoe *= (1 + growth_factor)  # Apply growth/decline rate

                # Apply carbon tax for oil
                if energy == "Oil":
                    carbon_tax = initial_carbon_tax + carbon_tax_increase_per_year * (t)
                    lcoe += carbon_tax * emission_factor_oil

                results[energy][i, t] = lcoe

    return results

# Run the simulation
simulation_results = generative_ai_with_carbon_tax(lcoe_base, growth_scenarios, years, n_simulations)

# Calculate mean and confidence intervals for the results
mean_lcoe = {energy: np.mean(simulation_results[energy], axis=0) for energy in lcoe_base}
lower_bound = {energy: np.percentile(simulation_results[energy], 5, axis=0) for energy in lcoe_base}
upper_bound = {energy: np.percentile(simulation_results[energy], 95, axis=0) for energy in lcoe_base}

# Plotting the results with oil highlighted in red
plt.figure(figsize=(12, 8))
for energy in lcoe_base:
    if energy == "Oil":
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean with carbon tax)", color='red', linewidth=2)
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], color='red', alpha=0.2)
    else:
        plt.plot(years, mean_lcoe[energy], label=f"{energy} (mean)")
        plt.fill_between(years, lower_bound[energy], upper_bound[energy], alpha=0.2)

plt.title("Renewables vs Oil (with Carbon Tax) - 10-Year LCOE Forecast")
plt.xlabel("Year")
plt.ylabel("LCOE ($/MWh)")
plt.legend(loc="upper left", bbox_to_anchor=(1, 1))
plt.grid(True)
plt.tight_layout()
plt.show()

Press enter or click to view image in full size

Figure 3 –10-year forecast (2024–2034) of the Levelized Cost of Energy (LCOE) for Solar Panels, Wind, Geothermal, and Oil (with Carbon Tax) and 95% Confidence interval.

The plot in Figure 3 highlights the result of code 2 and the impact of a carbon tax on oil. The mean forecast and confidence intervals are plotted for each energy source, with oil receiving special attention.

Key Insights:

  1. Carbon Tax on Oil: The LCOE for oil rises steadily due to the carbon tax, making it significantly more expensive relative to renewables. By 2034, oil’s LCOE is projected to exceed $250/MWh.
  2. Declining Costs for Solar and Wind: Both solar and wind continue to decline, becoming increasingly competitive. Solar could fall below $30/MWh, while wind reaches even lower costs.
  3. Geothermal Stability: Geothermal remains stable throughout the forecast period, showing minimal fluctuations.
  4. Risk and Uncertainty: Oil has the largest uncertainty due to both fuel price volatility and the carbon tax, while solar and wind show relatively narrow uncertainty bands.

Conclusion: Oil vs. Renewable — A Shift in Energy Economics?

The comparison between oil and renewable energy sources in this study shows a clear trend: renewables such as solar and wind are becoming increasingly cost-competitive, particularly as carbon taxes make fossil fuels more expensive. By leveraging Monte Carlo simulations and scenario analysis, we can better understand the risks and opportunities associated with future energy costs, ultimately helping decision-makers plan for a more sustainable energy future. While Monte Carlo simulations and LCOE modeling are powerful tools for understanding future energy cost trends, they are not without limitations. Their predictions depend on assumptions, historical data, and fixed scenario definitions that may not account for all future variables. Decision-makers should view these forecasts as probabilistic rather than deterministic and should supplement them with additional insights from policy analysis, technological monitoring, and global market developments to form a more comprehensive energy strategy.

Ready to see your institution’s documents move on their own?

We walk you through it with a sample applicant file and agree on the next step.