context("Testing tq_mutate()")
#### Setup ----
AAPL <- tq_get("AAPL", get = "stock.prices", from = "2010-01-01", to = "2015-01-01")
if (nrow(AAPL) == 0) {
skip("Could not load AAPL")
}
# Test 1: tq_mutate piping test
test1 <- AAPL %>%
tq_mutate(close, MACD) %>%
tq_mutate(high:close, BBands) %>%
tq_mutate(open:close, OpCl)
# Test 1.1: tq_mutate piping test; test renaming of column names on mutate
test1.1 <- AAPL %>%
tq_mutate(close, rollapply, width = 7, FUN = mean) %>%
tq_mutate(open, SMA, n = 3) %>%
tq_mutate(close, rollapply, width = 9, FUN = mean) %>%
tq_mutate(open, SMA, n = 5) %>%
tq_mutate(high:close, BBands, n = 20) %>%
tq_mutate(high:close, BBands, n = 50)
test1.1_names <- c("symbol", "date", "open", "high", "low", "close", "volume", "adjusted",
"rollapply", "SMA", "rollapply..1", "SMA..1", "dn", "mavg",
"up", "pctB", "dn..1", "mavg..1", "up..1", "pctB..1")
# Test 1.2: Grouped_df test
grouped_df <- dplyr::tibble(symbol = c("META", "AMZN")) %>%
tq_get(
get = "stock.prices",
from = "2015-01-01",
to = "2016-01-01"
) %>%
dplyr::group_by(symbol)
test1.2a <- dplyr::mutate(grouped_df, V1 = runSD(adjusted))
test1.2b <- tq_mutate(grouped_df, adjusted, runSD, col_rename = "V1")
# Test 2: tq_mutate_xy piping test
test2 <- AAPL %>%
tq_mutate_xy(x = close, mutate_fun = MACD) %>%
tq_mutate_xy(x = open, y = close, mutate_fun = Delt, k = 1:4)
# Test 3: Bind hourly xts data
time_index <- seq(from = as.POSIXct("2012-05-15 07:00"),
to = as.POSIXct("2012-05-17 18:00"),
by = "hour")
set.seed(1)
value <- rnorm(n = length(time_index))
hourly_data <- xts(value, order.by = time_index)
test3 <- hourly_data %>%
timetk::tk_tbl(preserve_index = T, silent = T) %>%
tq_mutate_xy(x = value, mutate_fun = MACD)
# Test 4: Bind hourly data with tq_mutate_xy
test4 <- dplyr::tibble(time_index, value) %>%
tq_mutate_xy(x = value, mutate_fun = MACD)
# Test 5:
test5 <- c("AAPL", "META") %>%
tq_get(from = "2016-01-01",
to = "2017-01-01") %>%
dplyr::group_by(symbol)
my_lm_fun <- function(data) {
coef(lm(close ~ open, data = as.data.frame(data)))
}
test5 <- test5 %>%
tq_mutate(mutate_fun = rollapply,
width = 90,
FUN = my_lm_fun,
by.column = FALSE,
col_rename = c("coef.0", "coef.1"))
#### Tests ----
test_that("Test 1 returns tibble with correct rows and columns.", {
# Tibble
expect_s3_class(test1, "tbl_df")
# Rows
expect_equal(nrow(test1), 1258)
# Columns
expect_equal(ncol(test1), 15)
})
test_that("Test 1.1 returns correct column names", {
# Column names
expect_equal(colnames(test1.1), test1.1_names)
})
test_that("Test 1.2 grouped data frames are same with mutate and tq_mutate", {
expect_equal(test1.2a, test1.2b)
})
test_that("Test 2 returns tibble with correct rows and columns.", {
# Tibble
expect_is(test2, "tbl")
# Rows
expect_equal(nrow(test2), 1258)
# Columns
expect_equal(ncol(test2), 14)
})
test_that("Test 3 returns tibble with correct rows and columns.", {
# Tibble
expect_is(test3, "tbl")
# Rows
expect_equal(nrow(test3), 60)
# Columns
expect_equal(ncol(test3), 4)
})
test_that("Test 5 returns tibble with correct rows and columns.", {
# Tibble
expect_is(test5, "tbl")
# Rows
expect_equal(nrow(test5), 504)
# Columns
expect_equal(ncol(test5), 10)
})
# Incompatible structure: trying to mutate different periodicities.
test_that("Test error on incompatible structures.", {
expect_error(
AAPL %>%
tq_mutate(select = NULL, mutate_fun = to.period, period = "months"),
"Could not join. Incompatible structures."
)
expect_error(
AAPL %>%
tq_mutate_xy(x = close, mutate_fun = to.period, period = "months"),
"Could not join. Incompatible structures."
)
})
# Invalid data inputs
test_that("Test error on invalid data inputs.", {
# Non-data.frame objects
a <- seq(1:100)
expect_error(
seq(1:100) %>%
tq_mutate(select = NULL, mutate_fun = to.monthly)
)
expect_error(
seq(1:100) %>%
tq_mutate_xy(x = a, mutate_fun = to.monthly)
)
# No date columns
expect_error(
dplyr::tibble(a = seq(1:100)) %>%
tq_mutate(select = NULL, mutate_fun = to.monthly),
"No date or POSIXct column found in `data`."
)
expect_error(
dplyr::tibble(a = seq(1:100)) %>%
tq_mutate_xy(x = a, mutate_fun = to.monthly),
"No date or POSIXct column found in `data`."
)
})
# Invalid select, x and y inputs
test_that("Test error on invalid select, x and y inputs.", {
expect_error(
{select <- "err"
AAPL %>%
tq_mutate_(select = select, mutate_fun = "to.monthly")}
)
expect_error(
{x <- "err"
AAPL %>%
tq_mutate_xy_(x = x, y = "close", mutate_fun = "Delt", k = 1)},
paste0("x = err not a valid name.")
)
expect_error(
{y <- "err"
AAPL %>%
tq_mutate_xy_(x = "open", y = y, mutate_fun = "Delt", k = 1)},
paste0("y = err not a valid name.")
)
})
# Invalid mutate_fun, x and y inputs
test_that("Test error on invalid mutate_fun, x and y inputs.", {
expect_error(
{mutate_fun <- "err"
AAPL %>%
tq_mutate_(select = "close", mutate_fun = mutate_fun)},
paste0("fun = err not a valid option.")
)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.