首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quantstrat applyStrategy故障

Quantstrat applyStrategy故障
EN

Stack Overflow用户
提问于 2017-05-13 23:48:50
回答 1查看 491关注 0票数 0

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

代码语言:javascript
复制
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)
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

发布于 2017-05-14 02:06:09

以下是你的问题:

1)为了保持一致,您的initDate应该是第3行的initdate。2)回车类型规则不要使用orderqty = "all"。使用实际数量。请参阅下面的条目添加规则。以下是您可能打算如何运行代码的详细信息。一般来说,对于退出/停止/获利类型规则,请使用orderqty = "all"。"all“是指当你想要出脱现有头寸的时候,而不是指定当时的头寸可能是什么(你可能事先不知道你是不是在将交易金字塔聚合成所需的风险敞口)

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

4)您没有为SPY定义仪器对象。例如,您发布的代码缺少stock("SPY", currency = "USD")

5)你的代码不能按原样重现。像这样的调用:

代码语言:javascript
复制
test4 <- applyIndicators(strategy = strategy.st, mktdata)

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

代码的这种经过编辑的形式可以工作:

代码语言:javascript
复制
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会话,然后通过运行源代码来检查它。上面列出的许多问题,你可以通过在一个新的clean R会话中运行你的源代码来发现。(如果你使用Rstudio,这可以通过使用快捷键ctrl + shift +f10轻松完成)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43955029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档