Я довольно новичок в кодировании и пытаюсь выбрать r.Я запускаю бэк-тест в quantstrat
.Я смотрел на гайки и болты онлайн, и это помогло мне очистить мой код, но я также пытаюсь создать пользовательские функции, и именно здесь начинается проблема.Я следую иерархии правил> сигнал> индикатора и знаю, что проблема заключается в комбинации индикатора и некоторых пользовательских данных, которые я пытаюсь добавить в mktdata
.Я добавляю дополнительный столбец, импортированный из Excel, в формате xls следующим образом:
>PEDATA <- readxl::read_xls()
>headers <- c("Date","PEValues","lowpeindicator","highpeindicator","inpe")
>names(PEDATA) <- c(headers)
>mktdata$PEValues <- PEDATA$PEValues
>head(mktdata)
Я знаю, что данные добавляются правильно, когда я смотрю на функцию head
.Затем я продолжаю создавать свои собственные индикаторы, где я просто адаптирую функции add.indicator
и SMA
.
>add.indicator(strategy.name, name = "SMA", arguments =
list(x=quote(PEValues(mktdata)), n = PEs), label = SMA1)
С этого момента все проходит до конца.Как только я пытаюсь применить стратегию, я получаю следующее:
> applyStrategy(strategy = strategy.name, portfolios = portfolio.name)
Error in `colnames<-`(`*tmp*`, value = seq(ncol(tmp_val))) :
attempt to set 'colnames' on an object with less than two dimensions
Я запустил traceback
и получаю следующее:
4: stop ("попытка установить'colnames' для объекта с менее чем двумя измерениями ") 3: colnames<-
(*tmp*
, value = seq (ncol (tmp_val))) 2: applyIndicators (стратегии = стратегия, mktdata = mktdata, параметры = параметры,...) 1: applyStrategy (стратегии = название стратегии, портфолио = имя портфеля)
Чтобы получить PEValues
, чтобы вытащить что-то, я сделал это:
>has.PEValues<- function (x, which = FALSE)
>{
> colAttr <- attr(x, "PEValues")
> if (!is.null(colAttr))
> return(if (which) colAttr else TRUE)
> loc <- grep("PEValues", colnames(x), ignore.case = TRUE)
> if (!identical(loc, integer(0))) {
> return(if (which) loc else TRUE)
> }
> else FALSE
> }
>
>
>
> PEValues<- function (x)
> {
> if (has.inpe(x))
> return(x[, grep("PEValues", colnames(x), ignore.case = TRUE)])
> stop("subscript out of bounds: no column name containing
>\"PEValues\"")
> }
ВНа этом этапе я, честно говоря, понятия не имею, что делать, и многие форумы все еще за мной.Буду очень признателен за любую помощь, и я буду более чем рад ответить на любые вопросы.
В соответствии с запросом, образцы данных с использованием dput(head(mktdata)
> dput(head(mktdata))
>structure(c(44.2187, 44.4062, 44.9687, 44.9687, 44.9687, 44.8125,
>44.375, 44.8437, 45.0937, 45.0625, 45.125, 44.8125, 44.125, 44.375,
>44.4687, 44.7187, 44.9062, 44.5625, 44.3437, 44.8125, 45, 44.9687,
>44.9687, 44.6562, 201300, 529400, 531500, 492100, 596100, 122100,
>27.362904, 27.652185, 27.767893, 27.748577, 27.748577, 27.555738,
>NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
>NA, NA, NA, NA, NA, NA, NA, NA, 22.55, 22.55, 22.55, 22.55, 22.55,
>22.55, 1, 1, 1, 1, 1, 1), class = c("xts", "zoo"), .indexCLASS = "Date",
>.indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "yahoo", updated =
>structure(1544551441.04075, class = c("POSIXct",
>"POSIXt")), index = structure(c(728611200, 728697600, 728784000,
>728870400, 729129600, 729216000), tzone = "UTC", tclass = "Date"), .Dim =
>c(6L,12L), .Dimnames = list(NULL, c("SPY.Open", "SPY.High", "SPY.Low",
>"SPY.Close", "SPY.Volume", "SPY.Adjusted", "SMA.SMA150", "SMA.SMA50",
>"opensma", "closesma", "PEValues", "inpe")))
head(mktdata)
> head(mktdata)
> SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted
>SMA.SMA150 SMA.SMA50 opensma closesma PEValues inpe
>1993-02-02 44.2187 44.3750 44.1250 44.3437 201300 27.36290
>NA NA NA NA 22.55 1
>1993-02-03 44.4062 44.8437 44.3750 44.8125 529400 27.65218
>NA NA NA NA 22.55 1
>1993-02-04 44.9687 45.0937 44.4687 45.0000 531500 27.76789
>NA NA NA NA 22.55 1
>1993-02-05 44.9687 45.0625 44.7187 44.9687 492100 27.74858
>NA NA NA NA 22.55 1
>1993-02-08 44.9687 45.1250 44.9062 44.9687 596100 27.74858
>NA NA NA NA 22.55 1
>1993-02-09 44.8125 44.8125 44.5625 44.6562 122100 27.55574
>NA NA NA NA 22.55 1