Algorithm

In[]:=
EQR=FinancialData["EQR","Return",DatePlus[Yesterday,{-5,"Years"}]]
Out[]=
TimeSeries
Time: 24 May 2016 to 21 May 2021
Data points: 1259

In[]:=
UDR=FinancialData["UDR","Return",DatePlus[Yesterday,{-5,"Years"}]]
Out[]=
TimeSeries
Time: 24 May 2016 to 21 May 2021
Data points: 1258

In[]:=
commonDates=DateObject[#,"Day"]&/@Intersection[EQR["Dates"],UDR["Dates"]];
In[]:=
EQRreturns=QuantityMagnitude[EQR[commonDates]]/100.;​​UDRreturns=QuantityMagnitude[UDR[commonDates]]/100.;
In[]:=
Dimensions@Join[{EQRreturns,UDRreturns}]
Out[]=
{2,1258}

Unadjusted Spread

In[]:=
SpreadReturns=EQRreturns-UDRreturns;
In[]:=
tsSpread=FoldList[Times,100,(1+SpreadReturns)];
In[]:=
tsSpread=TimeSeries[tsSpread,{Prepend[commonDates,DatePlus[commonDates[[1]],{-1,"BusinessDay"}]]}]
Out[]=
TimeSeries
Time: 23 May 2016 to 21 May 2021
Data points: 1259

In[]:=
DateListPlot[tsSpread]
Out[]=

Adjusted Spread

In[]:=
lm=LinearModelFit[Transpose@Join[{EQRreturns,UDRreturns}],x,x]
Out[]=
FittedModel
0.000149532+0.932307x

In[]:=
lm["RSquared"]
Out[]=
0.847518
In[]:=
sd=StandardDeviation[lm["FitResiduals"]]
Out[]=
0.00678272
In[]:=
Show[ListPlot[lm["FitResiduals"]],Graphics[{Thick,Red,Line[{{0,2*sd},{2000,2*sd}}]}],Graphics[{Thick,Red,Line[{{0,-2*sd},{2000,-2*sd}}]}]]
Out[]=
200
400
600
800
1000
1200
-0.02
-0.01
0.01
0.02
In[]:=
tsSpread=FoldList[Times,100,(1+lm["FitResiduals"])];
In[]:=
tsSpread=TimeSeries[tsSpread,{Prepend[commonDates,DatePlus[commonDates[[1]],{-1,"BusinessDay"}]]}]
Out[]=
TimeSeries
Time: 23 May 2016 to 21 May 2021
Data points: 1259

In[]:=
DateListPlot[tsSpread]
Out[]=

Sequentially Adjusted Spread

In[]:=
beta=Take[#["BestFitParameters"],-1]&/@Table[lm=LinearModelFit[Transpose@Join[{EQRreturns[[1;;i]],UDRreturns[[1;;i]]}],x,x],{i,20,Length[commonDates]-1}]//Flatten;
In[]:=
ListPlot[beta]
Out[]=
200
400
600
800
1000
1200
0.65
0.70
0.75
0.80
0.85
0.90
0.95
In[]:=
spreadResiduals=Table[EQRreturns[[i+20]]-beta[[i]]*UDRreturns[[i+20]],{i,Length@beta}];
In[]:=
tsSpread=FoldList[Times,100,(1+spreadResiduals)];
In[]:=
tsSpread=TimeSeries[tsSpread,{commonDates[[20;;]]}]
Out[]=
TimeSeries
Time: 21 Jun 2016 to 21 May 2021
Data points: 1239

In[]:=
DateListPlot[tsSpread]
Out[]=