У меня есть код построения портфеля R, который использует ежедневные скорректированные данные о ценах закрытия от Yahoo. У меня были проблемы со значениями NA, но код уже некоторое время работает. До этих выходных (например, 28 февраля 2015 г.).
Прямо сейчас источник данных yahoo, кажется, полностью сломан, когда я использую функцию tseries get.hist.quote (). Под «сломанным» я подразумеваю, что он не будет правильно возвращать данные для VTV и ряда других ETF. Я не знаю, не работает ли источник временных рядов Yahoo или что-то в этом роде.
Было сообщение (https://stackoverflow.com/a/3507948/2341077), в котором предлагалось изменить URL-адрес в get.hist.quote () с chart.yahoo.com на ichart.yahoo.com решит проблему. Но для меня это ничего не изменило. Еще я убедился, что у меня установлена последняя версия tseries.
Были ли у кого-нибудь еще проблемы с временными рядами близких цен от Yahoo? Мне было интересно, стоит ли мне изменить свой код, чтобы использовать функцию qualmod getSymbols, которая, по-видимому, может использовать финансы Google в качестве источника данных.
Приведенный ниже код написан для чтения сотен символов ETF и возврата матрицы, содержащей данные временных рядов ETF. Предпринята попытка выровнять данные по дате.
Даже когда казалось, что Yahoo предоставляет данные, все еще отсутствовали значения, для решения которых и предназначена функция fillHoles ().
<pre>
#
# Fill "NA" holes in the time series.
#
fillHoles = function(ts.zoo) {
v_approx = na.approx(ts.zoo, maxgap=4, na.rm=FALSE)
v_fill = na.fill(v_approx, fill="extend")
return( v_fill)
}
<i>
#
# The yahoo market data has problems (at least when it's fetched with get.hist.quote()) when the compression
# argument is used to fetch weekly adjusted close data.
#
# Two time series are shown below, for VXF and MINT. The weekly boundaries appear on different dates.
#
# VXF
# 2007-04-04 48.55
# 2007-04-09 48.98
# 2007-04-16 49.52 <==
# 2007-04-23 49.70
# 2007-04-30 50.03
# 2007-05-07 50.04 <==
#
# MINT
# 2007-04-04 8.03
# 2007-04-09 8.03
# 2007-04-17 7.88 <==
# 2007-04-23 8.11
# 2007-04-30 8.92
# 2007-05-08 9.14 <==
#
# If the two time series are merged via a cbind NA values
# end up being inserted where the time series don't line up:'
#
# VXF MINT
# 2007-04-04 48.55 8.03
# 2007-04-09 48.98 8.03
# 2007-04-16 49.52 NA
# 2007-04-23 49.70 8.11
# 2007-04-30 50.03 8.92
# 2007-05-07 50.04 NA
#
# To avoid this problem of data alignment, the function fetches daily adjusted close that can then be converted
# into weekly adjusted close.
#
# Given a vector of symbols, this function will fetch the daily adjusted close price data from
# Yahoo. The data is aligned since not all time series will have exactly the same start and end
# dates (although with daily data, as noted above, this should be less of an issue)
#
</i>
getDailyCloseData = function(symbols, startDate, endDate )
{
closeData.z = c()
firstTime = TRUE
minDate = c()
maxDate = c()
fetchedSyms = c()
startDate.ch = as.character( findMarketDate(as.Date(startDate)))
endDate.ch = as.character( findMarketDate(as.Date(endDate)))
for (i in 1:length(symbols)) {
sym = symbols[i]
print(sym)
symClose.z = NULL
timeOut = 1
tsEndDate.ch = endDate.ch
while ((timeOut < 7) && is.null(symClose.z)) {
try(
(symClose.z = get.hist.quote(instrument=sym, start=startDate.ch, end=tsEndDate.ch, quote="AdjClose",
provider="yahoo", compression="d", retclass="zoo", quiet=T)),
silent = TRUE)
tsEndDate.ch = as.character( findMarketDate( (as.Date(tsEndDate.ch) - 1)))
timeOut = timeOut + 1
}
if (! is.null(symClose.z)) {
fetchedSyms = c(fetchedSyms, sym)
dateIx = index(symClose.z)
if (firstTime) {
closeData.z = symClose.z
firstTime = FALSE
minDate = min(dateIx)
maxDate = max(dateIx)
} else {
minDate = max(minDate, min(dateIx))
maxDate = min(maxDate, max(dateIx))
matIx = index(closeData.z)
repeat {
startIx = which(matIx == minDate)
if (length(startIx) > 0 && startIx > 0) {
break()
} else {
minDate = minDate + 1
}
} # repeat
repeat {
endIx = which(matIx == maxDate)
if (length(endIx) > 0 && endIx > 0) {
break()
} else {
maxDate = maxDate - 1
}
}
matIxAdj = matIx[startIx:endIx]
closeData.z = cbind(closeData.z[matIxAdj,], symClose.z[matIxAdj])
}
} # if (! is.null(symClose.z))
} # for
if (length(closeData.z) > 0) {
dateIx = index(closeData.z)
# fill any NA "holes" created by daily date alignment
closeData.mat = apply(closeData.z, 2, FUN=fillHoles)
rownames(closeData.mat) = as.character(dateIx)
colnames(closeData.mat) = fetchedSyms
}
return( closeData.mat )
} # getDailyCloseData
</pre>