首页 > 解决方案 > 在 python 中使用 rugarch 成功创建 ARMAX-ARCH 模型

问题描述

你好亲爱的stackoverflow读者(希望是评论者),

我正在尝试在 python 中创建一个 ARMAX-ARCH 模型。但是我发现 Pyton 中的库是缺乏的。做了很多谷歌搜索,我在 stackoverflow 上找到了一个零均值 ARCH 模型的工作解决方案,但是当我尝试将其调整为 ARMAX 时,我遇到了一些困难。我是一个完整的 R(和 python)初学者,所以我真的被卡住了。

在下面的代码中,我根据给我的拱模型对象(在本例中为 self.endogenous)的股票价格创建了一个临时数据框。然后我将原始股票价格转换为对数回报。然而,在 'mean_model=robjects.r('list(armaOrder = c(0, 0), external.regressors = self.exogenous)') 步骤是问题所在。如果我运行此代码,我会收到以下错误消息:

rpy2.rinterface.RRuntimeError:错误(函数(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
        )

标签: pythonrrpy2

解决方案


我遇到了同样的问题并解决了它,创建了一个解决方法。我创建了一个 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]

希望这可以帮助您解决问题!


推荐阅读