【发布时间】:2015-11-22 01:46:49
【问题描述】:
我想按最接近每个月的第 n 天的日期索引 xts 对象。
换句话说,我想要每个月 15 日的股票价格。但是,15 日在某些月份不是有效的交易日,因为它可能发生在周末或节假日。对于那几个月,我想选择下一个(或前一个)有效交易日。
例如,2015 年前四个月的“下一个第 15 个”系列将返回 1 月 15 日、2 月 17 日、3 月 16 日和 4 月 15 日的观察结果。
to.period( ) 通过选择每个月的最后一天来有效地做到这一点,无论是 30 日、31 日、28 日还是 29 日。我想将这个概括为一个月中的任意一天。
我已经能够通过蛮力做到这一点,但我想知道是否有一个聪明的方法来做到这一点。
更新--
Josh 的回答几乎对我有用 - 由于.indexmday() 访问的索引值的怪异,我的脚本最终失败。
例如,
getSymbols("SPY", from="2015-01-01")
SPY[.indexmday(SPY) == 30]
产量
SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted
2015-03-31 207.26 208.10 206.36 206.43 126768700 205.4304
2015-05-01 209.40 210.77 209.28 210.72 103399700 209.6996
2015-07-01 207.73 208.03 206.56 207.57 129406500 207.5700
2015-07-31 211.42 211.45 210.16 210.45 97697400 210.4500
因为.indexmday() 将 5 月 1 日和 7 月 1 日的索引值检索为 30,而不是 0。我无法解释原因。我可以解决它 - 但解决方法就不那么优雅了。有人知道为什么.indexmday() 会这样吗?
【问题讨论】:
-
这很有趣 - 谢谢 - 但你说得对,这不是我想要做的。诀窍是,如果有第 N 个日期,我想要那个确切的日期;如果没有,我想要该系列中存在的下一个日期。通过蛮力,我可以检查这一天是否存在,如果不存在,则循环遍历日期,直到找到确实存在的日期。我希望我可以在没有循环的情况下完成它......
-
您在
.indexmday中看到的行为可能是xts 开发版中已修复的时区错误。 -
我想知道为什么它对我失败但对其他人有效。无论如何,我会同时使用这个解决方法:
SPY[.indexmday(SPY) >= 14 & .indexmday(SPY)<=25]谢谢! -
正如我所说,它可能对你不起作用,因为你没有使用 xts 的开发版本。