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)\nRun Code Online (Sandbox Code Playgroud)\n
您的代码存在很多问题。我会尽力解释所有这些。
\n\n您通常不需要在对、和initDate的调用中进行设置。错误地设置该值可能会导致问题。所以这些调用应该是:initPortfinitAcctinitOrders
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\nRun Code Online (Sandbox Code Playgroud)\n\n您在调用中将最大/最小交易规模设置为 1 addPosLimit,但您的交易规模为 100 万。因此,任何订单都将被拒绝,因为它会使您超出头寸限制。您还应该知道 的timestamp参数addPosLimit决定了限制何时生效。如果您始终希望它们有效,则应将时间戳设置为数据中第一次观察之前的时间。另请注意,您仅创建了 的持仓限制AUDUSD。您需要为每个交易品种创建头寸限制。
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)\nRun Code Online (Sandbox Code Playgroud)\n\n一个问题是您传递osFun到ruleSignal. ruleSignal没有osFun争论。论点是osFUN(案例很重要)。另一个问题是您指定了osFun = osMaxPos空头退出规则,而不是进入规则。
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")\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
950 次 |
| 最近记录: |