我使用的是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)发布于 2017-05-14 02:06:09
以下是你的问题:
1)为了保持一致,您的initDate应该是第3行的initdate。2)回车类型规则不要使用orderqty = "all"。使用实际数量。请参阅下面的条目添加规则。以下是您可能打算如何运行代码的详细信息。一般来说,对于退出/停止/获利类型规则,请使用orderqty = "all"。"all“是指当你想要出脱现有头寸的时候,而不是指定当时的头寸可能是什么(你可能事先不知道你是不是在将交易金字塔聚合成所需的风险敞口)
3)如果不像下面这样在getSymbols调用中设置index.class参数,您可能会遇到另一个与date和POSIXct对象比较相关的错误
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会话,然后通过运行源代码来检查它。上面列出的许多问题,你可以通过在一个新的clean R会话中运行你的源代码来发现。(如果你使用Rstudio,这可以通过使用快捷键ctrl + shift +f10轻松完成)。
https://stackoverflow.com/questions/43955029
复制相似问题