quantstrat策略中多头仓位未随开空信号平仓的问题咨询
quantstrat策略中多头仓位未随开空信号平仓的问题咨询
各位好,我在使用quantstrat开发交易策略时碰到了一个困惑,希望能得到大家的帮助。
我的交易策略逻辑
我设计的信号规则很简单:
- 信号
0:平仓所有持仓 - 信号
1:开多单(如果当前持有空单,先平仓再开多) - 信号
-1:开空单(如果当前持有多单,先平仓再开空) - 交易全程只能持有一个仓位,不能同时持有多空单
模拟数据与信号生成代码
我先生成了模拟数据和对应的交易信号,代码如下:
require(quantstrat) set.seed(1) fake_data <- rnorm(100) |> cumsum() |> xts(order.by=as.POSIXct(x=60*1:100, origin='2021-07-01')) colnames(fake_data) <-'Close' make_seq <- function() sample(c(-1,0,1),size=1) |> rep(sample(3:20,1)) fake_data$signal <- lapply(1:50,\(x) make_seq()) |> unlist() |> tail(n = length(fake_data)) # 可视化信号 chart_Series(fake_data) abline(h=0) # 生成开平仓标记 fake_data$buy_open <- 0 fake_data$buy_close <- 0 fake_data$sell_open <- 0 fake_data$sell_close <- 0 S <- fake_data$signal |> coredata() |> as.vector() for(i in 2:nrow(fake_data)){ if(S[i-1]!= 1 & S[i]== 1) fake_data$buy_open[i] <- 1 if(S[i-1]== 1 & S[i]!= 1) fake_data$buy_close[i] <- 1 if(S[i-1]!= -1 & S[i]== -1) fake_data$sell_open[i] <- 1 if(S[i-1]== -1 & S[i]!= -1) fake_data$sell_close[i] <- 1 }
quantstrat回测策略配置代码
接着我配置了quantstrat的回测规则,代码如下:
# 重置策略 rm.strat(strat.st) strat.st <- "FAKESTRAT" currency("USD") stock("fake_data",currency = "USD") # 初始化账户、组合 initPortf(strat.st, symbols="fake_data") initEq<-1000 initAcct(strat.st, portfolios=strat.st, initEq=initEq) initOrders(portfolio=strat.st) strategy(name=strat.st,store=TRUE) # 设置仓位限制:最多持有1个仓位 addPosLimit("FAKESTRAT", "fake_data", maxpos = 1, timestamp = start(fake_data)-1) # 多单开仓规则 add.rule(strat.st,"ruleSignal", arguments=list(sigcol="buy_open", sigval=TRUE, orderqty=1, ordertype='market', orderside='long', osFUN = osMaxPos), type="enter", label="enterLong" ) # 多单平仓规则 add.rule(strat.st,"ruleSignal", arguments=list(sigcol="buy_close", sigval=TRUE, orderqty="all", ordertype='market', orderside='long'), type="exit", label="exitLong" ) # 空单开仓规则 add.rule(strat.st,"ruleSignal", arguments=list(sigcol="sell_open", sigval=TRUE, orderqty=-1, ordertype='market', orderside='short', osFUN = osMaxPos), type="enter", label="enterShort" ) # 空单平仓规则 add.rule(strat.st,"ruleSignal", arguments=list(sigcol="sell_close", sigval=TRUE, orderqty="all", ordertype='market', orderside='short'), type="exit", label="exitShort" ) # 执行策略回测 out<-applyStrategy(strat.st , portfolios=strat.st, verbose=T) updatePortf(strat.st) book <- getOrderBook(portfolio=strat.st)
回测生成的订单记录
查看订单簿得到以下结果:
$FAKESTRAT $FAKESTRAT$fake_data Order.Qty Order.Price Order.Type Order.Side Order.Threshold 2021-07-01 03:24:00 -1 3.59680448297358 market short <NA> 2021-07-01 03:40:00 all 3.68104715087989 market short <NA> 2021-07-01 03:40:00 1 3.68104715087989 market long <NA> 2021-07-01 03:54:00 -1 4.02025008047271 market short <NA> 2021-07-01 04:12:00 all 10.7346453103169 market short <NA> 2021-07-01 04:35:00 -1 13.8781211399328 market short <NA> Order.Status Order.StatusTime Prefer Order.Set Txn.Fees Rule 2021-07-01 03:24:00 closed 2021-07-01 03:25:00 <NA> 0 enterShort 2021-07-01 03:40:00 replaced 2021-07-01 03:40:00 <NA> 0 exitShort 2021-07-01 03:40:00 closed 2021-07-01 03:41:00 <NA> 0 enterLong 2021-07-01 03:54:00 closed 2021-07-01 03:55:00 <NA> 0 enterShort 2021-07-01 04:12:00 closed 2021-07-01 04:13:00 <NA> 0 exitShort 2021-07-01 04:35:00 closed 2021-07-01 04:36:00 <NA> 0 enterShort Time.In.Force 2021-07-01 03:24:00 2021-07-01 03:40:00 2021-07-01 03:40:00 2021-07-01 03:54:00 2021-07-01 04:12:00 2021-07-01 04:35:00
我的疑问
从订单记录里可以看到,2021-07-01 03:40:00开了一个多头仓位,但在2021-07-01 03:54:00触发开空信号时,这个多头仓位并没有被平仓,系统直接开了空单。这和我设计的“开空前先平多”的策略逻辑不符,想请教大家这是哪里出了问题?
备注:内容来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

