Main Content

去除时间表数据中的线性趋势

此示例说明如何去除时间表中每日股票收盘价的线性趋势。如果数据确实有趋势,则去趋势会强制去除趋势后的数据的均值为零并减少总体变化。

创建股票数据

创建一个包含每日股票收盘价的采样时间表。使用从正态分布中随机采样得到的数字。

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)");

Figure contains an axes object. The axes object with xlabel Time (days), ylabel Stock Price (dollars) contains an object of type line.

去趋势

应用 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)");

Figure contains an axes object. The axes object with xlabel Time (days), ylabel Stock Price (dollars) contains 4 objects of type line, constantline. These objects represent Input Data, Trend, Detrended Data, Mean of Detrended Data.

另请参阅

实时编辑器任务

函数