0

We have the following function to compute monthly returns from a daily series of prices:

PricesRet = diff(Prices)/lag(Prices,k=-1)
tail(PricesRet)
# Monthly simple returns
MonRet = aggregate(PricesRet+1, as.yearmon, prod)-1
tail(MonRet)

The problem is that it returns wrong values, take for example the simple return for the month of Feb 2013, the function returns a return -0.003517301 while it should have been -0.01304773.

Why that happens?

Here are the last prices observations:

> tail(Prices,30)
                 Prices
2013-01-22      165.5086
2013-01-23      165.2842
2013-01-24      168.4845
2013-01-25      170.6041
2013-01-28      169.7373
2013-01-29      169.8724
2013-01-30      170.6554
2013-01-31      170.7210
2013-02-01      173.8043
2013-02-04      172.2145
2013-02-05      172.8400
2013-02-06      172.8333
2013-02-07      171.3586
2013-02-08      170.5602
2013-02-11      171.2172
2013-02-12      171.4126
2013-02-13      171.8687
2013-02-14      170.7955
2013-02-15      171.2848
2013-02-19      170.9482
2013-02-20      171.6355
2013-02-21      170.0300
2013-02-22      169.9319
2013-02-25      170.9035
2013-02-26      168.6822
2013-02-27      168.5180
2013-02-28      168.4935
2013-03-01      169.6546
2013-03-04      169.3076
2013-03-05      169.0579

Here are price returns:

> tail(PricesRet,50)
              PricesRet
2012-12-18  0.0055865274
2012-12-19 -0.0015461900
2012-12-20 -0.0076140194
2012-12-23  0.0032656346
2012-12-26  0.0147750923
2012-12-27  0.0013482760
2012-12-30 -0.0004768131
2013-01-01  0.0128908541
2013-01-02 -0.0047646818
2013-01-03  0.0103372029
2013-01-06 -0.0024547278
2013-01-07 -0.0076920352
2013-01-08  0.0064368720
2013-01-09  0.0119663301
2013-01-10  0.0153828814
2013-01-13  0.0050590540
2013-01-14 -0.0053324785
2013-01-15 -0.0027043105
2013-01-16  0.0118840383
2013-01-17 -0.0005876459
2013-01-21 -0.0145541598
2013-01-22 -0.0013555548
2013-01-23  0.0193624621
2013-01-24  0.0125802978
2013-01-27 -0.0050807744
2013-01-28  0.0007959058
2013-01-29  0.0046096266
2013-01-30  0.0003844082
2013-01-31  0.0180603867
2013-02-03 -0.0091473127
2013-02-04  0.0036322298
2013-02-05 -0.0000390941
2013-02-06 -0.0085320734
2013-02-07 -0.0046591956
2013-02-10  0.0038517581
2013-02-11  0.0011412046
2013-02-12  0.0026607502
2013-02-13 -0.0062440496
2013-02-14  0.0028645616
2013-02-18 -0.0019651341
2013-02-19  0.0040206637
2013-02-20 -0.0093543648
2013-02-21 -0.0005764665
2013-02-24  0.0057176118
2013-02-25 -0.0129979321
2013-02-26 -0.0009730782
2013-02-27 -0.0001453191
2013-02-28  0.0068911863
2013-03-03 -0.0020455332
2013-03-04 -0.0014747845

The results of the function is instead:

> tail(data.frame(MonRet))
               MonRet
ott 2012 -0.000848156
nov 2012  0.009833881
dic 2012  0.033406884
gen 2013  0.087822700
feb 2013 -0.023875638
mar 2013 -0.003517301
BenMorel
  • 34,448
  • 50
  • 182
  • 322
Lorenzo Rigamonti
  • 1,705
  • 8
  • 25
  • 36
  • if you want monthly return why not just take monthend prices and calculate return from that? – CHP Mar 08 '13 at 15:53
  • This isn't reproducible. When I run the data you provided I don't get the Feb return of `-0.003517301` stated. I assume this is because you did not post all the data needed to get that value. – G. Grothendieck Mar 08 '13 at 15:53
  • It could not depend on the format of the Dates (Dates or PosixCT)? – Lorenzo Rigamonti Mar 08 '13 at 16:02

1 Answers1

1

Your returns are wrong. The return for 2013-01-23 should be:

> 165.2842/165.5086-1
[1] -0.001355821

but you have 0.0193624621. I suspect this is because Prices is an xts object, not a zoo object. lag.xts breaks the convention in lag.ts and lag.zoo of k=1 implying a "lag" of (t+1) for the more common convention of using k=1 to imply a "lag" of (t-1).

Joshua Ulrich
  • 173,410
  • 32
  • 338
  • 418