📦 200 simulated days, second by second
set.seed(2026)
n_sec <- 23400; days <- 200; s <- (1:n_sec) / n_sec
sig <- 0.01 * sqrt(0.6 + 3.2 * (s - 0.5)^2) # U-shaped intraday vol
IV <- mean(sig^2) # integrated variance per day
grid <- c(13, 26, 78, 390, 1170, 4680, 23400) # 30 min ... 1 second
res <- replicate(days, {
lp <- cumsum(sig * rnorm(n_sec) / sqrt(n_sec)) # efficient log price
obs <- lp + rnorm(n_sec, 0, 0.0001) # + noise, 1 basis point
sapply(grid, function(m) { k <- seq(n_sec / m, n_sec, by = n_sec / m)
c(clean = sum(diff(c(0, lp[k]))^2), noisy = sum(diff(c(0, obs[k]))^2)) })
})
round(cbind(m = grid, clean = rowMeans(res[1, , ]) / IV, noisy = rowMeans(res[2, , ]) / IV), 2) m clean noisy
[1,] 13 1.01 1.01
[2,] 26 1.00 1.01
[3,] 78 0.99 1.01
[4,] 390 1.00 1.09
[5,] 1170 1.00 1.27
[6,] 4680 1.00 2.08
[7,] 23400 1.00 6.39


