Quantstrat 持仓数量限制

Nic*_*asB 3 r quantstrat back-testing

在过去的几天里,我一直在摸不着头脑,试图了解如何限制策略中的持仓数量。它是一种通道突破策略(做多/突破 20 日突破通道,并设置 10 日高点/低点止损。

\n\n

我不希望系统金字塔式的。仅接受 1 个头寸,即\n- 如果在第一天我有一个信号,并且市场保持趋势,它将打印新信号,但必须将其忽略,因为我们已经处于某个位置。

\n\n

我尝试了我发现的一切,但一无所获。我知道我必须调整 osMaxPos 和 addPosLimit 但似乎我做错了。

\n\n

这是我的代码。提前致谢。

\n\n
#Import des donn\xc3\xa9es\nGBPUSD <- getdata("GBPUSD.csv")\nGBPUSD <- getdata("GBPUSD.csv")\nAUDUSD <- getdata("AUDUSD.csv")\nEURUSD <- getdata("EURUSD.csv")\nXAUUSD <- getdata("XAUUSD.csv")\nEURCHF <- getdata("EURCHF.csv")\n\n### Cr\xc3\xa9ation des devises\ncurrency(c("USD","EUR","AUD","GBP","XAU","CHF"))\nexchange_rate(c("EURUSD","GBPUSD","AUDUSD","XAUUSD","EURCHF"),"USD")\nsymbols <- c("GBPUSD","AUDUSD","EURUSD")\ntradesize <- 1000000\n\n\n\ninit.date <- "2001-09-04"    #date d\'initialisation de l\'environement\nstart.date <- "2001-10-01"       #1ere date du jeu de donn\xc3\xa9e\nend.date <- Sys.Date()       #derni\xc3\xa8re date du jeu de donn\xc3\xa9e\ninitial.capital <- 1000000      #Capital de d\xc3\xa9part\nBreakout <- strategy("Breakout")\n\n\nportfolio.st <- account.st <- strat.st <- "Breakout"\n\nif (!exists(\'.blotter\')) .blotter <- new.env()\nif (!exists(\'.strategy\')) .strategy <- new.env()\n\ninitPortf(portfolio.st,        #nom du book\n          symbols = symbols,  #list des instruments\n          initDate=init.date,  #date de d\xc3\xa9part du book\n          currency=\'USD\')     #devise de r\xc3\xa9f\xc3\xa9rence du book\n\ninitAcct(account.st,                 #nom du compte\n         portfolios = portfolio.st,  #nom du portfeuille rattach\xc3\xa9 au compte\n         initDate = init.date,       #date de d\xc3\xa9part du compte\n         currency = "USD",           #devise du compte\n         initEq = initial.capital)   #capital de d\xc3\xa9part du compte\n\ninitOrders(portfolio.st,            #initialisation du container des orgers\n           initDate = init.date)    #date de d\xc3\xa9part du book d\'ordre\n\nstrategy("Breakout",store = TRUE)\n\n\n#Definition des indicateurs\nadd.indicator("Breakout",\n              name = "DonchianChannel",\n              arguments=list(HL=quote(cbind(Hi(mktdata)[,1],Lo(mktdata)[,1])), n=20,include.lag=TRUE), label="Donchian20")\n\nadd.indicator("Breakout",\n              name = "DonchianChannel",\n              arguments=list(HL=quote(cbind(Hi(mktdata)[,1],Lo(mktdata)[,1])), n=10,include.lag=TRUE), label="Donchian10")\n\n\n##Definition des signaux\n\nadd.signal("Breakout",                #nom de la strategie\n           name="sigCrossover",      #type de signal\n           arguments = list(columns =c("Close","high.Donchian20"), #liste des colonnes pour d\xc3\xa9terminer le signal\n                            relationship="gt"),   #type de relation du signal (sup ou \xc3\xa9gal, sup, inf\xc3\xa9rieur etc..)\n           label = "long")        #label de la colonne du signal\n\nadd.signal("Breakout",                #nom de la strategie\n           name="sigCrossover",      #type de signal\n           arguments = list(columns =c("Close","low.Donchian10"), #liste des colonnes pour d\xc3\xa9terminer le signal\n                            relationship="lt"),   #type de relation du signal (sup ou \xc3\xa9gal, sup, inf\xc3\xa9rieur etc..)\n           label = "exitlong")        #label de la colonne du signal\n\n\nadd.signal("Breakout",                #nom de la strategie\n           name="sigCrossover",      #type de signal\n           arguments = list(columns =c("Close","low.Donchian20"), #liste des colonnes pour d\xc3\xa9terminer le signal\n                            relationship="lt"),   #type de relation du signal (sup ou \xc3\xa9gal, sup, inf\xc3\xa9rieur etc..)\n           label = "short")   \n\nadd.signal("Breakout",                #nom de la strategie\n           name="sigCrossover",      #type de signal\n           arguments = list(columns =c("Close","high.Donchian10"), #liste des colonnes pour d\xc3\xa9terminer le signal\n                            relationship="gt"),   #type de relation du signal (sup ou \xc3\xa9gal, sup, inf\xc3\xa9rieur etc..)\n           label = "exitshort")        #label de la colonne du signal\n\n\n#Limite\n\n#addPosLimit( portfolio = "Breakout", # add position limit rules\n#             symbol = "AUDUSD",\n#            timestamp = init.date,\n#            maxpos = tradesize)\n\naddPosLimit("Breakout","AUDUSD",maxpos = 1, minpos = -1,timestamp =  as.POSIXct(init.date))\ngetPosLimit(portfolio = "Breakout","AUDUSD", timestamp = as.POSIXct(init.date))\n\n##Definition des r\xc3\xa8gles\n\nadd.rule("Breakout",                               #nom de la strategie \n         name = "ruleSignal",                      #\n         arguments = list(sigcol ="long",          #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,           #Application de la r\xc3\xa8gle si signal\n                          orderqty=tradesize,        #taille de l\'ordre\n                          osFun = osMaxPos,\n                          replace = FALSE,\n                          ordertype = "market",    #type d\'ordre\n                          orderside ="long"),   #sens\n         type = "enter",          #ouverture ou fermeture de pose\n         label = "Enterlong")    #label si ex\xc3\xa9cution\n\nadd.rule("Breakout",                                  #nom de la strategie \n         name = "ruleSignal",                      #\n         arguments = list(sigcol ="exitlong",          #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,           #Application de la r\xc3\xa8gle si signal\n                          orderqty="all",        #taille de l\'ordre\n                          replace = FALSE,\n                          ordertype = "market",    #type d\'ordre\n                          orderside ="long"),   #sens\n         type = "exit",          #ouverture ou fermeture de pose\n         label = "Exitlong")    #label si ex\xc3\xa9cution\n\n\nadd.rule("Breakout",                                  #nom de la strategie \n         name = "ruleSignal",                      #\n         arguments = list(sigcol ="short",          #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,           #Application de la r\xc3\xa8gle si signal\n                          orderqty=-tradesize,#taille de l\'ordre\n                          replace = FALSE,\n                          ordertype = "market",    #type d\'ordre\n                          orderside ="short"),   #sens\n         type = "enter",          #ouverture ou fermeture de pose\n         label = "Entershort")    #label si ex\xc3\xa9cution\n\nadd.rule("Breakout",                                  #nom de la strategie \n         name = "ruleSignal",                      #\n         arguments = list(sigcol ="exitshort",          #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,           #Application de la r\xc3\xa8gle si signal\n                          orderqty="all",#taille de l\'ordre\n                          osFun = osMaxPos,\n                          replace = FALSE,\n                          ordertype = "market",    #type d\'ordre\n                          orderside ="short"),   #sens\n         type = "exit",          #ouverture ou fermeture de pose\n         label = "Exitshort")    #label si ex\xc3\xa9cution\n\n\n\n\n\n\nout <- applyStrategy("Breakout", portfolios = portfolio.st)\n
Run Code Online (Sandbox Code Playgroud)\n

Jos*_*ich 5

您的代码存在很多问题。我会尽力解释所有这些。

\n\n

初始化

\n\n

您通常不需要在对、和initDate的调用中进行设置。错误地设置该值可能会导致问题。所以这些调用应该是:initPortfinitAcctinitOrders

\n\n
initPortf(portfolio.st,       #nom du book\n          symbols = symbols,  #list des instruments\n          currency=\'USD\')     #devise de r\xc3\xa9f\xc3\xa9rence du book\n\ninitAcct(account.st,                 #nom du compte\n         portfolios = portfolio.st,  #nom du portfeuille rattach\xc3\xa9 au compte\n         currency = "USD",           #devise du compte\n         initEq = initial.capital)   #capital de d\xc3\xa9part du compte\n\ninitOrders(portfolio.st)             #initialisation du container des orgers\n
Run Code Online (Sandbox Code Playgroud)\n\n

持仓限制

\n\n

您在调用中将最大/最小交易规模设置为 1 addPosLimit,但您的交易规模为 100 万。因此,任何订单都将被拒绝,因为它会使您超出头寸限制。您还应该知道 的timestamp参数addPosLimit决定了限制何时生效。如果您始终希望它们有效,则应将时间戳设置为数据中第一次观察之前的时间。另请注意,您仅创建了 的持仓限制AUDUSD。您需要为每个交易品种创建头寸限制。

\n\n
addPosLimit("Breakout", "GBPUSD", maxpos = tradesize, timestamp = start(GBPUSD)-1)\naddPosLimit("Breakout", "AUDUSD", maxpos = tradesize, timestamp = start(AUDUSD)-1)\naddPosLimit("Breakout", "EURUSD", maxpos = tradesize, timestamp = start(EURUSD)-1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

规则

\n\n

一个问题是您传递osFunruleSignal. ruleSignal没有osFun争论。论点是osFUN(案例很重要)。另一个问题是您指定了osFun = osMaxPos空头退出规则,而不是进入规则。

\n\n
add.rule("Breakout", name = "ruleSignal",\n         arguments = list(sigcol = "long",      #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,        #Application de la r\xc3\xa8gle si signal\n                          orderqty = tradesize, #taille de l\'ordre\n                          osFUN = osMaxPos,\n                          replace = FALSE,\n                          ordertype = "market", #type d\'ordre\n                          orderside = "long"),  #sens\n         type = "enter", label = "Enterlong")\n\nadd.rule("Breakout", name = "ruleSignal",\n         arguments = list(sigcol = "exitlong",  #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,        #Application de la r\xc3\xa8gle si signal\n                          orderqty = "all",     #taille de l\'ordre\n                          replace = FALSE,\n                          ordertype = "market", #type d\'ordre\n                          orderside = "long"),  #sens\n         type = "exit", label = "Exitlong")\n\nadd.rule("Breakout", name = "ruleSignal",\n         arguments = list(sigcol = "short",     #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,        #Application de la r\xc3\xa8gle si signal\n                          orderqty = -tradesize,#taille de l\'ordre\n                          osFUN = osMaxPos,\n                          replace = FALSE,\n                          ordertype = "market",  #type d\'ordre\n                          orderside = "short"),  #sens\n         type = "enter", label = "Entershort")\n\nadd.rule("Breakout", name = "ruleSignal",\n         arguments = list(sigcol = "exitshort",  #nom de la colonne \xc3\xa0 v\xc3\xa9rifier\n                          sigval = TRUE,         #Application de la r\xc3\xa8gle si signal\n                          orderqty = "all",      #taille de l\'ordre\n                          replace = FALSE,\n                          ordertype = "market",  #type d\'ordre\n                          orderside = "short"),  #sens\n         type = "exit", label = "Exitshort")\n
Run Code Online (Sandbox Code Playgroud)\n