用于测试系统稳定性的功能,它接收预测的时间序列作为输入

Function for testing system stability, which receives predicted time series as input

我想编写一个函数,获取时间序列和标准差作为参数,returns 调整后的时间序列看起来像预测。

我想使用此功能测试系统的稳定性,该系统获取天气预报时间序列列表作为输入参数。

我对这种功能的做法,如下所述:

vector<tuple<datetime, double>> get_adjusted_timeseries(vector<tuple<datetime, double>>& timeseries_original, const double stddev, const double dist_mid)
{

    auto timeseries_copy(timeseries_original);

    int sign = randInRange(0, 1) == 0 ? 1 : -1;


    auto left_limit = normal_cdf_inverse(0.5 - dist_mid, 0, stddev);
    auto right_limit = normal_cdf_inverse(0.5 + dist_mid, 0, stddev);

    for (auto& pair : timeseries_copy)
    {
        double number;
        do
        {
            nd_value = normal_distribution_r(0, stddev);
        }
        while (sign == -1 && nd_value > 0.0 || sign == 1 && nd_value < 0.0);


        pair = make_tuple(get<0>(pair), get<1>(pair) + (nd_value / 100) * get<1>(pair));


        if (nd_value > 0.0 && nd_value < right_limit || nd_value < 0.0 && nd_value > left_limit)
        {
            sign = sign == -1 ? 1 : -1;
        }
    }

    return timeseries_copy;
}

例如,可以在此处看到黄色的低标准差结果: 如果计算两个时间序列的平均绝对百分比误差(MAPE),则得到以下关系:

您如何看待这种做法?

这个函数可以用来测试一个必须处理预测时间序列的系统吗?

您想要生成的时间序列数据的行为类似于您从真实现象(天气和证券交易所)获得的一些现有时间序列数据。生成的时间序列数据将被输入到某个系统中以测试其稳定性。

您可以做的是:将一些模型拟合到您现有的数据,然后使用该模型生成遵循该模型的数据,从而生成您现有的数据。将数据拟合到模型会产生一组模型参数和一组偏差(模型未解释的差异)。偏差可能遵循一些已知的密度函数,但不一定。给定模型参数和偏差,您可以生成看起来像原始数据的数据。注意,如果模型不能很好地解释数据,偏差会很大,用模型生成的数据看起来不像原始数据。

例如,如果您知道您的数据是线性的,您可以通过它们拟合一条线,您的模型将是:

y = M x + B + E

其中 E 是一个随机变量,它遵循适合您的数据的直线周围的误差分布,其中 MB 是模型参数。您现在可以使用该模型生成大致线性的 (x, y) 坐标。在对随机变量 E 进行采样时,您可以假设它遵循某种已知分布,例如正态分布,或者使用直方图来生成遵循任意密度函数的偏差。

您可以使用多种时间序列模型来拟合您的天气和证券交易所数据。你可以看看exponential smoothing。它有几种不同的型号。我相信您可以在维基百科上找到许多其他模型。

如果模型不能很好地拟合您的数据,您还可以将其参数视为随机变量。在我们上面的例子中,假设我们已经观察到斜率似乎在变化的数据。我们将拟合几条线并获得 M 的分布。然后我们会在生成数据时对该变量以及 E 进行采样。