Я рассчитываю реализовать экспоненциально взвешенное скользящее среднее с помощью скользящего окна, используя данные, которые я извлекаю из большого набора данных.
Код работает, но результаты определенно не такие, какими они должны быть, и я не могу понять, почему. Вот мой код и, пожалуйста, дайте мне подробную информацию о том, что я делаю неправильно:
for(unsigned int i = window; i< close_price.size(); i++)
{
double tmp3;
double tmp4;
for(int j = 0; j < window; j++)
{
tmp3 += pow(lambda,j) * pow(close_price[i-j], 2);
tmp4 += pow(close_price[i-j], 2);
if(j == window-1)
{
double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3);
ewma.push_back( sqrt(temp) );
sma.push_back( tmp4/window );
}
tmp3 = 0;
tmp4 = 0;
}
}
В основном проблема в том, что tmp3 и tmp4 не инициализированы, поэтому tmp3 + = blah имеет неопределенный результат.
То, как я сейчас вижу ваш код, должно выглядеть примерно так:
for(size_t i = window; i< close_price.size(); i++)
{
double tmp3 = 0.0;
double tmp4 = 0.0;
for(size_t j = 0; j < window; j++)
{
tmp3 += pow(lambda,j) * pow(close_price[i-j], 2);
tmp4 += pow(close_price[i-j], 2);
}
double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3);
ewma.push_back( sqrt(temp) );
sma.push_back( tmp4/window );
}
Объяснение: нет необходимости в дополнительном, если внутри цикла for, так как последнее значение j будет window-1
в любом случае, tmp3 и tmp4 должны быть инициализированы при каждом запуске i-цикла. Тип размера () size_t
не беззнаковый int, если есть.
Других решений пока нет …