去除时间表数据中的线性趋势
此示例说明如何去除时间表中每日股票收盘价的线性趋势。如果数据确实有趋势,则去趋势会强制去除趋势后的数据的均值为零并减少总体变化。
创建股票数据
创建一个包含每日股票收盘价的采样时间表。使用从正态分布中随机采样得到的数字。
x = 0:300;
Time = days(x)';
dailyFluct = gallery("normaldata",size(x),2);
closing = cumsum(dailyFluct) + 20 + x/100;
StockPrice = closing';
TT = timetable(Time,StockPrice)
TT=301×1 timetable
Time StockPrice
_______ __________
0 days 21.749
1 day 21.892
2 days 22.227
3 days 21.443
4 days 21.768
5 days 21.251
6 days 22.193
7 days 23.368
8 days 21.332
9 days 20.698
10 days 22.449
11 days 22.946
12 days 24.004
13 days 25.503
14 days 26.783
15 days 24.937
⋮
绘制并标记股票价格数据。
plot(TT,"Time","StockPrice"); xlabel("Time (days)"); ylabel("Stock Price (dollars)");
去趋势
应用 detrend
,它对股票价格执行线性拟合并进行去趋势处理。指定将去除趋势后的数据追加到输入时间表。
TT = detrend(TT,ReplaceValues=false);
通过从输入数据中减去去除趋势后的数据来计算趋势线。
trend = TT.StockPrice - TT.StockPrice_detrended;
TT = addvars(TT,trend,NewVariableNames="Trend")
TT=301×3 timetable
Time StockPrice StockPrice_detrended Trend
_______ __________ ____________________ ______
0 days 21.749 -3.7893 25.538
1 day 21.892 -3.7397 25.631
2 days 22.227 -3.4975 25.724
3 days 21.443 -4.3742 25.817
4 days 21.768 -4.1423 25.91
5 days 21.251 -4.7525 26.003
6 days 22.193 -3.9033 26.096
7 days 23.368 -2.8216 26.189
8 days 21.332 -4.9502 26.282
9 days 20.698 -5.6776 26.375
10 days 22.449 -4.0195 26.468
11 days 22.946 -3.6157 26.561
12 days 24.004 -2.6498 26.654
13 days 25.503 -1.2442 26.747
14 days 26.783 -0.056718 26.84
15 days 24.937 -1.9958 26.933
⋮
求去除趋势后的数据的平均收盘价。
average_detrended = mean(TT.StockPrice_detrended)
average_detrended = -1.2488e-14
去除趋势后的数据的均值非常接近 0,这与预期相符。
可视化去除趋势后的数据
通过绘制原始每日股票收盘价、趋势线、去除趋势后的数据及其均值来显示结果。
plot(TT,"StockPrice") hold on plot(TT,"Trend") plot(TT,"StockPrice_detrended") yline(average_detrended) legend("Input Data","Trend","Detrended Data", ... "Mean of Detrended Data","Location","northwest") xlabel("Time (days)"); ylabel("Stock Price (dollars)");