Main Content

Remove Linear Trends from Timetable Data

This example shows how to remove a linear trend from daily closing stock prices in a timetable. If the data does have a trend, detrending forces the mean of the detrended data to zero and reduces overall variation.

Create Stock Data

Create a sample timetable containing daily closing stock prices. Use randomly sampled numbers from a normal distribution.

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 and label the stock price data.

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.

Remove Trend

Apply detrend, which performs a linear fit to the stock prices and removes the trend. Specify to append the detrended data to the input timetable.

TT = detrend(TT,ReplaceValues=false);

Compute the trend line by subtracting the detrended data from the input data.

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
      ⋮

Find the average closing price of the detrended data.

average_detrended = mean(TT.StockPrice_detrended)
average_detrended = 
-1.2464e-14

As expected, the detrended data has a mean very close to 0.

Visualize Detrended Data

Display the results by plotting the original daily closing stock prices, the trend line, the detrended data, and its mean.

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.

See Also

Live Editor Tasks

Functions