時序
R:優化時間序列以最小化“積分”
我想做的是:
對於給定的時間序列 $ P_t $ (它將由不同的時間序列本身建構):
$ P_t $ = $ \beta_1 $ $ I_t^1 $ + $ \beta_2 $ $ I_t^2 $ + $ \beta_3 $ $ I_t^3 $ $ \qquad $ ( $ I_t^i $ 是 $ i $ 時間序列數)
我想要
$ min $ $ \sum_t^T| $ $ P_t $ - $ \bar{P} $ | 在哪裡 $ \bar{P} $ = 1(以 1 為中心)
本質上選擇 $ \beta $ 這樣| $ P_t $ - $ \bar{P} $ | 被最小化了*$$ t,T $$*.
一種簡單但有些不靈活的方法是倒退 $ \bar{P} $ 在 $ I $ 僅系列(無常數)。不過,這將最小化平變異數異而不是絕對差異。
範例;我從創建隨機數據開始:
nobs <- 250 ## length of series ns <- 3 ## number of I series P <- c(1, cumprod(1 + rnorm(nobs, sd = 0.01))) M <- sum(range(P))/2 ## midpoint of range I <- array(rnorm((nobs)*ns, sd = 0.01), dim = c(nobs, ns)) I <- apply(I, 2, function(x) cumprod(1+x)) I <- rbind(1, I) plot(P, ylim = range(P, I), type = "l", col = "darkgreen", lwd = 2) abline(h = M) for (i in 1:ns) lines(I[,i], col = grey(0.7)) ## regression res1 <- lm(rep(M, nrow(I)) ~ -1 + I) lines(I %*% coef(res1), col = "blue", lwd = 2, type = "l")
另一種方法是使用通用求解器。這是一個差分進化的例子,在
NMOF
我維護的 R 包中實現。## Differential Evolution library("NMOF") diff_mean <- function(b, M, I) sum(abs(M - I %*% b)) res2 <- DEopt(diff_mean, list(min = rep(-1, ns), max = rep(1, ns)), M = M, I = I) lines(I %*% res2$xbest, col = "red", lwd = 2)
這種求解器的優勢在於它更加靈活:您可以使用另一個函式來測量序列的相似性,或者添加約束。
I 是 atxi 矩陣。I 中的每個向量都由一個 beta 加權,使得 diff_mean 最小化。我將把過程集中在 1 (M=1) 周圍,並將差異平方以“懲罰”來自 M 的更高偏差(並防止錯誤淨額):
#Optimization library("NMOF") ns=dim(df)[2] M=1 diff_mean <- function(b, M, df) sum((10000*(M-(df%*%b)))^2) res <- DEopt(diff_mean, list(nG = 100000, min = rep(-100, ns), max = rep(100, ns)), M = M, df = df) output=res$xbest solution=output/output[1]
答對了!