Вот некоторые xts
инструменты, которые могут помочь вам решить вашу проблему.
xx <- getSymbols("AAPL", auto.assign = FALSE)
Если вы хотите получать годовую доходность (в вашем вопросе непонятно, хотите вы этого или нет), вы можете просто использовать annualReturn
(наряду со многими другими частотами возврата, такими как monthlyReturn()
)?
y <- annualReturn(xx)
y
Если вы хотите получать первые и последние наблюдения в каждом году, вы можете использовать функцию конечных точек (которая также работает для других значений on
, таких как секунды, минуты, дни, недели, месяцы и т. Д.)
ep <- endpoints(xx, on = "years")
Получить последний бар в каждом году:
xx[ep,]
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
# 2007-12-31 28.50000 28.64286 28.25000 28.29714 134833300 18.868626
# 2008-12-31 12.28143 12.53429 12.19143 12.19286 151885300 8.130234
# 2009-12-31 30.44714 30.47857 30.08000 30.10429 88102700 20.073631
# 2010-12-31 46.13571 46.21143 45.90143 46.08000 48377000 30.726294
# 2011-12-30 57.64429 58.04000 57.64143 57.85714 44915500 38.579315
# 2012-12-31 72.93285 76.48572 72.71429 76.02428 164873100 53.974899
# 2013-12-31 79.16715 80.18285 79.14286 80.14571 55771100 67.919533
# 2014-12-31 112.82000 113.13000 110.21000 110.38000 41403400 102.503265
# 2015-12-31 107.01000 107.03000 104.82000 105.26000 40635300 99.414101
# 2016-12-30 116.65000 117.20000 115.43000 115.82000 30586300 111.821404
# 2017-12-29 170.52000 170.59000 169.22000 169.23000 25884400 166.014908
# 2018-12-31 158.53000 159.36000 156.48000 157.74000 35003500 157.066376
# 2019-04-29 204.39999 205.97000 203.86000 204.61000 22125400 204.610001
Получить первый бар в каждом году немного сложнее, но легко, если вы знаете, что endpoints
возвращает
xx[ep[-length(ep)] + 1,]
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
# 2007-01-03 12.32714 12.36857 11.70000 11.97143 309579900 7.982585
# 2008-01-02 28.46714 28.60857 27.50714 27.83429 269794700 18.559986
# 2009-01-02 12.26857 13.00571 12.16571 12.96429 186503800 8.644626
# 2010-01-04 30.49000 30.64286 30.34000 30.57286 123432400 20.386072
# 2011-01-03 46.52000 47.18000 46.40572 47.08143 111284600 31.394041
# 2012-01-03 58.48571 58.92857 58.42857 58.74714 75555200 39.172771
# 2013-01-02 79.11714 79.28571 77.37572 78.43285 140129500 55.684914
# 2014-01-02 79.38286 79.57571 78.86000 79.01857 58671200 66.964325
# 2015-01-02 111.39000 111.44000 107.35000 109.33000 53204600 101.528191
# 2016-01-04 102.61000 105.37000 102.00000 105.35000 67649400 99.499107
# 2017-01-03 115.80000 116.33000 114.76000 116.15000 28781900 112.140007
# 2018-01-02 170.16000 172.30000 169.26000 172.26000 25555900 168.987320
# 2019-01-02 154.89000 158.85001 154.23000 157.92000 37039700 157.245605
В ep[-length(ep)] + 1
последнее значение в ep
возвращает последний индекс наблюдения в наборе данных, поэтому он исключается. Мы увеличиваем каждое значение ep
на 1, чтобы получить первое наблюдение за следующим «интервалом» (который здесь год).
Также ep[1] = 0
, поэтому ep[1] + 1
вернет первую строку в наборе данных.