初始变量:
yt: 输入的时间序列数据
j: 预测的未来步数
线性回归预测法:
function results = forecast13(~, yt, j)
% yt: 输入的时间序列数据
% j: 预测的未来步数
% 确定输入数据的长度
n = length(yt);
% 将时间序列数据转换为设计矩阵,用于线性回归
X = [ones(n, 1), (1:n)']; % 添加截距项和时间趋势项
% 使用最小二乘法进行线性回归
B = regress(yt', X);
% 初始化预测结果数组
predictions = zeros(j, 1);
% 计算最后一个已知数据点的索引
lastIndex = n;
% 使用线性回归模型进行预测
for i = 1:j
% 预测未来值
predictions(i) = B(1) + B(2) * (lastIndex + i);
end
% 将预测结果转换为列向量形式
predictions = predictions';
% 将预测结果添加到原始时间序列数据中
% 确保yt也是一个列向量
if isvector(yt) && iscolumn(yt)
yt = [yt; predictions];
else
yt = [yt, predictions]; % 如果yt不是列向量,使用水平拼接
end
% 输出预测结果
results = yt(n+1:end);
end
简单移动平均法 :
function results = forecast2(~, yt, j)
% yt: 输入的时间序列数据
% j: 预测的未来步数
% 初始化参数
m = length(yt); % 时间序列的长度
m1 = length(yt); % 原始时间序列的长度(用于最后返回结果的切片)
a = j; % 预测的步数
% 计算移动平均的窗口大小,这里假设窗口大小为3(可以根据需要调整)
k = 3;
% 初始化预测数组
y_forecast = NaN(1, j); % 用于存储每一步的预测值
% 计算第一个移动平均值
movingAverage = mean(yt(end-k+1:end));
% 使用简单移动平均法进行预测
for i = 1:a
% 将计算得到的移动平均值添加到时间序列的末尾
yt = [yt, movingAverage];
m = length(yt); % 更新时间序列长度
% 更新移动平均值,这里使用时间序列的最后k个值
movingAverage = mean(yt(end-k+1:end));
% 存储预测值
y_forecast(i) = movingAverage;
end
% 输出预测结果
results = yt(1, m1+1:end);
end
局部加权回归预测法 :
function results = forecast14(~, yt, j)
% yt: 输入的时间序列数据
% j: 预测的未来步数
% 确定输入数据的长度
n = length(yt);
% 确保yt是一个列向量
if ~iscolumn(yt)
yt = yt';
end
% 初始化预测结果数组
predictions = zeros(j, 1);
% 用于存储更新后的时间序列数据
yt_updated = [yt; predictions]; % 预先分配空间以简化代码
% 进行预测
for i = 1:j
% 定义局部加权回归的权重函数
bandwidth = 3; % 局部加权回归的带宽
indices = max(1, n-j+i-(bandwidth-1)):(n-j+i); % 选择最近的bandwidth个数据点作为回归基础
indices = indices(:)'; % 确保indices是行向量
% 创建设计矩阵 Xi
Xi = [ones(length(indices), 1), indices]; % 添加截距项和时间趋势项
% 计算权重
weights = exp(-0.5 * (((indices - (n-j+i-(bandwidth-1))).^2) / (bandwidth * 0.1)));
weights = weights / sum(weights); % 归一化权重
% 计算局部加权回归预测值
XiW = Xi * diag(weights);
local_pred = XiW * regress(yt(indices)', Xi);
% 使用局部加权回归预测值
predictions(i) = local_pred(1) + local_pred(2) * (n-j+i);
end
% 输出预测结果
results = yt_updated(n+1:end);
end
Holt-Winters季节性模型法 :
function results = forecast12(~, yt, j)
alpha = 0.3; % 光滑系数
beta = 0.1; % 趋势系数
gamma = 0.1; % 季节性系数
n = length(yt);
st1_0 = mean(yt(1:3)); st2_0=st1_0; st3_0=st1_0;
st1 = alpha * yt(1) + (1 - alpha) * st1_0;
st2 = alpha * st1 + (1 - alpha) * st2_0;
st3 = alpha * st2 + (1 - alpha) * st3_0;
% 初始化yt数组以存储预测值
yt_with_forecast = yt;
for i = 2:(n + j)
if i > n
% 计算预测值并添加到yt_with_forecast中
a = 3 * st1 - 3 * st2 + st3;
b = 0.5 * alpha / (1 - alpha)^2 * ((6 - 5 * alpha) * st1 - 2 * (5 - 4 * alpha) * st2 + (4 - 3 * alpha) * st3);
c = 0.5 * alpha^2 / (1 - alpha)^2 * (st1 - 2 * st2 + st3);
yt_with_forecast(i) = a + b + c;
end
st1 = alpha * yt_with_forecast(i) + (1 - alpha) * st1;
st2 = alpha * st1 + (1 - alpha) * st2;
st3 = alpha * st2 + (1 - alpha) * st3;
end
results = yt_with_forecast(n+1:end);
end