我有以下问题:
- 我有 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
这种“爬山”(我不知道我是否可以这样命名)方法对我没有任何结果。
我的下一个想法是使用安排包并为我的数据子集创建排列,合并排列的子集并检查是否满足条件。不过,我担心这可能是我可能会采取的另一个不必要的弯路,并想问您是否对如何解决这个问题有任何想法?