r - 如何在 quantstrat 中使用 sigPeak() 函数
问题描述
我无法掌握如何sigPeak()
在quantstrat中正确使用。
下面是一个(不工作的)示例。
我添加了一个指标mktdata
:
add.indicator(strategy = name,
name = 'WinDoPar',
arguments = list(x = quote(OHLC(mktdata)),
n = 300,
w = 'run',
fun = RSI_dens),
label = 'pti',
store = TRUE)
它应该产生一个X1.pti
因标签而命名的列,实际上它确实如此。然后我想用sigPeak()
添加一个信号:
add.signal(strategy = name,
name = 'sigPeak',
arguments = list(data = mktdata,
column = 'pti',
direction = 'peak'),
label = 'pti.buy',
store = TRUE)
需要一个额外的参数sigPeak()
,即label
:但是,我不知道如何使用它。因此,当我添加这样的规则并应用该策略时,它会失败:
add.rule(strategy = name,
name = 'ruleSignal',
arguments = list(sigcol = 'pti.buy',
sigval = TRUE,
orderqty = 1,
ordertype = 'market',
orderside = 'long',
replace = TRUE,
osFUN = osTotSize,
acct.name = name,
TxnFees = TxnFees),
label = 'pti.buy.enter',
type = 'enter',
store = TRUE)
抛出的错误:
Error in applyRules(portfolio = portfolio, symbol = symbol, strategy = strategy, :
mktdata does not contain 'sigcol': pti.buy
仔细检查mktdata
revelas,有一列标签如下:pti.buy.peak.sig.pti.buy
,这似乎很奇怪。
那么我应该如何sigPeak()
在指标达到峰值后生成买入信号呢?
解决方案
查看源,sigPeak
当您在基础时间序列中有效地具有“三角形”模式时生成信号,并在“三角形”完成时触发信号。将此信号与其他信号结合使用以生成有意义的交易信号是有意义的(可能使用EMA
等平滑 sigPeak 时间序列以使其更加稳健,并对其采取行动以突破 0 和 1 之间的某个阈值等)
您的错误是告诉您 'pti.buy' 不是mktdata
. 因此,您add.rule
需要将sigcol = "pti.buy"
参数更改为包含您的入场信号的列的名称。听起来应该是这样sigcol = "pti.buy.peak.sig.pti.buy"
,然后事情应该会奏效。
在仔细检查时sigPeak
,看起来列输出的名称sigPeak
采用 [label].peak.sig.[label] whendirection = "peak"
或 [label].valley.sig.[label] when的形式direction = "valley"
(使用direction = "bottom"
current 在sigPeak
,由于里面的开关代码有错误sigPeak
)。不完全直观。
一个简单的使用方法sigPeak
是修改函数并将其作为函数传递给add.signal
. 我在sigPeak2
下面这样做。
这是一个可重复的示例,使用sigPeak
它可能会有所帮助:
library(quantstrat)
strategy.st <- "RSI"
initEq=100000
port.st<-'RSI'
rm.strat(strategy.st)
stratRSI <- strategy(strategy.st, store = TRUE)
add.indicator(strategy = strategy.st, name = "RSI", arguments = list(price = quote(getPrice(mktdata))), label="pti")
sigPeak2 <- function (label, data, column, direction = c("peak", "bottom")) {
if (!is.numeric(column)) {
colNum <- match.names(column, colnames(data))
}
else colNum <- column
direction = direction[1]
switch(direction, peak = {
ret_sig <- Lag(data[, colNum], 2) < Lag(data[, colNum],
1) & Lag(data[, colNum], 1) > data[, colNum]
}, bottom = , valley = {
ret_sig <- Lag(data[, colNum], 2) > Lag(data[, colNum],
1) & Lag(data[, colNum], 1) < data[, colNum]
})
if (!missing(label))
colnames(ret_sig) <- label
return(ret_sig)
}
add.signal(strategy = strategy.st,
name = 'sigPeak',
arguments = list(data = quote(mktdata),
column = 'pti',
direction = 'peak'),
label = 'drop')
add.signal(strategy = strategy.st,
name = 'sigPeak2',
arguments = list(data = quote(mktdata),
column = 'pti',
direction = 'bottom'),
label = 'jump')
add.signal(strategy = strategy.st, name="sigThreshold",
arguments = list(threshold=70, column="pti",relationship="gt", cross= TRUE),
label="RSI.gt.70")
add.signal(strategy = strategy.st, name="sigThreshold",
arguments = list(threshold=60, column="pti",relationship="lt", cross= TRUE),
label="RSI.lt.60")
add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.gt.70 == 1 & jump == 1"),label="enterLong")
add.signal(strategy = strategy.st, name="sigFormula",arguments = list(formula = "RSI.lt.60 == 1 & drop.peak.sig.drop == 1"),label="exitLong")
add.rule(strategy = strategy.st, name='ruleSignal',
arguments = list(sigcol="enterLong",
sigval=TRUE,
orderqty= 100,
TxnFees=0,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='enter', path.dep=TRUE)
add.rule(strategy = strategy.st, name='ruleSignal',
arguments = list(sigcol="exitLong",
sigval=TRUE,
orderqty='all',
TxnFees=0,
ordertype='market',
orderside='long',
pricemethod='market',
replace=FALSE),
type='exit', path.dep=TRUE)
currency("USD")
symbols = c("SPY")
stock.str = symbols
startDate <- "2013-01-01"
getSymbols(stock.str,from=startDate, to= Sys.Date())
for(symbol in symbols){
stock(symbol, currency="USD",multiplier=1)
}
initPortf(port.st, symbols=symbols)
initAcct(port.st, portfolios=port.st, initEq=initEq)
initOrders(portfolio=port.st)
for(symbol in symbols){ addPosLimit(port.st, symbol, timestamp = startDate, maxpos = 1000) }
applyStrategy(strategy=strategy.st, portfolios=port.st)
updatePortf(strategy.st)
updateAcct(strategy.st)
updateEndEq(strategy.st)
chart.Posn(strategy.st, Symbol = 'SPY', Dates = '2000::')
推荐阅读
- ios - Untethered App在启动时立即死机;大多数时候
- android - 通过 fetch 注册和理解 JSON 响应
- java - 从 swagger-codegen v3 为 multipart-form-data 生成的对象为空
- amazon-web-services - 在 Amazon Step Function 中查找数组的长度
- javascript - 在选择日期传播到上个月。(react-datepicker)
- python - Keras 中的 GaussianDropout vs. Dropout vs. GaussianNoise
- android - Android 电视盒 (TX3 mini) 无需连接显示器即可运行应用程序
- python - Python/Anaconda - 运行环境 python 可执行文件与激活环境不同吗?
- python-3.x - 想要使用带有 python3 的 GPS 数据创建时间戳
- authentication - server.HiveServer2:启动特权同步器时出错