Cokurtosis
Calculate the co-kurtosis of each asset with the benchmark: how the asset’s return moves with the cubed moves of the market, i.e. how much it shares the market’s extreme moves. An asset with a high co-kurtosis adds to the fat tails of a market portfolio, and Dittmar (2002) shows that investors who dislike kurtosis demand a higher return for holding it.
The formulas are as follows:
\[\text{"standardized":}\;\; \text{Co-Kurtosis} = E \left[(r_{i} - \mu_{i}) (r_{m} - \mu_{m}) ^{3}\right] / (\sigma_{i} \cdot \sigma_{m} ^{3})\] \[\text{"residual":}\;\; E \left[\epsilon_{i} \cdot \epsilon_{m} ^{3}\right] / (\sqrt{E \left[\epsilon_{i} ^{2}\right]} \cdot E \left[\epsilon_{m} ^{2}\right] ^{3 / 2})\]Where r_i is the asset return, r_m the benchmark return, ε_m = r_m − μ_m and ε_i the residual of the regression r_i = α + β·r_m + ε_i, the residual form Harvey and Siddique (2000) use for co-skewness. For the benchmark itself the standardized co-kurtosis is the benchmark’s non-excess kurtosis (3 for normal returns); for an asset with a correlation ρ to normally distributed market returns it is 3ρ.
By default one value is reported per period, computed from the daily returns within that period on the dates both the asset and the benchmark have a return. The expectations are population moments (1 / n), so σ_i and σ_m use 1 / n as well.
For more information about the method, see the following papers:
- Dittmar, R.F. (2002). “Nonlinear Pricing Kernels, Kurtosis Preference, and Evidence from the Cross Section of Equity Returns.” Journal of Finance, 57(1), 369-403.
- Harvey, C.R., & Siddique, A. (2000). “Conditional Skewness in Asset Pricing Tests.” Journal of Finance, 55(3), 1263-1295.
Also known as: cokurtosis, systematic kurtosis, co-kurtosis beta.
Cokurtosis in Python or via the MCP
Install the Finance Toolkit with:
pip install financetoolkit -U
Then call get_cokurtosis as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(
["AAPL", "MSFT", "TLT", "GLD"],
api_key="FINANCIAL_MODELING_PREP_KEY",
start_date="2021-01-01",
end_date="2025-12-31",
)
toolkit.performance.get_cokurtosis()
Or, after setting up the Finance Toolkit MCP, ask:
What was the cokurtosis of Apple, Microsoft, TLT and gold (GLD) with the S&P 500 in each year from 2021 to 2025?
Which returns:
| Date | AAPL | MSFT | TLT | GLD |
|---|---|---|---|---|
| 2021 | 2.3149 | 2.4305 | -0.3616 | 0.761 |
| 2022 | 3.0324 | 2.9407 | 0.6437 | 1.1731 |
| 2023 | 2.0735 | 1.5943 | 0.3763 | 0.0201 |
| 2024 | 2.5064 | 3.5367 | -0.2675 | 1.2651 |
| 2025 | 22.5236 | 18.9645 | 1.749 | 7.2913 |
Parameters
get_cokurtosis accepts the following parameters.
| Parameter | Type | Description | Example |
|---|---|---|---|
period | str | The period to use for the calculation. Defaults to “quarterly” if the Toolkit is initialised with quarterly=True, otherwise “yearly”. | "weekly" |
method | str | “standardized” or “residual”, as described above. Defaults to “standardized”. | "standardized" |
rounding | int | None | The number of decimals to round the results to. Defaults to None, which uses the rounding of the Toolkit (4 unless set otherwise). | 2 |
growth | bool | Whether to calculate the growth of the values. Defaults to False. | True |
lag | int | list[int] | The lag to use for the growth calculation. Defaults to 1. | 4 |
standardize | bool | Whether to standardize (Z-Score) the result. When combined with growth=True, standardizes the growth values instead of the raw values. Defaults to False. | True |