Eric Berger
2017-Oct-18 14:54 UTC
[R] Problem with tq_mutate_xy() from the tidyquant package
I was able to reproduce the problem with this self-contained example. Maybe
it could be reproduced with an even smaller one ...
library(tidyquant) # Loads tidyverse, tidyquant, financial pkgs, xts/zoo
library(xts)
dtV <- as.Date("2017-01-01") + 1:100
locL <- list( foo=xts(rnorm(100), order.by=dtV), bar=xts(rnorm(100),
order.by=dtV) )
fullXts <- do.call(merge,locL)
smallXts <- fullXts["2017-02-01::"]
rolling_corrOnePair <- function( aXts, col1, col2, window ) { #window window
size in days
tbl <- timetk::tk_tbl( aXts[,c(col1,col2)], rename_index="date"
)
colnames(tbl) <- c("date","x","y")
naV <- sapply(1:nrow(tbl), function(i) any(is.na(tbl[i,])) )
tbl <- tbl[!naV,]# remove any rows with NAs
tq_mutate_xy( data=tbl, x = x, y = y, mutate_fun=runCor,
n = window, use="all.obs", # runCor args
col_rename = "rolling_corr" ) # tq_mutate args
}
foo <- rolling_corrOnePair( aXts=smallXts, col1="foo",
col2="bar",
window=30 )
## This produces the error
# Error in runCov(x, y, n, use = use, sample = sample, cumulative ) :
# n = 30 is outside valid range: [1, 1]
Thanks for any help,
Eric
[[alternative HTML version deleted]]
Joshua Ulrich
2017-Oct-28 13:51 UTC
[R] Problem with tq_mutate_xy() from the tidyquant package
On Wed, Oct 18, 2017 at 9:54 AM, Eric Berger <ericjberger at gmail.com> wrote:> I was able to reproduce the problem with this self-contained example. Maybe > it could be reproduced with an even smaller one ... >Thanks for the reproducible example.> > library(tidyquant) # Loads tidyverse, tidyquant, financial pkgs, xts/zoo > library(xts) > > dtV <- as.Date("2017-01-01") + 1:100 > locL <- list( foo=xts(rnorm(100), order.by=dtV), bar=xts(rnorm(100), > order.by=dtV) ) > fullXts <- do.call(merge,locL) > smallXts <- fullXts["2017-02-01::"] > > rolling_corrOnePair <- function( aXts, col1, col2, window ) { #window > window size in days > tbl <- timetk::tk_tbl( aXts[,c(col1,col2)], rename_index="date" ) > colnames(tbl) <- c("date","x","y") > naV <- sapply(1:nrow(tbl), function(i) any(is.na(tbl[i,])) ) > tbl <- tbl[!naV,]# remove any rows with NAs > tq_mutate_xy( data=tbl, x = x, y = y, mutate_fun=runCor, > n = window, use="all.obs", # runCor args > col_rename = "rolling_corr" ) # tq_mutate args > } > > foo <- rolling_corrOnePair( aXts=smallXts, col1="foo", col2="bar", > window=30 ) > > ## This produces the error > # Error in runCov(x, y, n, use = use, sample = sample, cumulative ) : > # n = 30 is outside valid range: [1, 1] >The error says that n=1 is only valid value for 'n' in the call to TTR::runCov(), and you have n=30. TTR::runCor() will throw that error when there aren't enough observations for a n-period rolling calculation. I have no idea why that happens though, because the simple case below works. corr <- TTR::runCor(fullXts$foo, fullXts$bar, n = 30) # this is fine So the problem must be something in your function or in the other packages you're using.> Thanks for any help, > > Eric > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Joshua Ulrich | about.me/joshuaulrich FOSS Trading | www.fosstrading.com R/Finance 2017 | www.rinfinance.com