【问题标题】:R How can I use the apply function to a time series object and keep the dates attached to the specific columns?R 如何将应用函数用于时间序列对象并将日期附加到特定列?
【发布时间】:2015-01-27 22:11:49
【问题描述】:

我有两个价格系列

require(quantmod)
require(TTR)

tickers = c("IBM","SPY")
getSymbols(tickers, from="2010-10-20", to="2014-09-22")
prices = do.call(merge, lapply(tickers, function(x) Cl(get(x))))

> head(prices)
          IBM.Close SPY.Close
2010-10-20    139.07    117.87
2010-10-21    139.83    118.13
2010-10-22    139.67    118.35
2010-10-25    139.84    118.70
2010-10-26    140.67    118.72
2010-10-27    141.43    118.38

现在我想使用 TTR 包的 SMA 函数对序列进行平滑处理。

sma.IMB = SMA(prices[,1])
sma.SPY = SMA(prices[,2])

sma.prices = cbind(sma.IBM, sma.SPY)

> head(sma.prices)
           IBM.Close.SMA.3 SPY.Close.SMA.3
2010-10-20              NA              NA
2010-10-21              NA              NA
2010-10-22        139.5233        118.1167
2010-10-25        139.7800        118.3933
2010-10-26        140.0600        118.5900
2010-10-27        140.6467        118.6000

这在处理很多资产时非常繁琐,所以我想使用 apply 来缩短这个过程

sma.prices = apply(prices, 2, SMA)

> head(sma.prices)
     IBM.Close SPY.Close
[1,]        NA        NA
[2,]        NA        NA
[3,]        NA        NA
[4,]        NA        NA
[5,]        NA        NA
[6,]        NA        NA

> sma.prices[9:11,]
     IBM.Close SPY.Close
[1,]        NA        NA
[2,]   141.217   118.504
[3,]   141.727   118.712

如您所见,日期未附加到特定行,默认的 n=10 移动平均值用于计算。我的问题是如何保持动物园输出的日期。非常感谢。

【问题讨论】:

    标签: r date apply zoo portfolio


    【解决方案1】:

    apply 返回一个需要转换为动物园对象的矩阵。为了确保新动物园系列中的日期与 TTR 函数返回的日期相匹配,您可以首先使用 TTR 函数及其使用的任何参数定义一个函数,然后使用它来生成新的动物园系列。 下面的代码将 TTR_fn 定义为 SMA,n=3 以定义 3 天移动平均线,然后使用 TTR_fn 进行计算并获得正确的日期。

    TTR_fn <- function(x)  SMA(x, n=3)
    sma.prices  <- zoo(apply(prices, 2, TTR_fn), 
                       order.by=index(TTR_fn(prices[,1]) ) )
    

    【讨论】:

    • 谢谢沃尔特。这也是一个不错的方法。
    • 事实上我会选择你的解决方案,因为这里对 SMA 函数的输入进行控制非常简洁。
    【解决方案2】:

    试试这个:

    sma.prices <- prices
    sma.prices[] <- apply(prices, 2, SMA)
    

    【讨论】:

    • 我真的很尴尬,这很容易。谢谢
    最近更新 更多