Recientemente me encontré con el mismo problema y encontré una manera de lograrlo usando R en Python.
from rpy2.robjects import pandas2ri
import rpy2.robjects as objects
import numpy as np
# pd_rets - un dataframe de pandas de retornos diarios, donde los nombres de las columnas son los tickers de las acciones e index es los días de operación.
# Calcular DCC-Garch en R usando el paquete rmgarch
pandas2ri.activate()
r_rets = pandas2ri.py2ri(pd_rets) # convertir los retornos diarios de un dataframe de pandas en Python a un dataframe en R
r_dccgarch_code = """
library('rmgarch')
function(r_rets, n_days){
univariate_spec <- ugarchspec(mean.model = list(armaOrder = c(0,0)),
variance.model = list(garchOrder = c(1,1),
variance.targeting = FALSE,
model = "sGARCH"),
distribution.model = "norm")
n <- dim(r_rets)[2]
dcc_spec <- dccspec(uspec = multispec(replicate(n, univariate_spec)),
dccOrder = c(1,1),
distribution = "mvnorm")
dcc_fit <- dccfit(dcc_spec, data=r_rets)
forecasts <- dccforecast(dcc_fit, n.ahead = n_days)
list(dcc_fit, forecasts@mforecast$H)
}
"""
r_dccgarch = robjects.r(r_dccgarch_code)
r_res = r_dccgarch(r_rets,n_days)
pandas2ri.deactivate()
# fin de R
r_dccgarch_model = r_res[0] # parámetros del modelo
r_forecast_cov = r_res[1] # matrices de covarianza pronosticadas para n_days
# acceder y transformar las matrices de covarianza en formato R
n_cols = pd_rets.shape[1] # obtener el número de acciones en pd_rets
n_elements = n_cols*n_cols # el número de elementos en cada matriz de covarianza
n_matrix = int(len(r_forecast_cov[0])/(n_elements))
print(n_matrix) # esto debería ser igual a n_days
# sumar las matrices de covarianza pronosticadas diarias
cov_matrix = 0
for i in range(n_matrix):
i_matrix = np.array([v for v in r_forecast_cov[0][i*n_elements:(i+1)*n_elements]])
i_matrix = i_matrix.reshape(n_cols,n_cols)
cov_matrix += i_matrix