【问题标题】:Finding weekly returns from daily returns company-wise从公司的每日回报中寻找每周回报
【发布时间】:2019-08-30 09:35:25
【问题描述】:

我的数据看起来像这样

co_code company_name co_stkdate dailylogreturn
1        A           01-01-2000  0.76
1        A           02-01-2000  0.75
.
.
.
1        A           31-12-2019  0.54
2        B           01-01-2000  0.98
2        B           02-01-2000  0.45

。 . 以此类推

我想求每周收益等于一周的每日日志收益之和。

输出应该是这样的

 co_code company_name co_stkdate weeklyreturns
    1        A           07-01-2000  1.34
    1        A           14-01-2000  0.95
    .
    .
    .
    1        A           31-12-2019  0.54
    2        B           07-01-2000  0.98
    2        B           14-01-2000  0.45

我尝试在 quantmod 包中应用函数,但这些函数仅适用于 xts 对象。 xts 对象中的另一个问题是不能使用函数“group_by()”。因此,我只想在通常的数据框中工作。

代码看起来像这样

library(dplyr)
### Reading txt file
df <- read.csv("33339_1_120_20190405_165913_dat.csv")

计算每日日志回报

df <- mutate(df, "dailylogrtn"=log(nse_returns)) %>% as.data.frame()

格式化日期

df$co_stkdate<- as.Date(as.character(df$co_stkdate), format="%d-%m-%Y")

【问题讨论】:

  • 根据我的交易知识了解到,几乎所有交易所都有节假日和休市日(周六和周日)。您需要创建一个数据集,该数据集应包含这些天,但这些天的交易回报为 0,以在一年中整整 52(或 53)周(取决于闰年和非闰年)。这是一个典型的练习。但是,如果您想从实际数据继续,请使用 ceiling() 按 7 天分组数据。
  • 类似DF %&gt;% group_by(group = ceiling((1:nrow(DF)/ 7))),然后计算每个组的平均值。
  • 如何进行“典型练习”?任何想法...增加天数
  • 当然。一种方法是在这些天填充,因为这些是假期,我们通常在这些天开盘时采用最后一个交易日的收盘价以及收盘价。这样做是为了避免任何日期超出实际的 52 或 53 周。

标签: r date dataframe dplyr xts


【解决方案1】:

由于我们不知道您每周有多少天收到dailylogreturn,因此可能会有 NA,我建议按周和年分组:

#sample data
df <-   data.frame(co_stkdate = rep(seq.Date(from = as.Date("2000-01-07"), to = as.Date("2000-02-07"), by = 1), 2),
                   dailylogreturn = abs(round(rnorm(64, 1, 1), 2)),
                   company_name = rep(c("A", "B"), each = 32))


df %>%
  mutate(co_stkdate = as.POSIXct(co_stkdate),
         year = strftime(co_stkdate, "%W"),
         week = strftime(co_stkdate, "%Y")) %>%
  group_by(company_name, year, week) %>%
  summarise(weeklyreturns = sum(dailylogreturn, na.rm = TRUE))

# A tibble: 12 x 4
# Groups:   company_name, year [12]
   company_name year  week  weeklyreturns
   <fct>        <chr> <chr>         <dbl>
 1 A            01    2000           6.31
 2 A            02    2000           6.11
 3 A            03    2000           6.02
 4 A            04    2000           8.27
 5 A            05    2000           4.92
 6 A            06    2000           0.5 
 7 B            01    2000           1.82
 8 B            02    2000           6.6 
 9 B            03    2000           7.55
10 B            04    2000           7.63
11 B            05    2000           7.54
12 B            06    2000           1.03


【讨论】:

  • 谢谢。这对我有用。但是,我得到的输出类似于 00_2000 00_2001 00_2002 00_2003...然后是 01_2000 01_2001。我该如何安排那一栏?
  • 嗯,如果您关心订单,您可以将yearweek 列拆分为一个week 和一个year,按两列分组(+ company_name),然后按weekyear(如有必要)。
  • 非常感谢。
【解决方案2】:

由于我没有样本数据,我认为这应该可行:

df %>%
   group_by(group = ceiling((1:nrow(df)/ 7))) %>%
   summarise(mean = mean(weeklyreturns))

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多