1

我有以下问题:

  • 我有 df,它由一列和 60 行组成,如 df = rnorm(60, 0.06, 0.2)
  • 我想重新排序 60 行,以使 cumprod(df+1)[60] - cumprod(df+1)[55] 尽可能接近 1。
  • 此外,我希望 max(cumprod(df+1)) 低于 1.305 并高于 1.295。

我的代码看起来像这样

start.time <- Sys.time()
set.seed(42)
vs = rnorm(60, 0.06, 0.2)


max_attempts = 200000


swaps_made = 0
for (step in 1:max_attempts) {
    # Copy the vector and swap two random values

    vs_new = vs

    swap_inds1 = sample(55:60, 2, replace = FALSE)
    swap_inds2 = sample(length(vs), 2, replace = FALSE) 
    vs_new[swap_inds1] = vs_new[swap_inds2]
    vs_new[swap_inds2] = vs_new[swap_inds1]



    vs2 <- as_tibble(cumprod(1+vs_new))
    vs3 <- as_tibble(cumprod(1+vs))

    if (abs(vs2[60,1]-vs2[55,1]) < abs(vs3[60,1]-vs3[55,1])) {
        vs = vs_new
        }

    flat = ((vs2[60,1]-vs2[55,1]) < 1.05) & ((vs2[60,1]-vs2[55,1]) > 0.95)
    peak= (max(vs2) < 1.305) & (max(vs2) > 1.295)
    swaps_made = swaps_made + 1

    if (peak && flat) {

                break

    }
}
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

这种“爬山”(我不知道我是否可以这样命名)方法对我没有任何结果。

我的下一个想法是使用安排包并为我的数据子集创建排列,合并排列的子集并检查是否满足条件。不过,我担心这可能是我可能会采取的另一个不必要的弯路,并想问您是否对如何解决这个问题有任何想法?

4

0 回答 0