测试系统稳定性的功能,其输入为预测时间序列。

9

我希望编写一个函数,该函数接受时间序列和标准差作为参数,并返回一个调整后的时间序列,看起来像一份预测。

通过这个函数,我想测试一个稳定性系统,该系统以预测的天气时间序列列表作为输入参数。

我考虑使用以下方法实现这样一个函数:

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,并使用该数字设置符号。
  • 使用反向累积分布函数获取限制条件,这表明当复制的时间序列的值接近原始值时,符号将更改。此处显示了反向CDF的实现 enter image description here
  • 对于时间序列中的每个项目进行循环:
    • 获取正常分布的值,当sign == -1时应该低于零,当sign == 1时应该大于零
    • 根据正常分布值调整时间序列的旧值
    • 如果正常分布值接近原始值,则更改sign

例如,低标准差的结果如下图所示: enter image description here 如果计算两个时间序列的平均绝对百分比误差(MAPE),则会出现以下关系:

  • 标准差:5 -> MAPE: ~0.04
  • 标准差:10 -> MAPE: ~0.08
  • 标准差:15 -> MAPE: ~0.12
  • 标准差:20 -> MAPE: ~0.16

您认为这种方法如何?

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


也许SE/信号处理网站更适合这个问题。 - Damien
1
我对方法一无所知,但似乎你希望 randInRange 在这种情况下表现良好。是这样吗?double number; 没有被使用吗?sign = sign == -1 ? 1 : -1; 可以写成 sign = -sign; - Ted Lyngmo
1
你所说的“看起来像预测”是什么意思或如何定义?你将如何使用生成的随机时间序列来测试你的系统?你提到你的“系统处理预测时间序列”,那么你的系统具体是做什么的? - RobertBaron
我无法理解问题的主要点。您是想预测时间序列吗?还是想评估预测函数?能否让您表述清楚一些?我不明白为什么您首先生成一些虚假数据,然后再使用它们来评估您的函数?这种评估方法是无用的,因为您没有基于真实数据对函数进行评估。 - TonySalimi
1
我明白你想做什么。你提出的建议很好。这实际上是将“白噪声”(即正态分布噪声)添加到过去的真实数据中,我假设如此。如果真实数据受到这种噪声的影响或可以受到影响,那么您将能够评估系统能够容忍的噪声水平。可能还有其他形式的噪声,您可能希望测试您的系统。您知道这些其他可能影响您的系统的噪声类型吗? - RobertBaron
显示剩余4条评论
1个回答

1
您想生成类似于现实现象(天气和股票交易)的某些已有时间序列数据,以便将生成的时间序列数据输入到某个系统中测试其稳定性。您可以采取的方法是:对您现有的数据拟合一些模型,然后使用该模型生成遵循该模型和现有数据的数据。将数据拟合到模型会产生一组模型参数和一组偏差(未被模型解释的差异)。这些偏差可能遵循某些已知的密度函数,但不一定如此。在给定模型参数和偏差的情况下,您可以生成看起来像原始数据的数据。请注意,如果模型不能很好地解释数据,则偏差将很大,并且使用该模型生成的数据将不会像原始数据一样。
例如,如果您知道您的数据是线性的,则通过它们拟合一条直线,您的模型将是:
y = M x + B + E

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

有几种时间序列模型可用于拟合天气和股票交易数据。您可以查看指数平滑。它有几个不同的模型。我相信您可以在维基百科上找到许多其他模型。

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


1
@Anne Bierhoff 在回答另一个问题时,我举了一个例子,展示了如何使用指数平滑模型计算随机时间序列。请参见 https://stackoverflow.com/questions/56466979/modify-code-to-get-synthetic-data-that-trends-smoothly/56467512#56467512 - RobertBaron
非常感谢您的热心帮助。您会如何进行,以查看系统在什么预测准确度(以百分比表示)下会崩溃并不再产生有意义的结果? - Bowers
这实际上取决于您的系统,取决于它预期产生的有意义的结果。 - RobertBaron
假设我有一个预测,其准确率与实际数据匹配达到90%。如果我现在想测试系统如何处理95%的预测,我是否可以简单地将所有单独的预测值按实际数据方向移动一小百分比?这只会减少或增加出现在预测中的噪音类型,不是吗? - Bowers
1
我认为按百分比缩放会改变噪声的概率分布。例如,如果您假设噪声是正态分布的,为了获得更小的误差,您希望使用较小的标准偏差重新计算噪声值。按百分比缩放不会产生相同的结果。 - RobertBaron
谢谢您的建议。也许最好这样做:计算每个值的预测和实际数据之间的偏差,并将其归一化,使最大偏差为0,最小偏差为1。然后:adjusted_i = forecast_i + (actual_i - forecast_i) * (normalized_i * p),其中p定义了校正的强度。通过这种方式,只有随着“p”的增加,大的偏差才会逐渐被纠正。这是否也会改变噪声的概率分布? - Bowers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接