Я хочу рассчитать особый риск c для некоторых акций. Для этого я оценил линейную модель с данными за 250 дней до события. Фирменный характер c Риск - это дисперсия остатков линейной модели.
Однако мой код не работает должным образом. Возникает следующая ошибка: «Ошибка в as.Date.default (x, ...): не знаю, как преобразовать« x »в класс« Дата »
Я не могу найти решение, чтобы решить эту проблему» Надеюсь, у кого-то есть решение.
Примечание. В коде используется фрейм данных с ежедневными факторами Fama и French. Ян Гоу предоставляет код [здесь] [1].
require(quantmod)
require(zoo)
# get data and find risk
ticker <- c("AAPL", "MSFT")
prices <- lapply(ticker, getSymbols, auto.assign=FALSE, from="2000-01-01")
my.ret <- function(x) {
y <- dailyReturn(x, type="log")
names(y) <- strsplit(names(x)[1], "\\.")[[1]][1]
y
}
df <- lapply(prices, my.ret)
df <- merge(Reduce(merge, df), read.zoo(ff_daily_factors), all=FALSE)
# data frame
Tickers <- c("MSFT", "AAPL", "AAPL", "MSFT", "MSFT", "MSFT", "MSFT")
dates <- c("2003-03-04", "2004-12-01", "2002-12-03", "2008-02-08", "2003-10-10", "2005-12-12", "2003-11-14")
# my function to calculate the idiosyncratic risk
my.Risk <- function(x, tic, day) {
x$exret <- x[, tic] - x[, "rf"]
est.beg <- as.Date(day) - 251
est.end <- as.Date(day) - 1
model <- lm(exret ~ mktrf + smb + hml, data=window(x, start=est.beg, end=est.end))
pred.beg <- as.Date(day) - 0
pred.end <- as.Date(day) + 0
is.risk <- var(residuals(model))
is.risk <- zoo(is.risk, order.by=as.Date(names(is.risk)))
x <- merge(x, is.risk)
}
Risks <- Reduce(merge, mapply(my.Risk, tic=Tickers, day=dates, MoreArgs=list(x=risk), SIMPLIFY=FALSE))
names(Risks) <- paste0(Tickers, dates)
df <- merge(df, Risks)```
[1]: https://iangow.wordpress.com/2011/08/07/r-code-to-fetch-fama-french-factor-data/