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

R语言blotter包chart.Posn无累计收益与回撤:代码排查问询

问题原因及解决方法

你的代码中,仅在最后一个日期更新了组合和账户数据,没有对整个时间序列的所有日期进行更新,导致chart.Posn无法生成累计收益和回撤所需的完整绩效数据。

修正后的代码

library(blotter)
library(xts)
set.seed(1)
times <- seq(as.POSIXct("2016-01-01 00:00:00"), length = 30, by = "sec")
price <- round(cumsum(rnorm(30))+999,2)

signal <- rep(0,30)
signal[5] <- 1  # open long
signal[15] <- -1  # close long open short

dat <- xts(cbind(price,signal),order.by = times)

initDate='1997-12-31'
initEq=1000

currency("USD")
stock("dat",currency="USD",multiplier=1)

ltportfolio='my'
ltaccount='my'

initPortf(ltportfolio,'dat', initDate=initDate)
initAcct(ltaccount,portfolios='my', initDate=initDate, initEq=initEq)
verbose=TRUE

for(i in 1:nrow(dat)){
  
  CurrentDate <- time(dat)[i]
  
  # 获取当前持仓(getPosQty会自动考虑已添加的交易,无需提前更新组合)
  open_position <- getPosQty(ltportfolio, Symbol='dat', Date=CurrentDate)

  #####################  
  ##### open long #####
  ##################### 
  if(dat$signal[i]==1){
    # 平空头仓位
    if(open_position < 0){
      addTxn(ltaccount, 
             Symbol='dat', 
             TxnDate=CurrentDate, 
             TxnPrice=dat$price[i],
             TxnQty = -open_position , 
             TxnFees=0, 
             verbose=verbose)
    }
    
    # 开多头仓位
    addTxn(ltaccount, 
           Symbol='dat', 
           TxnDate=CurrentDate, 
           TxnPrice=dat$price[i],
           TxnQty = 1 , 
           TxnFees=0, 
           verbose=verbose)
  }
  ######################
  ##### open short #####
  ######################
  if(dat$signal[i]==-1){
    # 平多头仓位
    if(open_position > 0){
      addTxn(ltaccount, 
             Symbol='dat', 
             TxnDate=CurrentDate, 
             TxnPrice=dat$price[i],
             TxnQty = -open_position , 
             TxnFees=0, 
             verbose=verbose)
    }
    
    # 开空头仓位
    addTxn(ltaccount, 
           Symbol='dat', 
           TxnDate=CurrentDate, 
           TxnPrice=dat$price[i],
           TxnQty = -1 , 
           TxnFees=0, 
           verbose=verbose)
  }
}

# 关键修正:对整个数据时间范围更新组合和账户,而非仅最后一个日期
updatePortf(ltportfolio, Dates = index(dat))
updateAcct(ltaccount, Dates = index(dat))
updateEndEq(ltaccount, Dates = index(dat))

# 绘制持仓图,此时会显示累计收益和回撤
chart.Posn(ltportfolio, Symbol = 'dat')

核心修正点

  1. 更新范围调整:将updatePortf、updateAcct、updateEndEq的Dates参数从单一的CurrentDate改为index(dat),确保对数据的所有日期进行绩效计算。
  2. 完整绩效数据生成:只有当组合和账户数据覆盖整个交易周期时,chart.Posn才能提取到累计收益和回撤的计算结果,从而在图表中显示这两个模块。

内容的提问来源于stack exchange,提问作者mr.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:28:14