skfolio.moments.ImpliedCovariance#
- class skfolio.moments.ImpliedCovariance(prior_covariance_estimator=None, annualized_factor=252.0, window_size=20, linear_regressor=None, volatility_risk_premium_adj=None, nearest=True, higham=False, higham_max_iteration=100)[source]#
Implied Covariance estimator.
For each asset, the implied volatility time series is used to estimate the realised volatility using the non-overlapping log-transformed OLS model [6]:
\[\ln(RV_{t}) = \alpha + \beta_{1} \ln(IV_{t-1}) + \beta_{2} \ln(RV_{t-1}) + \epsilon\]with \(\alpha\), \(\beta_{1}\) and \(\beta_{2}\) the intercept and coefficients to estimate, \(RV\) the realised volatility, and \(IV\) the implied volatility. The training set uses non-overlapping data of sample size
window_size
to avoid possible regression errors caused by auto-correlation. The logarithmic transformation of volatilities is used for its better finite sample properties and distribution, which is closer to normality, less skewed and leptokurtic [6].Alternatively, if
volatility_risk_premium_adj
is provided, the realised volatility is estimated using:\[RV_{t} = \frac{IV_{t-1}}{VRPA}\]with \(VRPA\) the volatility risk premium adjustment.
The final step is the reconstruction of the covariance matrix from the correlation and estimated realised volatilities \(D\):
\[\Sigma = D \ Corr \ D\]With \(Corr\), the correlation matrix computed from the prior covariance estimator. The default is the
EmpiricalCovariance
. It can be changed to any covariance estimator usingprior_covariance_estimator
.- Parameters:
- prior_covariance_estimatorBaseCovariance, optional
Covariance estimator to estimate the covariance matrix used for the correlation estimates prior the volatilities update. The default (
None
) is to useEmpiricalCovariance
.- annualized_factorfloat, default=252
Annualized factor (AF) used to covert the implied volatilities into the same frequency as the returns using \(\frac{IV}{\sqrt{AF}}\). The default is 252 which corresponds to daily returns and implied volatility expressed in p.a.
- window_sizeint, default=20
Window size used to construct the non-overlapping training set of realised volatilities and implied volatilities used in the regression. The default is 20 observations.
- linear_regressorBaseEstimator, optional
Estimator of the linear regression used to estimate the realised volatilities from the implied volatilities. The default is to use the scikit-learn OLS estimator
LinearRegression
.- volatility_risk_premium_adjfloat | dict[str, float] | array-like of shape (n_assets, ), optional
If provided, instead of using the regression model, the realised volatilities are estimated using:
\[RV_{t} = \frac{IV_{t-1}}{VRPA}\]with \(VRPA\) the volatility risk premium adjustment.
If a float is provided, it is applied to each asset. If a dictionary is provided, its (key/value) pair must be the (asset name/asset \(VRPA\)) and the input
X
of thefit
method must be a DataFrame with the assets names in columns.- nearestbool, default=True
If this is set to True, the covariance is replaced by the nearest covariance matrix that is positive definite and with a Cholesky decomposition than can be computed. The variance is left unchanged. A covariance matrix that is not positive definite often occurs in high dimensional problems. It can be due to multicollinearity, floating-point inaccuracies, or when the number of observations is smaller than the number of assets. For more details, see
cov_nearest
. The default isTrue
.- highambool, default=False
If this is set to True, the Higham & Nick (2002) algorithm is used to find the nearest PD covariance, otherwise the eigenvalues are clipped to a threshold above zeros (1e-13). The default is
False
and use the clipping method as the Higham & Nick algorithm can be slow for large datasets.- higham_max_iterationint, default=100
Maximum number of iteration of the Higham & Nick (2002) algorithm. The default value is
100
.
- Attributes:
- covariance_ndarray of shape (n_assets, n_assets)
Estimated covariance matrix.
- prior_covariance_estimator_BaseEstimator
Fitted prior covariance estimator.
- pred_realised_vols_ndarray of shape (n_assets,)
The predicted realised volatilities
- linear_regressors_list[BaseEstimator]
The fitted linear regressions.
- coefs_ndarray of shape (n_assets, 2)
The coefficients of the log transformed regression model for each asset.
- intercepts_ndarray of shape (n_assets,)
The intercepts of the log transformed regression model for each asset.
- n_features_in_int
Number of assets seen during
fit
.- feature_names_in_ndarray of shape (
n_features_in_
,) Names of assets seen during
fit
. Defined only whenreturns
has assets names that are all strings.
Methods
fit
(X[, y, implied_vol])Fit the implied covariance estimator.
Get metadata routing of this object.
get_params
([deep])Get parameters for this estimator.
set_fit_request
(*[, implied_vol])Configure whether metadata should be requested to be passed to the
fit
method.set_params
(**params)Set the parameters of this estimator.
References
[1]“New evidence on the implied-realized volatility relation”. Christensen & Hansen (2002).
[2]“The relation between implied and realized volatility”. Christensen & Prabhala (2002).
[3]“Can implied volatility predict returns on the carry trade?”. Egbers & Swinkels (2015).
[4]“Volatility and correlation forecasting”. Egbers & Swinkels (2015).
[5]“Volatility and correlation forecasting”. Andersen, Bollerslev, Christoffersen & Diebol (2006).
- fit(X, y=None, implied_vol=None, **fit_params)[source]#
Fit the implied covariance estimator.
- Parameters:
- Xarray-like of shape (n_observations, n_assets)
Price returns of the assets.
- yIgnored
Not used, present for API consistency by convention.
- implied_volarray-like of shape (n_observations, n_assets)
Implied volatilities of the assets.
- **fit_paramsdict
Parameters to pass to the underlying estimators. Only available if
enable_metadata_routing=True
, which can be set by usingsklearn.set_config(enable_metadata_routing=True)
. See Metadata Routing User Guide for more details.
- Returns:
- selfImpliedCovariance
Fitted estimator.
- get_metadata_routing()[source]#
Get metadata routing of this object.
Please check User Guide on how the routing mechanism works.
- Returns:
- routingMetadataRequest
A
MetadataRequest
encapsulating routing information.
- get_params(deep=True)#
Get parameters for this estimator.
- Parameters:
- deepbool, default=True
If True, will return the parameters for this estimator and contained subobjects that are estimators.
- Returns:
- paramsdict
Parameter names mapped to their values.
- set_fit_request(*, implied_vol='$UNCHANGED$')#
Configure whether metadata should be requested to be passed to the
fit
method.Note that this method is only relevant when this estimator is used as a sub-estimator within a meta-estimator and metadata routing is enabled with
enable_metadata_routing=True
(seesklearn.set_config
). Please check the User Guide on how the routing mechanism works.The options for each parameter are:
True
: metadata is requested, and passed tofit
if provided. The request is ignored if metadata is not provided.False
: metadata is not requested and the meta-estimator will not pass it tofit
.None
: metadata is not requested, and the meta-estimator will raise an error if the user provides it.str
: metadata should be passed to the meta-estimator with this given alias instead of the original name.
The default (
sklearn.utils.metadata_routing.UNCHANGED
) retains the existing request. This allows you to change the request for some parameters and not others.Added in version 1.3.
- Parameters:
- implied_volstr, True, False, or None, default=sklearn.utils.metadata_routing.UNCHANGED
Metadata routing for
implied_vol
parameter infit
.
- Returns:
- selfobject
The updated object.
- set_params(**params)#
Set the parameters of this estimator.
The method works on simple estimators as well as on nested objects (such as
Pipeline
). The latter have parameters of the form<component>__<parameter>
so that it’s possible to update each component of a nested object.- Parameters:
- **paramsdict
Estimator parameters.
- Returns:
- selfestimator instance
Estimator instance.