基于TSLM的预测与回变换

编程语言 2026-07-10

我有这个数据集(来自 https://fable.tidyverts.org/index.html

library(fpp3)

 google_stock <- gafa_stock |>
  filter(Symbol == "GOOG", year(Date) >= 2015) |>
  mutate(day = row_number()) |>
  update_tsibble(index = day, regular = TRUE)

google_2015 <- google_stock |> filter(year(Date) == 2015)

# A tsibble: 252 x 9 [1]
# Key:       Symbol [1]
   Symbol Date        Open  High   Low Close Adj_Close  Volume   day
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl> <int>
 1 GOOG   2015-01-02  526.  528.  521.  522.      522. 1447600     1
 2 GOOG   2015-01-05  520.  521.  510.  511.      511. 2059800     2
 3 GOOG   2015-01-06  512.  513.  498.  499.      499. 2899900     3
 4 GOOG   2015-01-07  504.  504.  497.  498.      498. 2065100     4
 5 GOOG   2015-01-08  495.  501.  488.  500.      500. 3353600     5
 6 GOOG   2015-01-09  502.  502.  492.  493.      493. 2069400     6
 7 GOOG   2015-01-12  492.  493.  485.  490.      490. 2322400     7
 8 GOOG   2015-01-13  496.  500.  490.  493.      493. 2370500     8
 9 GOOG   2015-01-14  492.  500.  490.  498.      498. 2235700     9
10 GOOG   2015-01-15  503.  503.  495.  499.      499. 2715800    10
# ℹ 242 more rows

在使用时间序列线性模型(TSLM)预测时的附加数据管理:

df<-google_2015 %>%  
 mutate(lopen=log(Open), dl0pen= difference(log(Open),1), pct = log(High/ dplyr::lag(High)))  %>%
as_tsibble(index=Date)


fit <- df %>% filter(Date< "2015-12-23")  |>  model(TSLM(dl0pen ~ pct)) 
report(fit)

us_change_future <- new_data(df%>% filter(Date< "2015-12-23") , 6) |>
  mutate(df%>% filter(Date>= "2015-12-23")  %>% select(  pct)  %>%
 as.data.frame() %>% select(-Date)
)

预测:

xd<-fit %>% forecast::forecast( us_change_future)

如何在原始量级获取预测变量的值,也就是变量Open的值?

解决方案

如果把变换放在 model() 函数内部,fable将会自动为你还原这些变换。在这种情况下,该模型等价于对对数变量进行回归,误差为ARIMA(0,1,0)。

你的 TSLM 模型包含一个不显著的截距,你在这里可能不需要,因为它会在预测中引入一个微小的趋势。

library(fpp3)
#> ── Attaching packages ──────────────────────────────────────────── fpp3 1.0.3 ──
#> ✔ tibble      3.3.1     ✔ tsibble     1.2.0
#> ✔ dplyr       1.2.1     ✔ tsibbledata 0.4.1
#> ✔ tidyr       1.3.2     ✔ ggtime      0.2.0
#> ✔ lubridate   1.9.5     ✔ feasts      0.5.0
#> ✔ ggplot2     4.0.2     ✔ fable       0.5.0
#> ── Conflicts ───────────────────────────────────────────────── fpp3_conflicts ──
#> ✖ lubridate::date()    masks base::date()
#> ✖ dplyr::filter()      masks stats::filter()
#> ✖ tsibble::intersect() masks base::intersect()
#> ✖ tsibble::interval()  masks lubridate::interval()
#> ✖ dplyr::lag()         masks stats::lag()
#> ✖ tsibble::setdiff()   masks base::setdiff()
#> ✖ tsibble::union()     masks base::union()

google_stock <- gafa_stock |>
  filter(Symbol == "GOOG", year(Date) >= 2015) |>
  mutate(day = row_number()) |>
  update_tsibble(index = day, regular = TRUE)

google_2015 <- google_stock |> filter(year(Date) == 2015)

fit <- google_2015 |>
  filter(Date < "2015-12-23") |>
  model(ARIMA(log(Open) ~ log(High) + pdq(0, 1, 0)))
report(fit)
#> Series: Open 
#> Model: LM w/ ARIMA(0,1,0) errors 
#> Transformation: log(Open) 
#> 
#> Coefficients:
#>       log(High)
#>          0.9267
#> s.e.     0.0401
#> 
#> sigma^2 estimated as 0.0001211:  log likelihood=757.67
#> AIC=-1511.35   AICc=-1511.3   BIC=-1504.34

forecast <- fit |>
  forecast(new_data = google_2015 |> filter(Date >= "2015-12-23"))

autoplot(forecast) +
  autolayer(
    google_2015 |> filter(Date > "2015-11-01"),
    Open
  ) +
  labs(
    x = "Date",
    y = "Google Stock Price",
    title = "Google Stock Price Forecast"
  )

创建于2026-04-20,使用 reprex v2.1.1

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章