時序

R:優化時間序列以最小化“積分”

  • June 26, 2018

我想做的是:

對於給定的時間序列 $ 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]

答對了!

引用自:https://quant.stackexchange.com/questions/40069