Class SensitivityAnalyzer

java.lang.Object
neqsim.process.fielddevelopment.economics.SensitivityAnalyzer
All Implemented Interfaces:
Serializable

public class SensitivityAnalyzer extends Object implements Serializable
Sensitivity and uncertainty analysis for field development economics.

This class provides tools for analyzing the uncertainty in economic metrics (NPV, IRR, payback) through sensitivity analysis, scenario analysis, and Monte Carlo simulation.

Analysis Types

  • Sensitivity Analysis: Varies one parameter at a time to understand individual impact (tornado diagrams)
  • Scenario Analysis: Evaluates discrete scenarios (low, base, high cases)
  • Monte Carlo Simulation: Probabilistic analysis with random sampling from distributions

Example Usage

// Set up base case engine
CashFlowEngine baseCase = new CashFlowEngine("NO");
baseCase.setCapex(800, 2025);
baseCase.setOilPrice(75.0);
// ... configure production, etc.

// Create analyzer
SensitivityAnalyzer analyzer = new SensitivityAnalyzer(baseCase, 0.08);

// Tornado analysis (±20% variation)
TornadoResult tornado = analyzer.tornadoAnalysis(0.20);
System.out.println(tornado.toMarkdownTable());

// Monte Carlo simulation
analyzer.setOilPriceDistribution(60.0, 90.0); // Uniform distribution
analyzer.setCapexDistribution(700, 900);
MonteCarloResult mc = analyzer.monteCarloAnalysis(1000);
System.out.println("NPV P10: " + mc.getNpvP10());
System.out.println("NPV P50: " + mc.getNpvP50());
System.out.println("NPV P90: " + mc.getNpvP90());
Version:
1.0
Author:
ESOL
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • baseCase

      private final CashFlowEngine baseCase
      Base case engine (used as template).
    • discountRate

      private final double discountRate
      Discount rate for NPV calculations.
    • baseCaseNpv

      private final double baseCaseNpv
      Base case NPV for comparison.
    • oilPriceMin

      private double oilPriceMin
    • oilPriceMax

      private double oilPriceMax
    • gasPriceMin

      private double gasPriceMin
    • gasPriceMax

      private double gasPriceMax
    • capexMin

      private double capexMin
    • capexMax

      private double capexMax
    • opexFactorMin

      private double opexFactorMin
    • opexFactorMax

      private double opexFactorMax
    • productionFactorMin

      private double productionFactorMin
    • productionFactorMax

      private double productionFactorMax
    • random

      private Random random
      Random number generator for Monte Carlo.
  • Constructor Details

    • SensitivityAnalyzer

      public SensitivityAnalyzer(CashFlowEngine baseCase, double discountRate)
      Creates a new sensitivity analyzer for the given base case.
      Parameters:
      baseCase - the configured cash flow engine representing the base case
      discountRate - discount rate for NPV calculations
  • Method Details

    • initializeDefaultDistributions

      private void initializeDefaultDistributions()
    • tornadoAnalysis

      public SensitivityAnalyzer.TornadoResult tornadoAnalysis(double variationPercent)
      Performs tornado analysis by varying each parameter by the specified percentage.

      Each parameter is varied independently while holding others constant. Results show the NPV impact of low and high cases for each parameter.

      Parameters:
      variationPercent - variation as fraction (e.g., 0.20 for ±20%)
      Returns:
      tornado analysis result
    • analyzeParameter

      private SensitivityAnalyzer.TornadoItem analyzeParameter(String name, double variationPercent, SensitivityAnalyzer.ParameterSetter setter)
      Analyzes a single parameter's sensitivity.
      Parameters:
      name - parameter name
      variationPercent - variation percentage
      setter - parameter setter function
      Returns:
      tornado item with low/high NPV values
    • scenarioAnalysis

      public SensitivityAnalyzer.ScenarioResult scenarioAnalysis(double lowOilPrice, double highOilPrice, double lowGasPrice, double highGasPrice, double capexContingency)
      Performs three-scenario analysis (low, base, high).
      Parameters:
      lowOilPrice - low case oil price
      highOilPrice - high case oil price
      lowGasPrice - low case gas price
      highGasPrice - high case gas price
      capexContingency - additional CAPEX for low case (e.g., 0.20 for 20% overrun)
      Returns:
      scenario analysis result
    • setOilPriceDistribution

      public void setOilPriceDistribution(double minPrice, double maxPrice)
      Sets oil price distribution for Monte Carlo simulation.
      Parameters:
      minPrice - minimum oil price (USD/bbl)
      maxPrice - maximum oil price (USD/bbl)
    • setGasPriceDistribution

      public void setGasPriceDistribution(double minPrice, double maxPrice)
      Sets gas price distribution for Monte Carlo simulation.
      Parameters:
      minPrice - minimum gas price (USD/Sm3)
      maxPrice - maximum gas price (USD/Sm3)
    • setCapexDistribution

      public void setCapexDistribution(double minCapex, double maxCapex)
      Sets CAPEX distribution for Monte Carlo simulation.
      Parameters:
      minCapex - minimum CAPEX (MUSD)
      maxCapex - maximum CAPEX (MUSD)
    • setOpexFactorDistribution

      public void setOpexFactorDistribution(double minFactor, double maxFactor)
      Sets OPEX factor distribution for Monte Carlo simulation.
      Parameters:
      minFactor - minimum factor (e.g., 0.8 for -20%)
      maxFactor - maximum factor (e.g., 1.2 for +20%)
    • setProductionFactorDistribution

      public void setProductionFactorDistribution(double minFactor, double maxFactor)
      Sets production factor distribution for Monte Carlo simulation.
      Parameters:
      minFactor - minimum factor (e.g., 0.8 for -20%)
      maxFactor - maximum factor (e.g., 1.2 for +20%)
    • setRandomSeed

      public void setRandomSeed(long seed)
      Sets the random seed for reproducible Monte Carlo results.
      Parameters:
      seed - random seed
    • monteCarloAnalysis

      public SensitivityAnalyzer.MonteCarloResult monteCarloAnalysis(int iterations)
      Performs Monte Carlo simulation with the configured distributions.
      Parameters:
      iterations - number of simulation iterations
      Returns:
      Monte Carlo result with statistics
    • breakevenAnalysis

      public SensitivityAnalyzer.BreakevenResult breakevenAnalysis()
      Calculates breakeven prices for zero NPV.
      Returns:
      breakeven result with oil and gas prices
    • cloneEngine

      private CashFlowEngine cloneEngine()
      Creates a clone of the base case engine.
    • uniformRandom

      private double uniformRandom(double min, double max)
    • mean

      private static double mean(double[] values)
    • stdDev

      private static double stdDev(double[] values, double mean)
    • percentile

      private static double percentile(double[] sortedValues, int percentile)