diff --git a/binary-Q1Inter-HFT-RV3E.Rmd b/binary-Q1Inter-HFT-RV3E.Rmd index dd5edb4d2f..da094cde81 100644 --- a/binary-Q1Inter-HFT-RV3E.Rmd +++ b/binary-Q1Inter-HFT-RV3E.Rmd @@ -2211,7 +2211,33 @@ cat('天干:', 天干, '\n地支:', 地支, '\n干支:', 干支, '\n') ## [1] "2018-01-02" "2018-06-30" ## 便民查询网:https://jieqi.bmcx.com/2018__jieqi 廿四节气 = c(立春 = '2018-02-04', 雨水 = '2018-02-19', 惊蛰 = '2018-03-05', 春分 = '2018-03-21', 清明 = '2018-04-05', 谷雨 = '2018-04-20', 立夏 = '2018-05-05', 小满 = '2018-05-21', 芒种 = '2018-06-06', 夏至 = '2018-06-21', 小暑 = '2018-07-07', 大暑 = '2018-07-23', 立秋 = '2018-08-07', 处暑 = '2018-08-23', 白露 = '2018-09-23', 秋分 = '2018-09-23', 寒露 = '2018-10-08', 霜降 = '2018-10-23', 立冬 = '2018-11-07', 小雪 = '2018-11-22', 大雪 = '2018-12-07', 冬至 = '2018-12-22', 小寒 = '2019-01-05', 大寒 = '2019-01-20') |> as.Date() -廿四节气 <- data.frame(日期 = 廿四节气, 廿四节气 = names(廿四节气)) +廿四节气 <- data.frame(日期 = 廿四节气, 廿四节气 = names(廿四节气)) |> + mutate( + 廿四节气乙 = case_when( + 廿四节气 == '立春' ~ 1, + 廿四节气 == '雨水' ~ 2, + 廿四节气 == '惊蛰' ~ 3, + 廿四节气 == '春分' ~ 4, + 廿四节气 == '清明' ~ 5, + 廿四节气 == '谷雨' ~ 6, + 廿四节气 == '立夏' ~ 7, + 廿四节气 == '小满' ~ 8, + 廿四节气 == '芒种' ~ 9, + 廿四节气 == '夏至' ~ 10, + 廿四节气 == '小暑' ~ 11, + 廿四节气 == '大暑' ~ 12, + 廿四节气 == '立秋' ~ 13, + 廿四节气 == '处暑' ~ 14, + 廿四节气 == '白露' ~ 15, + 廿四节气 == '秋分' ~ 16, + 廿四节气 == '寒露' ~ 17, + 廿四节气 == '霜降' ~ 18, + 廿四节气 == '立冬' ~ 19, + 廿四节气 == '小雪' ~ 20, + 廿四节气 == '大雪' ~ 21, + 廿四节气 == '冬至' ~ 22, + 廿四节气 == '小寒' ~ 23, + 廿四节气 == '大寒' ~ 24)) 总汇 <- join(日内指数平滑数据二零一八年上半年总汇, 廿四节气) |> mutate(廿四节气 = factor(str_replace_na(廿四节气)), 时分秒 = as_hms(年月日时分), 时辰 = factor(str_replace_na(case_when( @@ -2227,7 +2253,21 @@ cat('天干:', 天干, '\n地支:', 地支, '\n干支:', 干支, '\n') 时分秒 > as_hms('15:00:00') & 时分秒 <= as_hms('17:00:00') ~ '申时', 时分秒 > as_hms('17:00:00') & 时分秒 <= as_hms('19:00:00') ~ '酉时', 时分秒 > as_hms('19:00:00') & 时分秒 <= as_hms('21:00:00') ~ '戌时', - 时分秒 > as_hms('21:00:00') & 时分秒 <= as_hms('23:00:00') ~ '亥时')))) + 时分秒 > as_hms('21:00:00') & 时分秒 <= as_hms('23:00:00') ~ '亥时'))), + 时辰乙 = case_when( + 时辰 == '子时' ~ 1, + 时辰 == '子时' ~ 1, + 时辰 == '丑时' ~ 2, + 时辰 == '寅时' ~ 3, + 时辰 == '卯时' ~ 4, + 时辰 == '辰时' ~ 5, + 时辰 == '巳时' ~ 6, + 时辰 == '午时' ~ 7, + 时辰 == '未时' ~ 8, + 时辰 == '申时' ~ 9, + 时辰 == '酉时' ~ 10, + 时辰 == '戌时' ~ 11, + 时辰 == '亥时' ~ 12)) ## |> dplyr::filter(廿四节气 != 'NA') 总汇 <- cbind(总汇[, -c('市场价', '预测价')], 干支, @@ -2239,8 +2279,33 @@ cat('天干:', 天干, '\n地支:', 地支, '\n干支:', 干支, '\n') ## 外部因素周期性自回归综合滑均模型(ARIMAX) ```{r , eval = FALSE} +source('函数/自回归均移模型最优值.R') # --------- eval = FALSE --------- -forecast::Arima() +## forecast::Arima() +## 时分计和干支一样圆进制以六十分钟为一个小时周期,由于计数/机数模型只允许使用数字筹算,在此就使用时分计筹算。 +外因周期自回归甲 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, 时分计])) +外因周期自回归乙 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, 廿四节气乙])) +外因周期自回归丙 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, 时辰乙])) + +外因周期自回归丁 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, .(时分计, 廿四节气乙)])) +外因周期自回归戊 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, .(时分计, 时辰乙)])) +外因周期自回归己 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, .(廿四节气乙, 时辰乙)])) + +外因周期自回归庾 <- Arima(tk_xts(总汇[, .(年月日时分, 预测价)]), xreg = as.matrix(总汇[, .(时分计, 廿四节气乙, 时辰乙)])) + +外因周期自回归系列 <- bind_rows(list( + 外因周期自回归甲 = as_tibble(accuracy(外因周期自回归甲)), + 外因周期自回归乙 = as_tibble(accuracy(外因周期自回归乙)), + 外因周期自回归丙 = as_tibble(accuracy(外因周期自回归丙)), + 外因周期自回归丁 = as_tibble(accuracy(外因周期自回归丁)), + 外因周期自回归戊 = as_tibble(accuracy(外因周期自回归戊)), + 外因周期自回归己 = as_tibble(accuracy(外因周期自回归己)), + 外因周期自回归庾 = as_tibble(accuracy(外因周期自回归庾))), .id = '计数模型') +外因周期自回归系列 + +自回归均移模型最优值甲 <- 自回归均移模型最优值(tk_xts(总汇[, .(年月日时分, 预测价)])) +自回归均移模型最优值乙 <- 自回归均移模型最优值(tk_xts(总汇[, .(年月日时分, 预测价)]), 外因 = as.matrix(总汇[, .(廿四节气乙, 时辰乙)])) +自回归均移模型最优值丙 <- 自回归均移模型最优值(tk_xts(总汇[, .(年月日时分, 预测价)]), 外因 = as.matrix(总汇[, .(时分计, 廿四节气乙, 时辰乙)])) TSA::arima() @@ -2250,6 +2315,8 @@ stats::arima0() fable::ARIMA() +auto.arima() + ``` ![](诸子百家考工记/预测 - 方法与实践(第三版).png) @@ -2278,6 +2345,7 @@ fable::ARIMA() - [多元时间序列滚动预测:ARIMA、回归、ARIMAX模型分析|附代码数据](https://www.bilibili.com/read/cv23326560) - [Forecasting ARIMA with xreg](https://stackoverflow.com/questions/35620667/forecasting-arima-with-xreg) - [forecast with object, xreg, and arima xreg model fails #682](https://github.com/robjhyndman/forecast/issues/682) +- [9.2 ARIMA 误差回归在 R 中的实现](https://otexts.com/fppcn/regarima.html) ## 季节性自回归综合滑均模型(SARIMA) diff --git "a/\345\207\275\346\225\260/\350\207\252\345\233\236\345\275\222\345\235\207\347\247\273\346\250\241\345\236\213\346\234\200\344\274\230\345\200\274.R" "b/\345\207\275\346\225\260/\350\207\252\345\233\236\345\275\222\345\235\207\347\247\273\346\250\241\345\236\213\346\234\200\344\274\230\345\200\274.R" index 9be2be9230..08ca45d742 100644 --- "a/\345\207\275\346\225\260/\350\207\252\345\233\236\345\275\222\345\235\207\347\247\273\346\250\241\345\236\213\346\234\200\344\274\230\345\200\274.R" +++ "b/\345\207\275\346\225\260/\350\207\252\345\233\236\345\275\222\345\235\207\347\247\273\346\250\241\345\236\213\346\234\200\344\274\230\345\200\274.R" @@ -1,21 +1,21 @@ -自回归均移模型最优值 <- function(样本, 季节差分的次数 = NULL, 季节性 = '勾', 规律极限值 = 10, 自回归均移模型值=FALSE){ +自回归均移模型最优值 <- function(样本, 季节差分的次数 = NULL, 季节性 = '勾', 规律极限值 = 10, 自回归均移模型值 = FALSE, 外因 = NULL) { # 通过设置并迭代筹算自回归均移模型中不同`p,d,q`的规律值,来比较并筛选出最低或最大负数的赤池信息量准则,也就是最优统计模型。 # # 《预测:方法与实践(第三版)》第九章第九节 - 季节性ARIMA模型 # https://otexts.com/fpp3cn/seasonal-arima-cn.html + if (!季节性 %in% c('勾', '有', '叉', '冇')) stop('请选择季节性:"勾"或"有"或"是",或者"叉"或"冇"或"否"。') if (季节性 %in% c('勾', '有')) 季节性 <- TRUE if (季节性 %in% c('叉', '冇')) 季节性 <- FALSE - if (!季节性 %in% c('勾', '有', '叉', '冇')) stop('请选择季节性:"勾"或"有"或"是",或者"叉"或"冇"或"否"。') # 季节差分的次数,一般上使用到的数值是零到二。 - fit <- auto.arima(样本, D = 季节差分的次数, seasonal = 季节性, - max.order = 规律极限值) + 半成品 <- auto.arima(样本, D = 季节差分的次数, seasonal = 季节性, + max.order = 规律极限值, xreg = 外因) if (自回归均移模型值 == FALSE) { - 成果 <- arimaorder(fit) + 成果 <- arimaorder(半成品) } else { #https://stats.stackexchange.com/questions/178577/how-to-read-p-d-and-q-of-auto-arima - 成果 <- fit$arma + 成果 <- 半成品$arma #https://stackoverflow.com/questions/23617662/extract-arima-specificaiton names(成果) <- c('p', 'q', 'P', 'Q', 's', 'd', 'D') 成果 %<>% .[c(1, 6, 2, 3, 7, 4, 5)]