Show Normal Inverse Gaussian Distribution in Statistics using Python

The Normal Inverse Gaussian (NIG) distribution is a continuous probability distribution commonly used in finance and risk management. It's characterized as a normal variance-mean mixture with the inverse Gaussian distribution as the mixing density.

Understanding NIG Distribution

The NIG distribution has four parameters:

  • alpha (?) Controls the steepness of the distribution

  • beta (?) Controls the asymmetry (skewness)

  • mu (?) Location parameter (mean)

  • delta (?) Scale parameter

Implementing NIG Distribution

We'll use Python's scipy.stats.norminvgauss to create and visualize the distribution ?

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norminvgauss

# Set parameters for NIG distribution
alpha = 1.7
beta = 0.9
mu = 0
delta = 1.3

# Create NIG distribution object
nig_distribution = norminvgauss(alpha, beta, loc=mu, scale=delta)

# Generate range of x values
x = np.linspace(-8, 8, 1000)

# Calculate probability density function
pdf = nig_distribution.pdf(x)

# Plot the distribution
plt.figure(figsize=(10, 6))
plt.plot(x, pdf, 'b-', linewidth=2, label='NIG Distribution')
plt.xlabel('x')
plt.ylabel('Probability Density Function')
plt.title('Normal Inverse Gaussian Distribution')
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()

print(f"Mean: {nig_distribution.mean():.3f}")
print(f"Variance: {nig_distribution.var():.3f}")
print(f"Skewness: {nig_distribution.stats(moments='s'):.3f}")
Mean: 0.529
Variance: 2.690
Skewness: 0.529

Comparing Different Parameters

Let's visualize how different parameter values affect the distribution shape ?

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norminvgauss

x = np.linspace(-6, 6, 1000)

# Different parameter sets
params = [
    (1.0, 0.0, 0, 1),    # Symmetric
    (1.5, 0.8, 0, 1),    # Positively skewed
    (1.5, -0.8, 0, 1),   # Negatively skewed
    (2.0, 0.0, 0, 1)     # Higher kurtosis
]

labels = ['Symmetric', 'Positive Skew', 'Negative Skew', 'High Kurtosis']

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

for i, (alpha, beta, mu, delta) in enumerate(params):
    nig = norminvgauss(alpha, beta, loc=mu, scale=delta)
    pdf = nig.pdf(x)
    plt.plot(x, pdf, linewidth=2, label=f'{labels[i]} (?={alpha}, ?={beta})')

plt.xlabel('x')
plt.ylabel('Probability Density Function')
plt.title('Normal Inverse Gaussian Distribution with Different Parameters')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Generating Random Samples

You can generate random samples from the NIG distribution for simulation purposes ?

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norminvgauss

# Parameters
alpha, beta, mu, delta = 1.7, 0.9, 0, 1.3
nig = norminvgauss(alpha, beta, loc=mu, scale=delta)

# Generate random samples
samples = nig.rvs(size=10000)

# Plot histogram of samples vs theoretical PDF
x = np.linspace(-8, 8, 1000)
theoretical_pdf = nig.pdf(x)

plt.figure(figsize=(10, 6))
plt.hist(samples, bins=50, density=True, alpha=0.7, color='lightblue', label='Random Samples')
plt.plot(x, theoretical_pdf, 'r-', linewidth=2, label='Theoretical PDF')
plt.xlabel('Value')
plt.ylabel('Density')
plt.title('NIG Distribution: Random Samples vs Theoretical PDF')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

print(f"Sample mean: {np.mean(samples):.3f}")
print(f"Theoretical mean: {nig.mean():.3f}")
Sample mean: 0.532
Theoretical mean: 0.529

Key Properties

Property Description Formula/Method
Mean Expected value distribution.mean()
Variance Measure of spread distribution.var()
Skewness Asymmetry measure distribution.stats(moments='s')
PDF Probability density distribution.pdf(x)
CDF Cumulative probability distribution.cdf(x)

Conclusion

The Normal Inverse Gaussian distribution is a flexible probability distribution useful for modeling financial data with skewness and heavy tails. Python's scipy.stats.norminvgauss provides comprehensive tools for working with NIG distributions, including PDF calculation, random sampling, and parameter estimation.

Updated on: 2026-03-27T15:44:55+05:30

447 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements