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

能否在blotter的chart.Posn()/chart.Reconcile()中绘制对数价格图?

解决blotter和quantmod对数价格图的问题

我来帮你梳理下这个问题的解决方案——你遇到的情况确实和chart_Series的实验性特性有关,而且直接传参数的方式确实不对,下面分两种场景给你具体的解决办法:

一、用chart.Posn绘制带对数刻度的仓位图

chart.Posn默认调用的是quantmod的实验性函数chart_Series,而这个函数本身并不支持log.scale参数,你直接加这个参数自然没效果。不过我们可以换个思路,指定它使用旧版的chartSeries(注意大小写,带大写S的是旧版稳定版),这个版本是支持对数刻度的:

# 调用chart.Posn时指定使用chartSeries,并传入ylog=TRUE
chart.Posn(Portfolio = portfolio.st, Symbol = "GSPC", chartfun = chartSeries, ylog = TRUE)

这里的chartfun参数是chart.Posn用来指定绘图函数的,我们把它从默认的chart_Series换成chartSeries,再用ylog=TRUE开启对数刻度,就能得到你想要的效果了。

二、直接用chart_Series绘制对数价格图

你之前用par(ylog=TRUE)报错,是因为chart_Series会重置绘图参数,它不认可这种全局设置的方式。要给chart_Series加对数刻度,有两种可行方法:

方法1:修改chart_Series对象的刻度设置

先创建绘图对象,再手动把y轴改成对数刻度:

# 创建chart_Series对象
p <- chart_Series(Cl(GSPC))
# 修改y轴为对数刻度
p$env$scale$y <- "log"
# 重新打印绘图
print(p)

如果还要叠加仓位,后续可以用add_Posn函数:

add_Posn(p, Portfolio = portfolio.st, Symbol = "GSPC")

方法2:转换数据为对数后绘图

直接把收盘价转换为对数再绘图,这种方式简单直接,缺点是y轴显示的是对数值,你可以手动调整轴标签:

chart_Series(log(Cl(GSPC)), name = "GSPC (Log Price)")

关于你遇到的"log scale needs positive bounds"报错

这个报错其实是因为chart_Series在初始化时会重新计算轴范围,覆盖了你用par设置的参数,和数据本身是否为正无关——毕竟标普500的价格肯定都是正数,只要用上面的方法避开par的全局设置,就不会出现这个问题了。

内容的提问来源于stack exchange,提问作者sdittmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:17:59