ロングとショートの両方を行う戦略があり、addPosLimit()
機能を に設定した場合maxpos=1 and minpos=-1
でも、複数のロング ポジションと 1 つのショート ポジションが必要です。しかし、戦略をロングのみ、またはショートのみにすると、期待どおりに機能します。
この例の基本的な戦略を作成しました。3 つの移動平均があります。1 つの長期 SMA はロング/ショート バイアス フィルターとして機能し、2 つの短期 SMA はロング バイアスがあるときにロングになるクロス アップとして機能し、ショート バイアスがあるときにショートにクロス ダウンします。取引が開始されると、一定の距離に利益目標とストップロスが設定されます。
これが戦略です。
require(quantstrat)
require(IKTrading)
symbols <- "mySymbol"
options("getSymbols.warning4.0"=FALSE)
rm(list=ls(.blotter), envir=.blotter)
currency('USD')
Sys.setenv(TZ="UTC")
stock(symbols, currency="USD", multiplier=1)
initDate="1980-01-01"
tradeSize <- 1000
initEq <- tradeSize*length(symbols)
account.st <- 0
strategy.st <- portfolio.st <- account.st <- "smatest"
rm.strat(portfolio.st)
rm.strat(strategy.st)
initPortf(portfolio.st, symbols=symbols, 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)
addPosLimit(portfolio.st, symbols, timestamp=initDate, maxpos=1, minpos=-1)
nSMAquick = 15
nSMAslow = 30
nSMAbias= 300
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAquick), label="quickMA")
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAslow), label="slowMA")
add.indicator(strategy.st, name = "SMA", arguments=list(x=quote(mktdata$Close), n=nSMAbias), label="bias")
add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"),
relationship="gt"), label="smaup")
add.signal(strategy.st, name = "sigCrossover", arguments = list(columns=c("quickMA", "slowMA"),
relationship="lt"), label="smadown")
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"),
relationship="gt"), label="biasup")
#
add.signal(strategy.st, name = "sigComparison", arguments = list(columns=c("Close", "bias"),
relationship="lt"), label="biasdown")
add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smaup", "biasup"), cross=F),
label="longentry")
add.signal(strategy.st, name="sigAND", arguments=list(columns=c("smadown", "biasdown"), cross=F),
label="shortEntry")
#enter rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="longentry",
sigval=TRUE,
ordertype="market",
orderside="long",
replace=FALSE,
prefer="Open",
orderqty=1,
orderset="orderslong",
osFUN=osMaxPos),
type="enter",path.dep=TRUE,label="long")
#
#take profit
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry",
sigval=TRUE,
ordertype="limit",
orderside="long",
replace=FALSE,
orderqty=-1,
threshold=quote(.75),
orderset="orderslong"),
type="chain",
parent="long",
label="takeProfitLong",
path.dep=TRUE)
#stop loss
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="longentry",
sigval=TRUE,
ordertype="stoplimit",
orderside="long",
replace=FALSE,
orderqty=-1,
threshold=quote(.25),
orderset="orderslong"),
type="chain",
parent="long",
label="stopLossLong",
path.dep=TRUE)
#
# ###########
# #short rule
add.rule(strategy.st, name = "ruleSignal", arguments = list(sigcol="shortEntry",
sigval=TRUE,
ordertype="market",
orderside="short",
replace=FALSE,
prefer="Open",
orderqty=-1,
orderset="ordersshort",
osFUN=osMaxPos),
type="enter",path.dep=TRUE,label="short")
#
#take profit
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry",
sigval=TRUE,
ordertype="limit",
orderside="short",
replace=FALSE,
orderqty=1,
threshold=quote(.75),
orderset="ordersshort"),
type="chain",
parent="short",
label="takeProfitShort",
path.dep=TRUE)
#stop loss
add.rule(strategy.st, name="ruleSignal", arguments=list(sigcol="shortEntry",
sigval=TRUE,
ordertype="stoplimit",
orderside="short",
replace=FALSE,
orderqty=1,
threshold=quote(.25),
orderset="ordersshort"),
type="chain",
parent="short",
label="stopLossShort",
path.dep=TRUE)
#apply strategy
t1 <- Sys.time()
out2 <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st )
これは、取引の出力のサンプルです。
[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51"
[1] "2015-08-04 14:43:00 mySymbol -1 @ 45.87"
[1] "2015-08-04 14:44:00 mySymbol 1 @ 45.96"
[1] "2015-08-04 15:00:00 mySymbol 1 @ 46.12"
[1] "2015-08-04 15:22:00 mySymbol -1 @ 46.15"
[1] "2015-08-04 16:41:00 mySymbol -1 @ 45.96"
[1] "2015-08-04 17:00:00 mySymbol 1 @ 46.03"
[1] "2015-08-04 17:12:00 mySymbol -1 @ 45.91"
[1] "2015-08-04 17:36:00 mySymbol -1 @ 45.86"
[1] "2015-08-04 17:42:00 mySymbol -1 @ 45.78"
[1] "2015-08-04 19:09:00 mySymbol 1 @ 45.79"
[1] "2015-08-04 20:33:00 mySymbol 1 @ 45.95"
[1] "2015-08-04 20:34:00 mySymbol 1 @ 46.04"
> transactions <- getTxns(Portfolio=portfolio.st, symbols)
> transactions
Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost Net.Txn.Realized.PL
1980-01-01 00:00:00 0 0.00 0 0.00 0.00 0.00
2015-08-04 05:23:00 1 45.51 0 45.51 45.51 0.00
2015-08-04 14:43:00 -1 45.87 0 -45.87 45.87 0.36
2015-08-04 14:44:00 1 45.96 0 45.96 45.96 0.00
2015-08-04 15:00:00 1 46.12 0 46.12 46.12 0.00
2015-08-04 15:22:00 -1 46.15 0 -46.15 46.15 0.11
2015-08-04 16:41:00 -1 45.96 0 -45.96 45.96 -0.08
2015-08-04 17:00:00 1 46.03 0 46.03 46.03 0.00
2015-08-04 17:12:00 -1 45.91 0 -45.91 45.91 -0.12
2015-08-04 17:36:00 -1 45.86 0 -45.86 45.86 0.00
2015-08-04 17:42:00 -1 45.78 0 -45.78 45.78 0.00
2015-08-04 19:09:00 1 45.79 0 45.79 45.79 0.03
2015-08-04 20:33:00 1 45.95 0 45.95 45.95 -0.13
2015-08-04 20:34:00 1 46.04 0 46.04 46.04 0.00
戦略をロングにして、利益目標に到達するかストップアウトするか、またはショートシグナルが与えられたときに注文をクローズするか、またはその逆を行います。
すべての短いサイド コードをコメント アウトすると、期待どおりに動作するようです。ショートサイドをコメントアウトした場合の取引例です。
[1] "2015-08-04 05:23:00 mySymbol 1 @ 45.51"
[1] "2015-08-05 06:24:00 mySymbol -1 @ 46.26"
[1] "2015-08-05 07:35:00 mySymbol 1 @ 46.24"
[1] "2015-08-05 08:31:00 mySymbol -1 @ 45.99"
[1] "2015-08-05 12:01:00 mySymbol 1 @ 46.03"
[1] "2015-08-05 14:51:00 mySymbol -1 @ 45.78"
[1] "2015-08-05 21:00:00 mySymbol 1 @ 45.14"
[1] "2015-08-06 06:16:00 mySymbol -1 @ 44.89"
[1] "2015-08-06 18:29:00 mySymbol 1 @ 44.56"
ターゲット/ストップに達するまで、再び取引されないことがわかります。