Использование rugarch в python для успешного создания модели ARMAX-ARCH - PullRequest
0 голосов
/ 09 января 2020

Здравствуйте, дорогие читатели стека, и, надеюсь, комментаторы,

Я пытаюсь создать модель ARMAX-ARCH в python. Однако я обнаружил, что библиотеки в Pyton отсутствуют. Делая много поисков, я нашел рабочее решение для модели ARCH с нулевым средним здесь на стеке потока, однако, когда я попытался настроить его на ARMAX, я столкнулся с некоторыми трудностями. Я полный начинающий R (и python), поэтому я действительно застрял.

В приведенном ниже коде я создаю временный фрейм данных, основанный на ценах акций, данных моему объекту модели арки (self.endogenous в этот случай). Затем я преобразовываю цены на сырье в журналы. Однако на этапе 'mean_model = robjects.r (' list (armaOrder = c (0, 0), external.regressors = self.exogenous) ') возникают проблемы. Если я запускаю этот код, я получаю следующее сообщение об ошибке:

rpy2.rinterface.RRuntimeError: Ошибка в (function (expr, envir = parent.frame (), enclos = if (is.list ( envir) ||: объект 'self.exogenous' не найден

Так что может показаться, что либо я неправильно конвертирую свою экзогенную переменную, либо не использую правильную запись. часть external.regressor, мой код работает отлично. По сути, мой вопрос сводится к тому, как мне реализовать экзогенную часть моего mean_process в rugarch.

Заранее спасибо!

def fit_arch_model(self):

        df = DataFrame(columns=['daily_returns', 'monthly_std', 'annual_vol'])

        df['daily_returns'] = np.log(self.endogenous['Close']).diff()  # Daily log returns
        df['monthly_std'] = df['daily_returns'].rolling(21).std()  # Standard deviation across trading month
        df['annual_vol'] = df['monthly_std'] * np.sqrt(252)  # Convert monthly standard devation to annualized volatility

        df = df.dropna().reset_index(drop=True)
        forecast_horizon= 30
        # Initialize R GARCH model
        rugarch = importr('rugarch', lib_loc="C:/Users/Ruben/Documents/R/win-library/3.6")


        garch_spec = rugarch.ugarchspec(
            mean_model=robjects.r('list(armaOrder = c(0, 0), external.regressors = self.exogenous)'),
            variance_model=robjects.r('list(garchOrder=c(1,1))'),
            distribution_model='std')
        # Used to convert training set to R list for model input
        numpy2ri.activate()
        # Train R GARCH model on returns as %
        garch_fitted = rugarch.ugarchfit(
            spec=garch_spec,
            data=df['daily_returns'].values * 100,
            out_sample=forecast_horizon
        )

1 Ответ

0 голосов
/ 22 января 2020

Я столкнулся с той же проблемой и решил ее, создав обходной путь. Я создал функцию R, а затем использовал ее для подбора модели и создания прогноза.

import rpy2.robjects as robjects
from rpy2.robjects.vectors import FloatVector

# X is a Panda Series that contains the returns I want to fit the model
returns = FloatVector(X.values)   

robjects.r("""  
     f <- function (X) {
     spec = ugarchspec(
     variance.model=list(garchOrder=c(1,1)),
     mean.model=list(armaOrder=c(1, 1), include.mean=T),
     distribution.model="sged"
     ) 

     fit = tryCatch(
     ugarchfit(
     spec, X, solver = 'hybrid'
     ), error=function(e) e, warning=function(w) w
     )  
     fore = ugarchforecast(fit, n.ahead=1)
     ind = fore@forecast$seriesFor
     ind
     }""")

r_f = robjects.globalenv['f']
fore = r_f(returns)

fore
R object with classes: ('matrix',) mapped to:
<Matrix - Python:0x0000018D6760CB08 / R:0x0000018D76890AD0>
[0.001222]

Надеюсь, это поможет решить вашу проблему!

...