我正在设计一个计算30天滚动波动率的函数。 我有一个包含3列的文件:日期和2个股票的每日回报。
我该怎么做?我在汇总前30个条目以获取我的卷时遇到问题。
编辑:
因此它会读取一个excel文件,包含3列:日期和每日返回。
daily.ret = read.csv(“abc.csv”)
e.g。 date stock1 stock2 01/01/2000 0.01 0.02
等等,拥有多年的数据。我想计算滚动30天年度卷。 这是我的功能:
calc_30day_vol = function()
{
stock1 = abc$stock1^2
stock2 = abc$stock1^2
j = 30
approx_days_in_year = length(abc$stock1)/10
vol_1 = 1: length(a1)
vol_2 = 1: length(a2)
for (i in 1 : length(a1))
{
vol_1[j] = sqrt( (approx_days_in_year / 30 ) * rowSums(a1[i:j])
vol_2[j] = sqrt( (approx_days_in_year / 30 ) * rowSums(a2[i:j])
j = j + 1
}
}
因此stock1和stock 2是excel文件的平均每日回报,需要计算vol。 vol_1和vol_2的条目1-30是空的,因为我们正在计算30天的卷。我试图使用rowSums函数来计算前30个条目的平方每日回报,然后向下移动每次迭代的索引。 所以从第1-30天,第2-31天,第3-32天等,因此为什么我定义了“j”。
我是R的新人,如果这听起来相当愚蠢,请道歉。
答案 0 :(得分:5)
这应该让你开始。
首先,我必须创建一些看起来像你描述的数据
library(quantmod)
getSymbols(c("SPY", "DIA"), src='yahoo')
m <- merge(ROC(Ad(SPY)), ROC(Ad(DIA)), all=FALSE)[-1, ]
dat <- data.frame(date=format(index(m), "%m/%d/%Y"), coredata(m))
tmpfile <- tempfile()
write.csv(dat, file=tmpfile, row.names=FALSE)
现在我有一个csv,其中包含您特定格式的数据。
使用read.zoo
读取csv然后转换为xts对象(有很多方法可以将数据读入R.请参阅R Data Import/Export)
r <- as.xts(read.zoo(tmpfile, sep=",", header=TRUE, format="%m/%d/%Y"))
# each column of r has daily log returns for a stock price series
# use `apply` to apply a function to each column.
vols.mat <- apply(r, 2, function(x) {
#use rolling 30 day window to calculate standard deviation.
#annualize by multiplying by square root of time
runSD(x, n=30) * sqrt(252)
})
#`apply` returns a `matrix`; `reclass` to `xts`
vols.xts <- reclass(vols.mat, r) #class as `xts` using attributes of `r`
tail(vols.xts)
# SPY.Adjusted DIA.Adjusted
#2012-06-22 0.1775730 0.1608266
#2012-06-25 0.1832145 0.1640912
#2012-06-26 0.1813581 0.1621459
#2012-06-27 0.1825636 0.1629997
#2012-06-28 0.1824120 0.1630481
#2012-06-29 0.1898351 0.1689990
#Clean-up
unlink(tmpfile)