Solution 1 (Accepted):

With a little preprocessing you can summarise the values by date and f_type to generate the desired ymin, lower, middle, upper and ymax arguments of geom_boxplot (the trick is to set stat = "identity"):

forecasts %>% group_by(f_type, Date) %>% 
    summarise( # You can set your desired values/quantiles here
        y_min = quantile(value, 0.05),
        low = quantile(value, 0.25),
        mid = quantile(value, 0.5),
        high = quantile(value, 0.75),
        y_max = quantile(value, 0.95)
    ) %>% 
    ggplot() + 
    geom_boxplot(
        aes(
            ymin = y_min,
            lower = low,
            middle = mid,
            upper = high,
            ymax = y_max,
            x = as.factor(Date),
            fill = f_type
        ), 
        stat = "identity"
    ) + 
    geom_line(
        data = observations,
        aes(
            x = as.factor(Dt), 
            y = obs, group = 1
        ), 
        size = 2
    )