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

标签 c++ prediction forecasting normal-distribution standard-deviation

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

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

我对此类功能的处理方法如下所述:

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;
}
  • 从原始时间序列复制一份,也来自类型vector<tuple<datetime, double>>
  • 获取一个 0 或 1 的随机数,并使用该数字设置符号。
  • 使用逆累积分布函数获取限值,这些限值指示符号何时更改。当复制的时间序列的值接近原始值时,符号会发生变化。 The implementation of the inverse CDF is shown here enter image description here
  • 时间序列中每个项目的 For 循环:
    • 得到一个正态分布值,当 sign == -1 时该值应该小于零当 sign == 1 时更大的零
    • 根据正态分布调整时间序列的旧值 值(value)
    • 更改sign如果正态分布值接近原始值。

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

  • stddev: 5 -> MAPE: ~0.04
  • stddev: 10 -> MAPE: ~0.08
  • stddev: 15 -> MAPE: ~0.12
  • stddev:20 -> MAPE:~0.16

您如何看待这种方法?

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

最佳答案

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

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

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

y = M x + B + E

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

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

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

关于c++ - 用于测试系统稳定性的功能,它接收预测的时间序列作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56239172/

相关文章:

r - 绘制混合效应模型的预测区间

c++ - ubuntu上安装qtservice

c++ - 创建 N 嵌套 for 循环

c++ - g++ 编译存在于另一个目录中的源文件

c++ - 重构 C++ 代码以使用前向声明

python-2.7 - sklearn 和导入 CSV 时出现不可哈希类型错误

python - 使用 LSTM 循环网络进行 Pybrain 时间序列预测

Python statsmodels ARIMA 预测

r - 在 R 中使用 tslm 预测时间序列

r - HoltWinters 中的错误...未使用的参数 (h =