You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:58:12