我目前正在使用R进行一些研究,我想知道是否有任何人有关于如何创建以下变量的任何聪明的想法或任何预先打包的功能:
我有一个单变量的价格序列,比如金融资产的每日收盘价,可以追溯到10年。 (它是一个xts对象)
我选择了我的x为2%
我的价格数据的每一天。我想知道你需要去的最小天数,以便创造一个(可能是绝对的)回报(假设你有先见之明的交易),大于x%。该变量将返回生成该x%返回所需的天数/月数/年。如果需要返回数据的开头以产生大于x%的回报,则在早期阶段返回NA。
我可以想到一些手动和笨重的方法,但它使用大量的循环来检查日期/价格的负载,以便返回每天的正确值,然后该过程重复自己的下一个那天...它在10年的数据或日内数据方面存在很大问题,因此将提供更快的解决方案......
答案 0 :(得分:2)
如果没有for循环,我没有看到任何方法,但下面的解决方案相当快(我的2.2Ghz笔记本电脑上每10,000行约1秒)。
请注意,我正在使用xts对象的coredata
并删除dim
属性(通过drop
),后者返回一个向量。我这样做是因为xts / zoo中的数学运算按索引对齐,所以你需要在计算回报之前从分子中删除索引。
但是,这会导致除法调度调用NextMethod
,因为分子是numeric
类,而分母是xts
类。我通过对数字向量进行除法来避免这种开销。
library(quantmod)
getSymbols("^GSPC",from="1900-01-01")
x <- Ad(GSPC)
lookback <- function(x, p) {
# lookback() assumes x is xts
# select first column, take coredata, drop dims
dcx <- drop(coredata(x[,1]))
# initialize result object
f <- dcx*NA
# loop over all rows in 'x'
for(i in 1:nrow(x)) {
# Calculate cumulative return through today
r <- dcx[i]/dcx-1 # or log(dcx[i]/dcx)
# This really slows things down:
# r <- dcx[i]/x-1
#
# Find which returns are greater than 'p'
w <- which(abs(r[1:i]) > p)
# If any returns are greater than 'p', then
# record the closest location to 'p'
if(length(w)!=0)
f[i] <- max(w)-i
}
# return an xts object
xts(f, index(x))
}
nrow(x)
# [1] 15791
system.time(lookback(x,0.02))
# user system elapsed
# 15.761 0.152 16.040
答案 1 :(得分:1)
首先,您应该反转时间序列,以使具有最小正值的x值在时间上最接近,并且更远的过去点在右侧。然后你可以取当前值并说:
set.seed(123)
yval=cumsum(0.01*rnorm(100))
plot(1:100, yval, type="b")
which(rev(yval) < 0.95*yval[100])
which(rev(yval) < (1- 0.05)*yval[100])[1]
[1] 5
如果您提供了包含日期时间或日期分类变量的样本数据集,我们可以帮助您进行任何所需的转换。