Image and Signal Processing

Compare Stock Prices Using DTW

Use WarpingCorrespondence to compare the first quarter of 2016 of the HPQ stock prices with historical data from 2010 to 2015.

In[1]:=
Click for copyable input
recent = FinancialData["HPQ", {{2016, 1, 1}, {2016, 3, 31}}, "Value"]; {histDates, hist} = Transpose[ FinancialData["HPQ", {{2010, 1, 1}, {2015, 1, 31}}, "DateValue"]];

Find the best matching subsequence of historical data.

In[2]:=
Click for copyable input
{corrHist, corrRecent} = WarpingCorrespondence[hist, recent, Method -> {"MatchingInterval" -> "Flexible"}];

Detect the historical interval most similar to quarter one of 2016.

In[3]:=
Click for copyable input
{m, n} = corrHist[[{1, -1}]]; histDates[[{m, n}]]
Out[3]=

Visually compare recent data and the best historical match.

show complete Wolfram Language input
In[4]:=
Click for copyable input
DateListPlot[{AssociationThread[ Take[histDates[[m ;; n]], Length[recent]], recent], AssociationThread[histDates[[m ;; n]], hist[[m ;; n]]]}, PlotTheme -> "Business", PlotLegends -> {"2016 data", "Best historical match"}, DateTicksFormat -> {"MonthNameShort", " ", "YearShort"}, ImageSize -> Medium]
Out[4]=

Predict the stock prices for the next 30 days based on historical data.

show complete Wolfram Language input
In[5]:=
Click for copyable input
l = Length[recent]; colDat = ColorData["Atoms"]; offset = Last[recent] - hist[[n]]; hist30d = hist[[n ;; n + 30]]; ListLinePlot[{recent, {l + Range[31], hist30d + offset}\[Transpose], hist[[m ;; n]], {n - m + Range[31], hist30d}\[Transpose]}, PlotStyle -> {colDat["Rh"], {colDat["Mo"], Dotted}, colDat["Yb"], {colDat["Tb"], Dotted}}, PlotLegends -> Placed[{"2016 data", "30 days prediction", "Best historical match", "Next 30 days of historical data"}, Below], ImageSize -> Medium, Axes -> {False, True}, Epilog -> {Dashed, {Arrow[{{n - m, hist[[n]]}, {l + 1, Last[recent]}}], Arrow[{{n - m + 30, hist[[n + 30]]}, {l + 31, hist[[n + 30]] + offset}}]}}]
Out[5]=

Related Examples

de es fr ja ko pt-br ru zh