可复制代码:
package <- c("compiler",
"quantmod",
"dygraphs",
"plyr",
"devtools",
"PerformanceAnalytics",
"doParallel")
lapply(X = package,
FUN = function(this.package){
if (!require(package = this.package,
character.only = TRUE))
{
install.packages(pkgs = this.package,
repos = "https://cloud.r-project.org")
library(package = this.package,
character.only = TRUE)
} else {
library(package = this.package,
character.only = TRUE)
}
})
install_github("braverock/FinancialInstrument")
install_github("braverock/blotter")
install_github("braverock/quantstrat")
install_github("braverock/PerformanceAnalytics")
require(quantstrat)
# +------------------------------------------------------------------
# | The registerDoParallel() function is used to register the
# | parallel backend with the foreach package. detectCores() attempts
# | to detect the number of CPU cores on the current host.
# +------------------------------------------------------------------
registerDoParallel(detectCores())
# +------------------------------------------------------------------
# | Get data.
# +------------------------------------------------------------------
symbols <- c('SPY', 'TLT', 'GLD')
getSymbols(Symbols = symbols)
# +------------------------------------------------------------------
# | osTotEq() is an order sizing function which should return the
# | maximum amount of purchasable securities as for current equity
# | available (assuming you're not invested at the moment of
# | calculation).
# +------------------------------------------------------------------
osTotEq <- function(timestamp, orderqty, portfolio, symbol, ruletype, ...)
{
if (orderqty == "all" && !(ruletype %in% c("exit", "risk")) ||
orderqty == "trigger" && ruletype != "chain")
{
stop(paste("orderqty 'all'/'trigger' would produce nonsense, maybe use osMaxPos instead?\n",
"Order Details:\n", "Timestamp:", timestamp, "Qty:",
orderqty, "Symbol:", symbol))
}
endEq <- getEndEq(Account = portfolio,
Date = timestamp)
refPrice <- Cl(mktdata[, 1:4])[timestamp, ]
orderqty <- floor(endEq / refPrice)
return(orderqty)
}
# +------------------------------------------------------------------+ #
# +------------------------------------------------------------------+ #
# | Main: William's %R | #
# +------------------------------------------------------------------+ #
# +------------------------------------------------------------------+ #
# +------------------------------------------------------------------
# | Parameters
# +------------------------------------------------------------------
name <- 'WPR'
currency <- 'USD'
initEq <- 300000
# +------------------------------------------------------------------
# | Initialization
# +------------------------------------------------------------------
rm.strat(name = name)
currency(currency)
for (symbol in symbols)
{
stock(primary_id = symbol,
currency = currency,
multiplier = 1)
}
initPortf(name = name,
symbols = symbols,
currency = currency)
initAcct(name = name,
portfolios = name,
initEq = initEq)
initOrders(portfolio = name)
strategy(name = name,
store = TRUE)
# +------------------------------------------------------------------
# | Indicators
# +------------------------------------------------------------------
add.indicator(strategy = name,
name = 'volatility',
arguments = list(OHLC = quote(OHLC(mktdata)),
n = 5,
calc = 'yang.zhang',
N = 1),
label = 'sigma',
store = TRUE)
add.indicator(strategy = name,
name = 'WPR',
arguments = list(HLC = quote(HLC(mktdata)),
n = 14),
label = 'wpr',
store = TRUE)
# +------------------------------------------------------------------
# | Signals
# +------------------------------------------------------------------
add.signal(strategy = name,
name = 'sigThreshold',
arguments = list(column = 'wpr',
threshold = .2,
relationship = 'gt',
cross = TRUE),
label = 'wpr.buy')
add.signal(strategy = name,
name = 'sigThreshold',
arguments = list(column = 'wpr',
threshold = .8,
relationship = 'lt',
cross = TRUE),
label = 'wpr.sell')
# +------------------------------------------------------------------
# | Rules
# +------------------------------------------------------------------
add.rule(strategy = name,
name = 'ruleSignal',
arguments = list(sigcol = 'wpr.buy',
sigval = TRUE,
orderqty = 1,
ordertype = 'market',
orderside = 'long',
osFUN = osTotEq),
type = 'enter',
label = 'wpr.buy.enter',
store = TRUE)
add.rule(strategy = name,
name = 'ruleSignal',
arguments = list(sigcol = 'wpr.buy',
sigval = TRUE,
orderqty = 'all',
ordertype = 'stoplimit',
orderside = 'long',
tmult = TRUE,
threshold = quote(mktdata[timestamp, 'X1.sigma']),
orderset = 'stop.loss'),
parent = 'wpr.buy.enter',
type = 'chain',
label = 'wpr.buy.chain',
store = TRUE)
# add.rule(strategy = name,
# name = 'ruleSignal',
# arguments = list(sigcol = 'wpr.sell',
# sigval = TRUE,
# orderqty = 'all',
# ordertype = 'market',
# orderside = 'long',
# pricemethod = 'market',
# replace = TRUE,
# osFUN = osNoOp),
# path.dep = TRUE,
# type = 'exit',
# label = 'wpr.buy.exit',
# store = TRUE)
# +------------------------------------------------------------------
# | Strategy backtest
# +------------------------------------------------------------------
try(applyStrategy(strategy = name,
portfolios = name))
updatePortf(Portfolio = name,
Dates = paste('::',as.Date(Sys.time()), sep = ''))
updateAcct(name = name)
updateEndEq(Account = name)
# +------------------------------------------------------------------
# | Performance analysis
# +------------------------------------------------------------------
for (symbol in symbols)
{
dev.new()
chart.Posn(Portfolio = name,
Symbol = symbol)
}
dev.new()
R <- PortfReturns(Account = name)
R$total.DailyEqPl <- rowSums(R)
charts.PerformanceSummary(R = R,
ylog = TRUE,
main = "Smoothing spline performance",
geometric = TRUE)
getOrderBook(portfolio = name)为了更好地突出stoplimit订单的使用,我有意对退出规则进行了评论。至于订购单,他们似乎不起作用。这不是我第一次不能使斯托比特订单正常工作。即使我复制演示代码(为了我的目的稍微修改它),有时它不起作用,我也不明白为什么。上面有一个“动态”的stoplimit价格的例子,但是在我的订单中,即使我使用固定的值(比如quote(0.001)),我也没有看到任何stoplimit订单。尽管如此,orderset、parent和type似乎还行。
你能解释一下我错过了什么吗?
这里是我的getOrderBook(portfolio = name)片段
Order.Qty Order.Price Order.Type Order.Side Order.Threshold Order.Status Order.StatusTime Prefer Order.Set Txn.Fees Rule Time.In.Force
2002-08-15 "3487" "86.02" "market" "long" NA "closed" "2002-08-16 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-09-06 "3430" "87.46" "market" "long" NA "closed" "2002-09-09 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-09-25 "3348" "89.58" "market" "long" NA "closed" "2002-09-26 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-10-01 "3373" "88.94" "market" "long" NA "closed" "2002-10-02 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-11-14 "3457" "86.76" "market" "long" NA "closed" "2002-11-15 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-12-13 "3467" "86.53" "market" "long" NA "closed" "2002-12-16 00:00:00" "" NA "0" "wpr.buy.enter" ""
2002-12-31 "3387" "88.57" "market" "long" NA "closed" "2003-01-02 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-01-27 "3422" "87.65" "market" "long" NA "closed" "2003-01-28 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-02-05 "3428" "87.51" "market" "long" NA "closed" "2003-02-06 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-02-10 "3416" "87.8" "market" "long" NA "closed" "2003-02-11 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-02-21 "3397" "88.3" "market" "long" NA "closed" "2003-02-24 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-03-13 "3351" "89.52" "market" "long" NA "closed" "2003-03-14 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-05-02 "3396" "88.32" "market" "long" NA "closed" "2003-05-05 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-05-27 "3187" "94.12" "market" "long" NA "closed" "2003-05-28 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-06-11 "3132" "95.78" "market" "long" NA "closed" "2003-06-12 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-06-16 "3116" "96.26" "market" "long" NA "closed" "2003-06-17 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-09-02 "3655" "82.06" "market" "long" NA "closed" "2003-09-03 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-09-08 "3605" "83.2" "market" "long" NA "closed" "2003-09-09 00:00:00" "" NA "0" "wpr.buy.enter" ""
2003-09-11 "3567" "84.1" "market" "long" NA "closed" "2003-09-12 00:00:00" "" NA "0" "wpr.buy.enter" "" 正如你所看到的,根本就没有斯托普利米的命令。
发布于 2018-05-31 11:21:13
我怀疑您的问题将通过在脚本顶部添加Sys.setenv(TZ ="UTC")来解决(许多日常数据上的quantstrat就是这样做的)。这种情况有时发生在您使用量化器处理日常数据时。
正在发生的事情是,在ruleSignal中,当市场订单被填充时,quantstrat没有正确地得到chain.price,当它找不到连锁价格时,它忽略了造成止损的因素。
如果您很好奇,并想说服自己,请尝试在ruleSignal中设置调试器,在填充stoploss的条件下(您可以创建自己的ruleSignal函数,非常类似于ruleSignal,并在add.rule name参数中为stoplimit规则提供该函数的名称)。
如果您将调试器设置为在第一次填充(在ruleSignal中或在触发chain规则时等效)暂停,您将看到以下内容:
getTxns(portfolio, "SPY")
Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL
1950-01-01 00:00:00 0 0.00 0 0.0 0.00 0
2007-01-25 19:00:00 2108 142.13 0 299610.1 142.13 0要使事情正常工作,第一个txn时间戳应该是2007-01-26。
为stoplimit向chain.price提供给ruleSignal的xts对象是一个空的xts对象,这是因为在quantstrat的函数applyRules中,切换链chain情况下的这些行在日常数据上不能正常工作:
txns <- getTxns(Portfolio=portfolio, Symbol=symbol, Dates=timestamp)
txn.price <- last(txns$Txn.Price)
ruleProc(rules[j], timestamp=timestamp, path.dep=path.dep, mktdata=mktdata, portfolio=portfolio, symbol=symbol, ruletype=type, mktinstr=mktinstr, parameters=list(chain.price=txn.price), curIndex=curIndex)具体来说,parameter参数在ruleProc中并不是传入有效的chain.price。在applyRules中,getTxns提供Dates = timestamp和timestamp = "2007-01-26" (事务在2007-01-26,入口信号是在2007-01-25)之后,在"2007-01-25 19:00:00“之后,因此txns是一个空的xts对象。为什么交易日"2007-01-26“的时间戳为"2007-01-25 19:00:00"?因为在我的R系统环境中,时区对应于纽约时间的UTC午夜。
简而言之,这是一个错误(如果您不为每日数据集将时区设置为UTC ),但是由于quantstrat的作者和大多数严肃的用户可能不使用每日条,所以它可能不是修复的首要任务。在使用具有UTC时间索引(而不是POSIXct类型)的xts对象时,请确保将时区设置为POSIXct。
https://stackoverflow.com/questions/50621791
复制相似问题