Я использую пакет PerformanceAnalytics для анализа некоторых ежемесячных доходов. Графики charts.RollingRegression должны отображать скользящую регрессию за n месяцев по отношению к некоторому контрольному показателю. Данные представляют собой всего 6 серий возвратов с 8 апреля по декабрь 2014 года, которые пытаются регрессировать по отношению к SPY.
indexReturns <- read.table("quantIndices.csv", stringsAsFactors = FALSE, sep = ",", fill = TRUE, row.names = 1, header=TRUE)
hfIndexReturns <- read.table("quantHFIndices.csv", stringsAsFactors = FALSE, sep = ",", fill = TRUE, row.names = 1, header=TRUE)
peerReturns <- read.table("quantPeers.csv", stringsAsFactors = FALSE, sep = ",", fill = TRUE, row.names = 1, header=TRUE)
splits <- as.data.frame(strsplit(rownames(indexReturns), "/"))
rownames(indexReturns) <- unname(sapply(splits, function(x) paste0(x[3], "-", x[1], "-", x[2])))
splits <- as.data.frame(strsplit(rownames(peerReturns), "/"))
rownames(peerReturns) <- unname(sapply(splits, function(x) paste0(x[3], "-", x[1], "-", x[2])))
Ret <- xts(peerReturns, order.by = as.Date(row.names(peerReturns)))
Rb <- xts(indexReturns, order.by = as.Date(row.names(indexReturns)))
charts.RollingRegression(Ret, Rb[,2, drop = FALSE], Rf = 0.001, na.pad = TRUE)
В результате получается следующая диаграмма:
Я бы хотел, чтобы «бессмысленные» первые 12 месяцев были опущены, но документации о том, как это делается, нет, и любое другое изображение этой диаграммы, которое я могу найти, выглядит так:
Глядя на исходник, в основном мясе функции вижу:
for (column.a in 1:columns.a) {
for (column.b in 1:columns.b) {
merged.assets = merge(Ra.excess[, column.a, drop = FALSE],
Rb.excess[, column.b, drop = FALSE])
if (attribute == "Alpha")
column.result = rollapply(na.omit(merged.assets),
width = width, FUN = function(x) lm(x[, 1,
drop = FALSE] ~ x[, 2, drop = FALSE])$coefficients[1],
by = 1, by.column = FALSE, fill = na.pad, align = "right")
if (attribute == "Beta")
column.result = rollapply(na.omit(merged.assets),
width = width, FUN = function(x) lm(x[, 1,
drop = FALSE] ~ x[, 2, drop = FALSE])$coefficients[2],
by = 1, by.column = FALSE, fill = na.pad, align = "right")
if (attribute == "R-Squared")
column.result = rollapply(na.omit(merged.assets),
width = width, FUN = function(x) summary(lm(x[,
1, drop = FALSE] ~ x[, 2, drop = FALSE]))$r.squared,
by = 1, by.column = FALSE, align = "right")
column.result.tmp = xts(column.result)
colnames(column.result.tmp) = paste(columnnames.a[column.a],
columnnames.b[column.b], sep = " to ")
column.result = xts(column.result.tmp, order.by = time(column.result))
if (column.a == 1 & column.b == 1)
Result.calc = column.result
else Result.calc = merge(Result.calc, column.result)
}
}
И мы видим, что в последнюю функцию «R-Squared» не передается na.pad, что приводит к графику, который я ожидал увидеть для первых двух графиков. Я хотел бы это исправить, но не могу редактировать код пакета. Я пытался использовать «assignInNamespace», но это не сработало. Функция вроде работает, но код функции в пакете не меняется. Я также хотел бы удалить начальное пустое пространство на графиках, но если вы, ребята, могли бы сообщить мне, как это изменить, или знаете какие-либо обходные пути, пожалуйста, дайте мне знать. (И спасибо! Вы, ребята, боги!)
ОЙ! И PS - Почему, черт возьми, моя версия пакета кажется единственной, в которой есть эта проблема??? Почему мои графики по умолчанию выглядят неправильно?
РЕДАКТИРОВАТЬ: Это не единственный подозрительный фрагмент кода из этого пакета. У меня постоянно что-то ломается и не работает, как это, кажется, задокументировано (Error in R[, nc] - coredata(Rf) : non-numeric argument to binary operator
, кажется, происходит с каждым другим вызовом функции). У кого-нибудь есть какие-либо предложения по лучшим пакетам для этого типа вещей?