【问题标题】:Error attempt to set 'colnames' on an object with less than two dimensions尝试在小于二维的对象上设置“colnames”时出错
【发布时间】:2018-07-14 12:44:35
【问题描述】:

我会尽量说清楚,因为我受到了一些用户的指责。 我删除了最后一个问题,我将尝试在这个问题中充分解释。 如果我将插入的数据不够,我深表歉意。

所以,我正在尝试通过包Quantstrat 运行策略。

install.packages("quantstrat")

我的问题是我收到以下错误:

`Error in `colnames<-`(`*tmp*`, value = seq(ncol(tmp_val))) : 
 attempt to set 'colnames' on an object with less than two dimensions`

当我尝试运行以下命令时:

> out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st)

如果我使用一个或多个已由包TTR 定义的指标作为指标,我不会遇到这个问题。

仅当我尝试使用自定义指标时才会出现此错误。 这是我使用的自定义指标的代码:

 wma <-  WMA(Cl(RUT), n=4, wts=c(1:4))
wmamaxt <-  rollmaxr(wma, n, fill = NA)
wmamint <- - rollmaxr(- wma, n, fill = NA)
CNOwma <- function (RUT) {(wma - wmamint) / (wmamaxt - wmamint)}

请参考以下代码:

    if (!require("TTR")) {
  install.packages("TTR")
  library(TTR)
}
if (!require("quantstrat")) {
  if(!require("devtools")) {
    install.packages("devtools")
    require(devtools)
  }
  install_github("braverock/blotter") # dependency
  install_github("braverock/quantstrat")
}

if (!require("IKTrading")){
  install_github("IlyaKipnis/IKTrading", force=TRUE)
}

library(devtools)
library(quantmod)
library(quantstrat)
library(TTR)
library(png)
library(IKTrading)
install_github("braverock/blotter")
install_github("braverock/quantstrat")
install_github('IlyaKipnis/IKTrading')


initdate <- "2010-01-01"
    from <- "2012-01-01" #start of backtest
    to <- "2017-31-12" #end of backtest

    Sys.setenv(TZ= "EST") #Set up environment for timestamps

    currency("USD") #Set up environment for currency to be used

    symbols <- c("RUT", "IXIC") #symbols used in our backtest
    getSymbols(Symbols = symbols, src = "yahoo", from=from, to=to, adjust = TRUE) #receive data from google finance,  adjusted for splits/dividends

    stock(symbols, currency = "USD", multiplier = 1) #tells quanstrat what instruments present and what currency to use



wma <-  WMA(Cl(RUT), n=4, wts=c(1:4))
wmamaxt <-  rollmaxr(wma, n, fill = NA)
wmamint <- - rollmaxr(- wma, n, fill = NA)
CNOwma <- function (RUT) {(wma - wmamint) / (wmamaxt - wmamint)}

    tradesize <-10000 #default trade size
    initeq <- 100000 #default initial equity in our portfolio

    strategy.st <- portfolio.st <- account.st <- "firststrat" #naming strategy, portfolio and account

    #removes old portfolio and strategy from environment
    rm.strat(portfolio.st)
    rm.strat(strategy.st) 

    #initialize portfolio, account, orders and strategy objects
    initPortf(portfolio.st, symbols = symbols, initDate = initdate, currency = "USD")

    initAcct(account.st, portfolios = portfolio.st, initDate = initdate, currency = "USD", initEq = initeq)

    initOrders(portfolio.st, initDate = initdate)
    strategy(strategy.st, store=TRUE)

    add.indicator(strategy = strategy.st,
                  name = 'CNOwma',
                  arguments = list(x = quote(Cl(mktdata)), n=4),
                  label = 'CNOwma4')





    add.signal(strategy.st, name = "sigThreshold",
               arguments = list(column = "CNOwma4", threshold = 0.6,
                                relationship = "gt", cross = TRUE),
               label = "longthreshold")


    add.signal(strategy.st, name = "sigThreshold",
               arguments = list(column = "CNOwma4", threshold = 0.6,
                                relationship = "lt", cross = TRUE),
               label = "shortthreshold")




    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "longthreshold", sigval = TRUE,
                              orderqty = "all", ordertype = "market",
                              orderside = "long", replace = FALSE,
                              prefer = "Open"),
             type = "enter")


    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "shortthreshold", sigval = TRUE,
                              orderqty = "all", ordertype = "market",
                              orderside = "long", replace = FALSE,
                              prefer = "Open"),
             type = "exit")

    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "shortthreshold", sigval = TRUE,
                              orderqty = "all", ordertype = "market",
                              orderside = "short", replace = FALSE,
                              prefer = "Open"),
             type = "enter")

    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "longthreshold", sigval = TRUE,
                              orderqty = "all", ordertype = "market",
                              orderside = "short", replace = FALSE,
                              prefer = "Open"),
             type = "exit")



    out <- applyStrategy(strategy = strategy.st, portfolios = portfolio.st)

当我运行错误的 traceback() 时,这就是我得到的:

> traceback()
4: stop("attempt to set 'colnames' on an object with less than two dimensions")
3: `colnames<-`(`*tmp*`, value = seq(ncol(tmp_val)))
2: applyIndicators(strategy = strategy, mktdata = mktdata, parameters = parameters, 
       ...)
1: applyStrategy(strategy = strategy.st, portfolios = portfolio.st)

【问题讨论】:

    标签: r debugging quantmod quantstrat


    【解决方案1】:

    很难说出发生了什么,因为您的示例不可重现。首先,你的三个包不是 CRAN 包,所以我们只能猜测你从哪里得到它们。我的猜测如下:

    install_github("braverock/blotter")
    install_github("braverock/quantstrat")
    install_github('IlyaKipnis/IKTrading')
    

    如果我们猜对了,在你的例子的第一行(在加载包之后)你使用一个来自以太的对象:

    wma <-  WMA(Cl(mktdata), 4, wts=c(1:4)) 
    

    那么mktdata 是从哪里来的?

    如果您创建可以由试图帮助您的人运行的示例,您将获得更好的帮助。

    【讨论】:

    • 感谢您的回答。我为这个错误道歉。我纠正了这个问题。我希望代码现在可以重现。你猜我在哪里找到这三个包的猜测是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2021-06-03
    • 2021-08-25
    相关资源
    最近更新 更多