timetable データからの線形トレンドの除去
この例では、timetable 内の毎日の株価終値から線形トレンドを除去する方法を説明します。データにトレンドがある場合、トレンドを除去することで、トレンドが除去されたデータの平均値が強制的にゼロになり、全体的な変動が抑えられます。
株データの作成
毎日の株価終値を含むサンプルの timetable を作成します。正規分布からランダムにサンプリングされた数値を使用します。
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
を適用すると、株価に対する線形近似が実行され、トレンドが除去されます。トレンドが除去されたデータを入力 timetable に追加するように指定します。
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.2464e-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)");