### 병합 테이블 리스트 생성
ex_feat_list <- list(
ism_pmi,
export_index,
deposit,
net_long,
SOX,
usdkrw
)
### 특징 테이블 생성
feat_tbl <- reduce(ex_feat_list, .init = semicon_etf, function(acc, df) {
full_join(acc, df, by = join_by("Index")) |>
arrange(Index) |>
mutate(
across(
starts_with(c("feat", "state")), ~zoo::na.locf(.x, na.rm = F)
)
) |>
na.omit()
})
### 병렬 처리용
plan(multisession, workers = 8)
### 특징 테이블 생성2
feat_tbl <- feat_tbl |>
mutate(
tradable =
state_PMI &
state_Foreign_flow,
## 1차 방향 라벨 생성 - side
log_price = log(Close),
log_ret = log_price - dplyr::lag(log_price, n = 1),
ret_fwd_5d = zoo::rollapply(log_ret, 5, sum, align = "left", fill = NA),
vol_20d = zoo::rollapply(log_ret, 20, sd, align = "right", fill = NA),
side = as.factor(dplyr::if_else(ret_fwd_5d / vol_20d > 0, 1, 0)),
## 1차 방향 모델 특징 정의
side_trend_5d = zoo::rollapply(log_ret, width = 5, FUN = sum, align = "right", fill = NA),
side_trend_20d = zoo::rollapply(log_ret, width = 20, FUN = sum, align = "right", fill = NA),
ema20 = TTR::EMA(log_price, n = 20),
side_ema20_dist = (log_price - ema20) / zoo::rollapply(abs(log_ret),
width = 20,
FUN = sd,
fill = NA,
align = "right"),
side_trend_alignment = side_trend_5d * (log_price - ema20),
side_trend_ratio = side_trend_5d / side_trend_20d,
## 이벤트 필터용 entropy 특징 생성
log_ret_sym = if_else(log_ret > 0, 1, 0),
log_ret_konto_entropy = zoo::rollapply(log_ret_sym,
width = 20,
FUN = konto_entropy,
align = "right",
fill = NA),
## 2차 모델 특징 정의
feat_endo_ffd=fracdiff_ffd(log_price,d=d,thres=1e-4),
feat_endo_MFI=TTR::MFI(cbind(High,Low,Close),Volume),
tsf = slider::slide(
.x = Close,
.before = 19,
.complete = TRUE,
.f = ~ list(.x)
),
feat = furrr::future_map(
tsf,
~ tryCatch(
{
tsfeatures(
.x,
features = c("acf_features", "stability", "lumpiness", "entropy", "hurst")
)
}, error = function(e) {
NULL
}
)
)
) |>
tidyr::unnest(feat, keep_empty = TRUE, names_sep = "_endo_") |>
na.omit()
### 병렬 처리 종료
plan(sequential)