我的投资组合范围大约为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
谢谢!
答案 0 :(得分: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]
答案 1 :(得分: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
将返回数据集中的第一行。