Есть ли функция для поиска первого ненулевого элемента в XTS - PullRequest
1 голос
/ 29 апреля 2019

У меня есть портфель, ок. 20 лет с ежедневными ценами, и я хочу рассчитать доход за каждый год. За исключением того, что нет данных о датах 20xx-12-31 и 20xx-01-01. Как я могу получить предыдущие и следующие действительные данные из xts?

# create portfolio, no data on holidays
dates <- as.Date(c("2016-12-29","2017-01-02", "2017-12-30", "2018-01-03"))
portfolio <- as.xts(x = c(100000, 101000, 110000, 110500), order.by = dates)

На что я надеюсь:

# expected result
portfolio["2017-01-01"]
2017-01-02   101000

Спасибо!

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Я получил 2 ответа от @akrun и @ FXQuantTrader.

Благодаря @akrun за первый ответ.

вы можете получить следующие (или предыдущие) n значений и затем выбратьпервый (соответственно последний):

# the next values
values <- portfolio[as.Date("2016-01-01") + days(1:5)]
start_value <- values[1]
# the previous values
values <- portfolio[as.Date("2017-01-01") + days(-1:-5)]
end_value <- values[length(values)]

и спасибо @FXQuantTrader за указание на endpoints функцию

# get endpoints (sp is for start points)
ep <- endpoints(portfolio, on = "years")
sp <- ep[1:length(ep)-1] + 1
start_values <- portfolio[sp]
end_values <- portfolio[ep]
0 голосов
/ 30 апреля 2019

Вот некоторые 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 вернет первую строку в наборе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...