我想编写一个函数,获取时间序列和标准差作为参数,并返回调整后的时间序列,看起来像预测。
我想使用此功能测试系统的稳定性,该系统获取天气预报时间序列列表作为输入参数。
我对此类功能的处理方法如下所述:
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
- 时间序列中每个项目的 For 循环:
- 得到一个正态分布值,当
sign == -1
时该值应该小于零当sign == 1
时更大的零 - 根据正态分布调整时间序列的旧值 值(value)
- 更改
sign
如果正态分布值接近原始值。
- 得到一个正态分布值,当
例如,可以在此处看到黄色的低标准偏差的结果: 如果计算两个时间序列的平均绝对百分比误差(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
是一个随机变量,它遵循适合您的数据的直线周围的误差分布,其中 M
和 B
是模型参数。您现在可以使用该模型生成大致线性的 (x, y)
坐标。在对随机变量 E
进行采样时,您可以假设它服从某种已知分布(如正态分布),或使用直方图来生成服从任意密度函数的偏差。
您可以使用多种时间序列模型来拟合您的天气和证券交易所数据。你可以看看 exponential smoothing .它有几种不同的型号。我相信您可以在维基百科上找到许多其他模型。
如果模型不能很好地拟合您的数据,您还可以将其参数视为随机变量。在我们上面的例子中,假设我们已经观察到斜率似乎在变化的数据。我们将拟合几行并获得 M
的分布。然后,我们会在生成数据时对该变量和 E
进行采样。
关于c++ - 用于测试系统稳定性的功能,它接收预测的时间序列作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56239172/