2014-02-21 96 views
0

使用quantmod的側平舉繼R data.table Return calculation and set() 我想請問我該如何使用Delt()library(quantmod)找到一個時間序列在data.table()回報。 到目前爲止,感謝弗蘭克,我有:R:在data.table

set.seed(42) 
DT <- data.table(
    ticker=rep(letters,each=5), 
    priceA=runif(5*26^2), 
    priceB=runif(5*26^2)) 

DT[,paste('returns',LETTERS[1:2],sep=''):={ 
    lapply(.SD,function(x){ 
    old <- head(x,-1) 
    new <- tail(x,-1) 
    c(NA,(new-old)/old) 
    }) 
},by=ticker,.SDcols=grep('^price',names(DT))] 

的結果(該種子值)是:

 ticker priceA priceB returnsA returnsB 
    1:  a 0.9148060 0.7956245   NA   NA 
    2:  a 0.9370754 0.9314941 0.02434327 0.1707710 
    3:  a 0.2861395 0.6269996 -0.69464620 -0.3268883 
    4:  a 0.8304476 0.1666758 1.90224707 -0.7341691 
    5:  a 0.6417455 0.6483800 -0.22722939 2.8900659 
    ---             
3376:  z 0.2887293 0.3473923 -0.54132570 -0.3514041 
3377:  z 0.9013438 0.1788842 2.12176058 -0.4850656 
3378:  z 0.3126429 0.7648157 -0.65313686 3.2754788 
3379:  z 0.8791381 0.1300418 1.81195584 -0.8299698 
3380:  z 0.8160158 0.8159330 -0.07180019 5.2743905 

如何使用Delt()(或類似%的變化功能),而不是function(x){ old <- head(x,-1) new <- tail(x,-1) c(NA,(new-old)/old) } ??

很多很多謝謝!

回答

2

你只需要的Delt返回值轉換爲一個簡單的載體:

DT[, 
    paste('returns',LETTERS[1:2],sep=''):=lapply(.SD,function(x) c(Delt(x))), 
    by=ticker,.SDcols=grep('^price',names(DT)) 
] 

這將產生:

ticker priceA priceB returnsA returnsB 
1:  a 0.9148060 0.7956245   NA   NA 
2:  a 0.9370754 0.9314941 0.02434327 0.1707710 
3:  a 0.2861395 0.6269996 -0.69464620 -0.3268883 
4:  a 0.8304476 0.1666758 1.90224707 -0.7341691 
5:  a 0.6417455 0.6483800 -0.22722939 2.8900659 
---             
+0

非常感謝你。 – pidosaurus