Stylized Facts of Financial Returns › Aggregational Gaussianity
Michael BrenndoerferNovember 21, 20255 min read
Quantitative FinanceAll chapters Part 5 of 15Stochastic Calculus and Pricing Theory
Stylized Facts of Financial Returns › Aggregational GaussianityOne section · Sections in this chapter7 / 14 ↓
Sections in this chapter14
Reading tools Definitions & inline links
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
An intriguing stylized fact is that while daily returns are highly non-normal, returns over longer horizons become progressively more Gaussian. This phenomenon, called aggregational Gaussianity, results from a form of the Central Limit Theorem operating on the time-aggregated returns.
As you increase the measurement interval from daily to weekly to monthly to annual, the distribution of returns converges toward normality. Heavy tails diminish, and excess kurtosis declines toward zero.
In[26]:
Codeimport numpy as np
import pandas as pd
from scipy import stats
# Compute returns at different frequencies
prices_series = prices.copy()
# Resample to different frequencies
weekly_prices = prices_series.resample("W").last()
monthly_prices = prices_series.resample("ME").last()
quarterly_prices = prices_series.resample("QE").last()
weekly_returns = np.log(weekly_prices / weekly_prices.shift(1)).dropna()
monthly_returns = np.log(monthly_prices / monthly_prices.shift(1)).dropna()
quarterly_returns = np.log(
quarterly_prices / quarterly_prices.shift(1)
).dropna()
# Calculate kurtosis at each frequency
frequencies = ["Daily", "Weekly", "Monthly", "Quarterly"]
return_series = [
log_returns,
weekly_returns,
monthly_returns,
quarterly_returns,
]
# Calculate statistics for each frequency
agg_stats = []
for freq, ret in zip(frequencies, return_series):
agg_stats.append(
{
"Frequency": freq,
"N Obs": len(ret),
"Skewness": stats.skew(ret),
"Excess Kurt": stats.kurtosis(ret),
}
)
agg_stats_df = pd.DataFrame(agg_stats)Out[27]:
ConsoleAggregational Gaussianity: Kurtosis by Frequency ======================================================= Frequency N Obs Skewness Excess Kurt ------------------------------------------------------- Daily 6260 0.0423 0.1299 Weekly 1252 0.0375 0.3172 Monthly 288 0.0314 -0.1698 Quarterly 96 0.2679 0.0138 ------------------------------------------------------- Normal distribution: Skewness = 0.0, Excess Kurtosis = 0.0
Out[28]:
Visualization



Out[29]:
Visualization