2013-07-18 26 views
4

我開始用R來弄溼我的腳,並且我是時間系列概念的全新。任何人都可以根據每日數據點指向正確的方向來計算每月變化百分比嗎?我想要在每個月的第一個和最後一個數據點之間進行更改。例如:如何計算R中每日時間序列的月變化率?

TSERIES數據:

1/1/2000 10.00 
... 
1/31/2000 10.10 
2/1/2000 10.20 
... 
2/28/2000 11.00 

我要找的形式返回數據幀:

1/31/2000 .01 
2/28/2000 .0784 

理想情況下,我能夠從端點計算前一個月到當前月份的終點,但我認爲按月分區更容易作爲起點。我正在看包動物園和xts,但我仍然堅持。任何接受者?謝謝...

+4

你嘗試過什麼?你有沒有瀏覽動物園和xts小插曲的答案?你是否搜索過[xts]標籤? –

+0

現在正在解析它們.. – StatsViaCsh

回答

2

這裏有一種方法使用plyrddply。 我按順序使用ddply,首先得到每個月的第一行和最後一行,然後再次計算每月返回。 (可能使用XTS或動物園可能更容易,我不知道。)

#Using plyr and the data in df 
df$Date <- as.POSIXlt(as.Date(df$Date, "%m/%d/%Y")) 
df$Month <- (df$Date$mon + 1) #0 = January 

sdf <- df[,-1] #drop the Date Column, ddply doesn't like it 

library("plyr") 
#this function is called with 2 row data frames 
monthlyReturn<- function(df) { 
    (df$Value[2] - df$Value[1])/(df$Value[1]) 
} 

adf <- ddply(sdf, .(Month), function(x) x[c(1, nrow(x)), ]) #get first and last values for each Month 
mon.returns <- ddply(adf, .(Month), monthlyReturn) 

這是我用來測試出來的數據:

> df 
     Date Value 
1 1/1/2000 10.0 
2 1/31/2000 10.1 
3 2/1/2000 10.2 
4 2/28/2000 11.0 
5 3/1/2000 10.0 
6 3/31/2000 24.1 
7 5/10/2000 510.0 
8 5/22/2000 522.0 
9 6/04/2000 604.0 
10 7/03/2000 10.1 
11 7/30/2000 7.2 
12 12/28/2000 11.0 
13 12/30/2000 3.0 

> mon.returns 
    Month   V1 
1  1 0.01000000 
2  2 0.07843137 
3  3 1.41000000 
4  5 0.02352941 
5  6 0.00000000 
6  7 -0.28712871 
7 12 -0.72727273 

希望有所幫助。

+0

Ram,謝謝。動物園和xts是要走的路,但是這讓我開始思考這個結構。 – StatsViaCsh

+0

很高興幫助。 –

0

TTR包中的ROC函數將執行此操作。如果您僅查看每月行爲,則可以先使用to.monthly或endpoints()(From daily time series to weekly time series in R xts object)。

library(TTR) 
# data.monthly <- to.monthly(data, indexAt='periodEnd') # if OHLC data 
# OR 
data.monthly <- data[ endpoints(data, on="months", k=1), ] 
data.roc <- ROC(data.monthly, n = 1, type = "discrete") 
1

這裏是另一種方式來做到這一點(使用quantmod包):

此計算從每日價格AAPL每月返還。

*library(quantmod)  # load the quantmod package 
getSymbols("AAPL")  # download daily price for stock AAPL 
monthlyReturn = periodReturn(AAPL,period="monthly") 
monthlyReturn2014 = periodReturn(AAPL,period="monthly",subset='2014:') # for 2014* 
1

這是一個很老的線程,但供參考,在這裏來使用相同的數據@Ram一個data.table解決方案:

structure(list(Date = structure(c(10957, 10987, 10988, 11015, 11017, 11047, 11087, 11099, 11112, 11141, 11168, 11319, 11321), class = "Date"), Value = c(10, 10.1, 10.2, 11, 10, 24.1, 510, 522, 604, 10.1, 7.2, 11, 3)), .Names = c("Date", "Value"), row.names = c(NA, -13L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000000001b0788>) 

它本質上是一個一行使用了data.table::month功能:

library(data.table) 

setDT(df)[ , diff(Value)/Value[1], by= .(month(Date))] 

這會產生相對於每月第一個記錄日的變化。如果相對於最後天的更改是首選,則中間表達式應更改爲diff(Value)/Vale[2]

1

1)無包裝試試這個:

DF <- read.table(text = Lines) 

fmt <- "%m/%d/%Y" 
ym <- format(as.Date(DF$V1, format = fmt), "%Y-%m") 

ret <- function(x) diff(range(x))/x[1] 
ag <- aggregate(V2 ~ ym, DF, ret) 

,並提供:

> ag 
     ym   V2 
1 2000-01 0.01000000 
2 2000-02 0.07843137 

如果需要,我們可以將此轉換爲"ts"類。假設沒有丟失月:

ts(ag$V2, start = 2000, freq = 12) 

,並提供:

  Jan  Feb 
2000 0.01000000 0.07843137 

2)這是一個更容易一點,如果你使用的動物園或XTS時間序列包。 fmtret是從上面:

library(zoo) 
z <- read.zoo(text = Lines, format = fmt) 
z.ret <- aggregate(z, as.yearmon, ret) 

捐贈:

> z.ret 
    Jan 2000 Feb 2000 
0.01000000 0.07843137 

如果你已經有了一個data.frame DF那麼read.zoo語句可以與z <- read.zoo(DF, format = fmt)被替換或省略format ARG如果第一列是"Date"類。

如果"ts"類是需要的,然後使用as.ts(z.ret)

注:輸入Lines是:

Lines <- "1/1/2000 10.00 
1/31/2000 10.10 
2/1/2000 10.20 
2/28/2000 11.00" 
相關問題