Data

# JKSE_from_1990_2022 <- tq_get("^JKSE", get = "stock.prices", from = "1900-01-01", to = "2022-12-31")

# JKSE_from_1990_2022 %>% write_rds("JKSE_full")

JKSE <- read_rds("JKSE_full")

# JKSE <- JKSE_from_1990_2022[,6]
# JKSE <- JKSE_from_1990_2022

jkse_tbl <- tk_tbl(JKSE)
## Warning in tk_tbl.data.frame(JKSE): Warning: No index to preserve. Object
## otherwise converted to tibble successfully.
ihsg_tbl <- jkse_tbl %>% rename(value = adjusted)

ihsg_tbl <- ihsg_tbl %>% 
  mutate(value_ret = ROC(value)) %>%
  select(date, value) %>% 
  na.omit()

ihsg_tbl %>% write_rds("ihsg_tbl")

summary(ihsg_tbl)
##       date                value       
##  Min.   :1990-04-06   Min.   : 223.2  
##  1st Qu.:1998-05-31   1st Qu.: 492.6  
##  Median :2006-07-27   Median :1324.2  
##  Mean   :2006-08-10   Mean   :2527.3  
##  3rd Qu.:2014-10-20   3rd Qu.:4785.0  
##  Max.   :2022-12-30   Max.   :7318.0

Future Data

# ihsg_full_tbl <- ihsg_tbl %>%
#   bind_rows(future_frame(.date_var = date, .data = ., .length_out = "1 year"))

# ihsg_future_tbl <- ihsg_full_tbl %>% filter(is.na(value))

# ihsg_future_tbl %>% write_rds("ihsg_future_tbl")

ihsg_future_tbl <- read_rds("ihsg_future_tbl")

ihsg_future_tbl
## # A tibble: 365 × 2
##    date       value
##    <date>     <dbl>
##  1 2022-12-31    NA
##  2 2023-01-01    NA
##  3 2023-01-02    NA
##  4 2023-01-03    NA
##  5 2023-01-04    NA
##  6 2023-01-05    NA
##  7 2023-01-06    NA
##  8 2023-01-07    NA
##  9 2023-01-08    NA
## 10 2023-01-09    NA
## # ℹ 355 more rows

Plot

ihsg_tbl %>% 
  plot_time_series(.date_var = date, .value = value)

Splits

Manual

# manual
# train_data <- head(ihsg_tbl,round(0.65*nrow(ihsg_tbl))) 
# test_data <- tail(ihsg_tbl,round(0.25*nrow(ihsg_tbl)))

time_series_split()

# time_series_split()
# splits <- time_series_split(ihsg_tbl, assess = "3 year", cumulative = TRUE)
# splits <- time_series_split(ihsg_tbl, assess = "5 year", cumulative = TRUE)
splits <- time_series_split(ihsg_tbl, assess = "7 year", cumulative = TRUE)
## Using date_var: date
train_data <- training(splits)
test_data <- testing(splits)

initial_split()

# intial_split() random selection
# train_data <- initial_split(ihsg_tbl, prop = 1/2) %>% training()
# test_data <- initial_split(ihsg_tbl, prop = 1/2) %>% testing()

# tidak bisa digunakan karena datanya jadi berantakan

Train and Test

# train_data <- ihsg_tbl %>% filter_by_time(.end_date = "2019")
# test_data <- ihsg_tbl %>% filter_by_time(.start_date = "2020")
test_data_2020 <- ihsg_tbl %>% filter_by_time(.start_date = "2020")
## .date_var is missing. Using: date

Summary of Splits

# initial_split()
train_data %>% summary()
##       date                value       
##  Min.   :1990-04-06   Min.   : 223.2  
##  1st Qu.:1996-08-30   1st Qu.: 450.2  
##  Median :2003-01-22   Median : 643.3  
##  Mean   :2003-02-01   Mean   :1596.2  
##  3rd Qu.:2009-07-14   3rd Qu.:2494.7  
##  Max.   :2015-12-14   Max.   :5523.3
test_data %>% summary()
##       date                value     
##  Min.   :2015-12-15   Min.   :3938  
##  1st Qu.:2017-09-26   1st Qu.:5403  
##  Median :2019-07-09   Median :6023  
##  Mean   :2019-06-29   Mean   :5935  
##  3rd Qu.:2021-04-06   3rd Qu.:6389  
##  Max.   :2022-12-30   Max.   :7318
train_data %>% write_rds("train_data")
test_data %>% write_rds("test_data")

# Test Data after 2020
test_data_2020 %>% summary()
##       date                value     
##  Min.   :2020-01-02   Min.   :3938  
##  1st Qu.:2020-10-01   1st Qu.:5760  
##  Median :2021-07-08   Median :6203  
##  Mean   :2021-07-05   Mean   :6151  
##  3rd Qu.:2022-04-02   3rd Qu.:6820  
##  Max.   :2022-12-30   Max.   :7318
test_data_2020 %>% write_rds("test_data_2020")

testing(splits) %>% summary()
##       date                value     
##  Min.   :2015-12-15   Min.   :3938  
##  1st Qu.:2017-09-26   1st Qu.:5403  
##  Median :2019-07-09   Median :6023  
##  Mean   :2019-06-29   Mean   :5935  
##  3rd Qu.:2021-04-06   3rd Qu.:6389  
##  Max.   :2022-12-30   Max.   :7318
training(splits) %>% summary()
##       date                value       
##  Min.   :1990-04-06   Min.   : 223.2  
##  1st Qu.:1996-08-30   1st Qu.: 450.2  
##  Median :2003-01-22   Median : 643.3  
##  Mean   :2003-02-01   Mean   :1596.2  
##  3rd Qu.:2009-07-14   3rd Qu.:2494.7  
##  Max.   :2015-12-14   Max.   :5523.3
splits %>% write_rds("splits")

splits %>%
    tk_time_series_cv_plan() %>%
    plot_time_series_cv_plan(date, value)

Recipe

Recipe Spec Base

recipe_spec_base_ihsg <- recipe(value ~ ., data = train_data) %>%
  step_timeseries_signature(date) %>% 
  step_rm(matches("(iso)|(xts)|(hour)|(minute)|(second)|(am.pm)")) %>% 
  step_normalize(matches("(index.num)|(year)|(yday)")) %>% 
  step_rm(c("date_month.lbl","date_wday.lbl"))

recipe_spec_base_ihsg %>% prep() %>% juice() %>% glimpse()
## Rows: 6,277
## Columns: 18
## $ date           <date> 1990-04-06, 1990-04-09, 1990-04-10, 1990-04-11, 1990-0…
## $ value          <dbl> 641.269, 633.482, 632.086, 634.693, 639.614, 640.014, 6…
## $ date_index.num <dbl> -1.729721, -1.728614, -1.728245, -1.727875, -1.727506, …
## $ date_year      <dbl> -1.696131, -1.696131, -1.696131, -1.696131, -1.696131, …
## $ date_half      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ date_quarter   <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ date_month     <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5…
## $ date_day       <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23, 24, 1, 2, 3, …
## $ date_wday      <int> 6, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 3, 3, 4, 5, 6, 2, 3, 4…
## $ date_mday      <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23, 24, 1, 2, 3, …
## $ date_qday      <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23, 24, 31, 32, 3…
## $ date_yday      <dbl> -0.8469349, -0.8180303, -0.8083955, -0.7987606, -0.7891…
## $ date_mweek     <int> 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1, 1, 1, 1, 2, 2, 2…
## $ date_week      <int> 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 18, 18,…
## $ date_week2     <int> 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1…
## $ date_week3     <int> 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 1, 1, 1…
## $ date_week4     <int> 2, 3, 3, 3, 3, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3…
## $ date_mday7     <int> 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1, 1, 1, 1, 2, 2, 2…
recipe_spec_base_ihsg %>% str()
## List of 7
##  $ var_info    : tibble [2 × 4] (S3: tbl_df/tbl/data.frame)
##   ..$ variable: chr [1:2] "date" "value"
##   ..$ type    :List of 2
##   .. ..$ : chr "date"
##   .. ..$ : chr [1:2] "double" "numeric"
##   ..$ role    : chr [1:2] "predictor" "outcome"
##   ..$ source  : chr [1:2] "original" "original"
##  $ term_info   : tibble [2 × 4] (S3: tbl_df/tbl/data.frame)
##   ..$ variable: chr [1:2] "date" "value"
##   ..$ type    :List of 2
##   .. ..$ : chr "date"
##   .. ..$ : chr [1:2] "double" "numeric"
##   ..$ role    : chr [1:2] "predictor" "outcome"
##   ..$ source  : chr [1:2] "original" "original"
##  $ steps       :List of 4
##   ..$ :List of 6
##   .. ..$ terms  :List of 1
##   .. .. ..$ : language ~date
##   .. .. .. ..- attr(*, ".Environment")=<environment: 0x0000018aed966a90> 
##   .. .. ..- attr(*, "class")= chr [1:2] "quosures" "list"
##   .. ..$ role   : chr "predictor"
##   .. ..$ trained: logi FALSE
##   .. ..$ columns: NULL
##   .. ..$ skip   : logi FALSE
##   .. ..$ id     : chr "timeseries_signature_Bn4Hk"
##   .. ..- attr(*, "class")= chr [1:2] "step_timeseries_signature" "step"
##   ..$ :List of 6
##   .. ..$ terms   :List of 1
##   .. .. ..$ : language ~matches("(iso)|(xts)|(hour)|(minute)|(second)|(am.pm)")
##   .. .. .. ..- attr(*, ".Environment")=<environment: 0x0000018aed966b38> 
##   .. .. ..- attr(*, "class")= chr [1:2] "quosures" "list"
##   .. ..$ role    : logi NA
##   .. ..$ trained : logi FALSE
##   .. ..$ removals: NULL
##   .. ..$ skip    : logi FALSE
##   .. ..$ id      : chr "rm_GN9Od"
##   .. ..- attr(*, "class")= chr [1:2] "step_rm" "step"
##   ..$ :List of 9
##   .. ..$ terms       :List of 1
##   .. .. ..$ : language ~matches("(index.num)|(year)|(yday)")
##   .. .. .. ..- attr(*, ".Environment")=<environment: 0x0000018aed966be0> 
##   .. .. ..- attr(*, "class")= chr [1:2] "quosures" "list"
##   .. ..$ role        : logi NA
##   .. ..$ trained     : logi FALSE
##   .. ..$ means       : NULL
##   .. ..$ sds         : NULL
##   .. ..$ na_rm       : logi TRUE
##   .. ..$ skip        : logi FALSE
##   .. ..$ id          : chr "normalize_OsRgZ"
##   .. ..$ case_weights: NULL
##   .. ..- attr(*, "class")= chr [1:2] "step_normalize" "step"
##   ..$ :List of 6
##   .. ..$ terms   :List of 1
##   .. .. ..$ : language ~c("date_month.lbl", "date_wday.lbl")
##   .. .. .. ..- attr(*, ".Environment")=<environment: 0x0000018aed966c88> 
##   .. .. ..- attr(*, "class")= chr [1:2] "quosures" "list"
##   .. ..$ role    : logi NA
##   .. ..$ trained : logi FALSE
##   .. ..$ removals: NULL
##   .. ..$ skip    : logi FALSE
##   .. ..$ id      : chr "rm_NFnHQ"
##   .. ..- attr(*, "class")= chr [1:2] "step_rm" "step"
##  $ template    : tibble [6,277 × 2] (S3: tbl_df/tbl/data.frame)
##   ..$ date : Date[1:6277], format: "1990-04-06" "1990-04-09" ...
##   ..$ value: num [1:6277] 641 633 632 635 640 ...
##   ..- attr(*, "na.action")= 'omit' Named int [1:315] 6 14 15 16 17 25 31 35 77 96 ...
##   .. ..- attr(*, "names")= chr [1:315] "6" "14" "15" "16" ...
##  $ levels      : NULL
##  $ retained    : logi NA
##  $ requirements:List of 1
##   ..$ bake: Named logi(0) 
##   .. ..- attr(*, "names")= chr(0) 
##  - attr(*, "class")= chr "recipe"
# recipe_spec_base_ihsg %>% write_rds("recipe_spec_base_ihsg")

Recipe Spec Base Forecast

workflow() %>% 
  add_model(linear_reg(mode = "regression", 
           penalty = 0.01, 
           mixture = 0) %>% 
  set_engine("glmnet")) %>% 
  add_recipe(recipe_spec_base_ihsg %>% 
               step_mutate(date = as.numeric(date))) %>% 
  # fit(train_data) %>% 
  fit(training(splits)) %>% 
  # modeltime_calibrate(new_data = test_data) %>% 
  modeltime_calibrate(new_data = testing(splits)) %>% 
  # modeltime_forecast(h = "1 year", actual_data = ihsg_tbl) %>%
  modeltime_forecast(new_data = testing(splits), actual_data = ihsg_tbl) %>% 
  plot_modeltime_forecast()
## Converting to Modeltime Table.

Recipe Spec IHSG

recipe_spec_ihsg <- recipe(value ~ ., data = train_data) %>%
  step_timeseries_signature(date) %>%
  step_rm(matches("(iso)|(xts)|(hour)|(minute)|(second)|(am.pm)")) %>% 
  step_normalize(matches("(index.num)|(year)|(yday)")) %>% 
  step_dummy(all_nominal(), one_hot = TRUE) %>%
  step_interact(~ matches("week2") * matches("wday.lbl")) %>%
  step_fourier(date, period = c(5, 20, 60, 200), K = 2)

recipe_spec_ihsg %>% prep() %>% juice() %>% glimpse()
## Rows: 6,277
## Columns: 60
## $ date                         <date> 1990-04-06, 1990-04-09, 1990-04-10, 1990…
## $ value                        <dbl> 641.269, 633.482, 632.086, 634.693, 639.6…
## $ date_index.num               <dbl> -1.729721, -1.728614, -1.728245, -1.72787…
## $ date_year                    <dbl> -1.696131, -1.696131, -1.696131, -1.69613…
## $ date_half                    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ date_quarter                 <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,…
## $ date_month                   <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,…
## $ date_day                     <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23,…
## $ date_wday                    <int> 6, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 3, 3, 4,…
## $ date_mday                    <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23,…
## $ date_qday                    <int> 6, 9, 10, 11, 12, 16, 17, 18, 19, 20, 23,…
## $ date_yday                    <dbl> -0.8469349, -0.8180303, -0.8083955, -0.79…
## $ date_mweek                   <int> 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1, 1,…
## $ date_week                    <int> 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 1…
## $ date_week2                   <int> 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0,…
## $ date_week3                   <int> 2, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 0, 0,…
## $ date_week4                   <int> 2, 3, 3, 3, 3, 0, 0, 0, 0, 0, 1, 1, 2, 2,…
## $ date_mday7                   <int> 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1, 1,…
## $ date_month.lbl_01            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_02            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_03            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_04            <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,…
## $ date_month.lbl_05            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,…
## $ date_month.lbl_06            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_07            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_08            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_09            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_10            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_11            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_month.lbl_12            <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_wday.lbl_1              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_wday.lbl_2              <dbl> 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0,…
## $ date_wday.lbl_3              <dbl> 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0,…
## $ date_wday.lbl_4              <dbl> 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,…
## $ date_wday.lbl_5              <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,…
## $ date_wday.lbl_6              <dbl> 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,…
## $ date_wday.lbl_7              <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_1 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_2 <dbl> 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_3 <dbl> 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,…
## $ date_week2_x_date_wday.lbl_4 <dbl> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_5 <dbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_6 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_week2_x_date_wday.lbl_7 <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ date_sin5_K1                 <dbl> -0.000000000000987761088, -0.587785252292…
## $ date_cos5_K1                 <dbl> 1.000000, -0.809017, 0.309017, 1.000000, …
## $ date_sin5_K2                 <dbl> -0.000000000001975522176, 0.9510565162950…
## $ date_cos5_K2                 <dbl> 1.000000, 0.309017, -0.809017, 1.000000, …
## $ date_sin20_K1                <dbl> -0.00000000000024694027, 0.80901699437491…
## $ date_cos20_K1                <dbl> 1.0000000000000000000000, 0.5877852522925…
## $ date_sin20_K2                <dbl> -0.0000000000004938805441, 0.951056516295…
## $ date_cos20_K2                <dbl> 1.000000, -0.309017, -0.809017, -1.000000…
## $ date_sin60_K1                <dbl> 0.86602540378447978586, 0.669130606358928…
## $ date_cos60_K1                <dbl> -0.4999999999999287237, -0.74314482547733…
## $ date_sin60_K2                <dbl> -0.86602540378435632906, -0.9945218953682…
## $ date_cos60_K2                <dbl> -0.5000000, 0.1045285, 0.3090170, 0.50000…
## $ date_sin200_K1               <dbl> -0.00000000000000195666, 0.09410831331853…
## $ date_cos200_K1               <dbl> 1.0000000, 0.9955620, 0.9921147, 0.987688…
## $ date_sin200_K2               <dbl> -0.000000000000003913319, 0.1873813145857…
## $ date_cos200_K2               <dbl> 1.0000000000000000000, 0.9822872507286822…
# recipe_spec_ihsg %>% write_rds("recipe_spec_ihsg")

Recipe Spec IHSG Forecast

workflow() %>% 
  add_model(linear_reg(mode = "regression", 
           penalty = 0.01, 
           mixture = 0) %>% 
  set_engine("glmnet")) %>% 
  add_recipe(recipe_spec_ihsg %>% 
               step_mutate(date = as.numeric(date))) %>%
  # fit(train_data) %>% 
  fit(training(splits)) %>% 
  # modeltime_calibrate(new_data = test_data) %>% 
  modeltime_calibrate(new_data = testing(splits)) %>% 
  # modeltime_forecast(h = "1 year", actual_data = ihsg_tbl) %>% 
  modeltime_forecast(new_data = testing(splits), actual_data = ihsg_tbl) %>% 
  plot_modeltime_forecast()
## Converting to Modeltime Table.

Recipe Simple

recipe_spec_simple_ihsg <-  recipe(value ~ ., data = train_data) %>% 
               step_mutate(date = as.numeric(date))

recipe_spec_simple_ihsg %>% prep() %>% juice() %>% glimpse()
## Rows: 6,277
## Columns: 2
## $ date  <dbl> 7400, 7403, 7404, 7405, 7406, 7410, 7411, 7412, 7413, 7414, 7417…
## $ value <dbl> 641.269, 633.482, 632.086, 634.693, 639.614, 640.014, 641.873, 6…
# workflow() %>%
#   add_model(linear_reg(mode = "regression",
#            penalty = 0.01,
#            mixture = 0) %>%
#   set_engine("glmnet")) %>%
#   add_recipe(recipe_spec_simple_ihsg  %>%
#                step_mutate(date = as.numeric(date))) %>%
#   fit(train_data) %>%
#   modeltime_calibrate(new_data = test_data) %>%
#   modeltime_forecast(h = "1 year", actual_data = ihsg_tbl) %>%
#   plot_modeltime_forecast()