python - 在 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
)
解决方案
我遇到了同样的问题并解决了它,创建了一个解决方法。我创建了一个 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]
希望这可以帮助您解决问题!
推荐阅读
- sql - SQL Join 未按预期过滤 SSMS
- c# - 在 Unity3D 中控制游戏对象时传送
- reactjs - 在区块链上存储散列(存储在 ipfs 上的图像散列)
- reactjs - 用排序反应数据表列过滤器问题
- mysql - SQL - 选择列包含关键字并具有相同类别的记录
- javascript - 如何在 date-fns 中格式化小时和分钟?
- laravel - 默认路由不适用于 laravel 和 vue
- python - 如何返回由 Python 列表中的连续数字组成的最长子序列?
- javascript - 如何将未转义的字符串插值传递给脚本标签?
- java - Swagger 开放 API 定义不适用于 Micronaut JWT 安全 Micronaut 版本 2.2.1