能否在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
相关产品推荐
相关产品推荐

