是否有用于在xts中查找第一个非null元素的函数

问题描述 投票:1回答:2

我有一个跨越大约的投资组合。 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

谢谢!

r xts
2个回答
1
投票

我从@akrun和@FXQuantTrader得到了2个答案。

感谢@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
投票

以下是一些可以帮助您解决问题的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将返回数据集中的第一行。

© www.soinside.com 2019 - 2024. All rights reserved.