【问题标题】:Quantstrat applyStrategy failureQuantstrat applyStrategy 失败
【发布时间】:2017-05-13 15:48:49
【问题描述】:

我正在使用 quantstart,但由于某种原因,applyStrategy 函数没有输出任何信息。它只是通过。结果,当我执行tradeStats 函数时,我得到了null。这是我使用的代码:谢谢!

library(quantstrat)
library(quantmod)
initDate = "1999-01-01"
from = "2003-01-01"
to = "2015-12-31"

Sys.setenv (TZ = "UTC")
currency ("USD")
getSymbols ("SPY", from = from,
 to = to, src = "yahoo",
 adjust = TRUE)

tradesize <- 100000
initeq <- 100000
strategy.st <- portfolio.st <- account.st <- "firststrat"
rm.strat(strategy.st)
initPortf(portfolio.st,
 symbols = "SPY",
 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 = "SMA",
 arguments = list(x = quote(Cl(mktdata)), n = 200),
 label = "SMA200")

add.indicator(strategy = strategy.st,
 name = "SMA",
 arguments = list(x = quote(Cl(mktdata)), n = 50),
 label = "SMA50")

test4 <- applyIndicators(strategy = strategy.st, mktdata) 

add.signal(strategy.st,
 name = "sigCrossover",
 arguments = list(columns = c("SMA50", "SMA200"),
 relationship = "gt"),
 label = "longfilter")

add.signal(strategy.st,
 name = "sigComparison",
 arguments = list(columns = c("SMA50", "SMA200"),
 relationship = "lt" ),
 label = "filterexit")

test4 <- applySignals(strategy.st, mktdata)

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

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



applyStrategy(strategy.st, portfolio.st)

updatePortf(portfolio.st)
daterange <- time(getPortfolio(portfolio.st)$summary)[-1]

updateAcct(account.st, daterange)
updateEndEq(account.st)

tradeStats(Portfolios = portfolio.st)

```

【问题讨论】:

    标签: r quantstrat


    【解决方案1】:

    这是你的问题:

    1) 您的 initDate 应该是第 3 行的 initdate 以保持一致。 2) 不要将orderqty = "all" 用于“输入”类型规则。使用实际数量。请参阅下面的条目添加规则。下面了解您可能打算如何运行代码。作为一般规则,使用orderqty = "all" 退出/停止/获利类型规则。 “全部”适用于您想要退出现有头寸的情况,而无需指定当时该头寸可能是什么(您可能事先不知道您是否正在将交易金字塔化到所需的风险敞口)

    3) 如果您在对getSymbols 的调用中没有如下设置index.class 参数,您可能会遇到另一个与datePOSIXct 对象比较相关的错误

    4) 您没有为SPY 定义仪器对象。即您发布的代码丢失了stock("SPY", currency = "USD")

    5) 您的代码无法按原样重现。像这样的调用:

    test4 <- applyIndicators(strategy = strategy.st, mktdata)
    

    只有在你获得了 marketdata 对象(在调用 applyStrategy 后存在)之后才能工作。

    您的代码的这种编辑形式有效:

    library(quantstrat)
    library(quantmod)
    initdate = "1999-01-01"
    from = "2003-01-01"
    to = "2015-12-31"
    
    currency ("USD")
    stock("SPY", currency = "USD")
    
    Sys.setenv (TZ = "UTC")
    
    getSymbols ("SPY", from = from,
                to = to, src = "yahoo",
                adjust = TRUE,
                index.class=c("POSIXt","POSIXct"))
    
    tradesize <- 100000
    initeq <- 100000
    strategy.st <- portfolio.st <- account.st <- "firststrat"
    rm.strat(strategy.st)
    initPortf(portfolio.st,
              symbols = "SPY",
              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 = "SMA",
                  arguments = list(x = quote(Cl(mktdata)), n = 200),
                  label = "SMA200")
    
    add.indicator(strategy = strategy.st,
                  name = "SMA",
                  arguments = list(x = quote(Cl(mktdata)), n = 50),
                  label = "SMA50")
    
    add.signal(strategy.st,
               name = "sigCrossover",
               arguments = list(columns = c("SMA50", "SMA200"),
                                relationship = "gt"),
               label = "longfilter")
    
    add.signal(strategy.st,
               name = "sigComparison",
               arguments = list(columns = c("SMA50", "SMA200"),
                                relationship = "lt" ),
               label = "filterexit")
    
    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "filterexit", sigval = TRUE,
                              orderqty = "all", ordertype = "market",
                              orderside = "long", replace = FALSE,
                              prefer = "Open"),
             type = "exit")
    
    add.rule(strategy.st, name = "ruleSignal",
             arguments = list(sigcol = "longfilter", sigval = TRUE,
                              orderqty = tradesize, ordertype = "market",
                              orderside = "long", replace = FALSE,
                              prefer = "Open"),
             type = "enter")
    
    
    
    applyStrategy(strategy.st, portfolio.st)
    
    updatePortf(portfolio.st)
    daterange <- time(getPortfolio(portfolio.st)$summary)[-1]
    
    updateAcct(account.st, daterange)
    updateEndEq(account.st)
    
    tradeStats(Portfolios = portfolio.st)
    

    最后的提示。在运行您希望可重现的代码之前重新启动一个干净的 r 会话,然后通过运行源来检查它。我在上面列出的许多问题都可以通过在新的干净 R 会话中运行源代码来发现。 (如果您使用 Rstudio,可以使用快捷键 ctrl + shift + f10 轻松完成)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多