Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
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') |
| 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.
