2

我有一个包含 3 列的数据框:日期、代码(即金融工具)和价格。我只想计算每个股票的回报。

一些数据可以玩:

AsofDate = as.Date(c("2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05",
                     "2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05",
                     "2018-01-01","2018-01-02","2018-01-03","2018-01-04","2018-01-05"))
Tickers = c("Ticker1", "Ticker1", "Ticker1", "Ticker1", "Ticker1",
            "Ticker2", "Ticker2", "Ticker2", "Ticker2", "Ticker2",
            "Ticker3", "Ticker3", "Ticker3", "Ticker3", "Ticker3")

Prices =c(1,2,7,4,2,
          6,5,7,9,12,
          11,11,16,14,15)

df = data.frame(AsofDate, Tickers, Prices)

我的第一个想法是按(代码价格)订购价格,然后计算所有向量并在第一天设置为 NA ......

TTR::ROC(x=Prices)

它适用于 Excel,但我想要更漂亮的东西

所以我尝试了这样的事情:

require(dplyr)
ret = df %>% 
  select(Tickers,Prices) %>% 
  group_by(Tickers) %>% 
  do(data.frame(LogReturns=TTR::ROC(x=Prices)))

df$LogReturns = ret$LogReturns

但是在这里我得到了太多的值,似乎计算不是由 Tickers 完成的。

你能给我一个提示吗?

谢谢 !!

4

2 回答 2

2

在中dplyr,我们可以使用lagPrices

library(dplyr)
df %>%
  group_by(Tickers) %>%
  mutate(returns = (Prices - lag(Prices))/Prices)

# AsofDate   Tickers Prices returns
#   <date>     <fct>    <dbl>   <dbl>
# 1 2018-01-01 Ticker1      1 NA     
# 2 2018-01-02 Ticker1      2  0.5   
# 3 2018-01-03 Ticker1      7  0.714 
# 4 2018-01-04 Ticker1      4 -0.75  
# 5 2018-01-05 Ticker1      2 -1     
# 6 2018-01-01 Ticker2      6 NA     
# 7 2018-01-02 Ticker2      5 -0.2   
# 8 2018-01-03 Ticker2      7  0.286 
# 9 2018-01-04 Ticker2      9  0.222 
#10 2018-01-05 Ticker2     12  0.25  
#11 2018-01-01 Ticker3     11 NA     
#12 2018-01-02 Ticker3     11  0     
#13 2018-01-03 Ticker3     16  0.312 
#14 2018-01-04 Ticker3     14 -0.143 
#15 2018-01-05 Ticker3     15  0.0667

在基础 R 中,我们可以使用avewithdiff

df$returns <- with(df, ave(Prices, Tickers,FUN = function(x) c(NA,diff(x)))/Prices)
于 2019-10-01T08:00:19.223 回答
0

我们可以用data.table

library(data.table)
setDT(df)[, returns := (Prices - shift(Prices))/Prices, by = Tickers]
于 2019-10-01T15:23:50.743 回答