从 R 中的大型数据框创建股票指数等

Creating a stock index etc. from a large data frame in R

我有一个名为 stockdata 的数据框,其中包含几年来几只股票的收盘价。数据框的样式如下:

      date close  ticker  stock.name
2001-09-06  3.06  LAGR   Lagercrantz
2001-09-07  2.89  LAGR   Lagercrantz
2001-09-09  2.67  LAGR   Lagercrantz
2001-09-10  2.67  LAGR   Lagercrantz
2001-09-11  2.56  LAGR   Lagercrantz
2001-09-12  2.24  LAGR   Lagercrantz
2001-09-13  2.44  LAGR   Lagercrantz
2001-09-06 20.70  MEAB   Malmbergs Elektriska
2001-09-07 20.60  MEAB   Malmbergs Elektriska
2001-09-09 20.40  MEAB   Malmbergs Elektriska
2001-09-10 20.50  MEAB   Malmbergs Elektriska
2001-09-11 20.50  MEAB   Malmbergs Elektriska
2001-09-12 20.70  MEAB   Malmbergs Elektriska
2001-09-13 20.60  MEAB   Malmbergs Elektriska
2011-07-06 1.8018 HTRO   Hexatronic
2011-07-07 1.8018 HTRO   Hexatronic
2011-07-08 1.8318 HTRO   Hexatronic
2011-07-11 1.8394 HTRO   Hexatronic
2011-07-12 1.8394 HTRO   Hexatronic
2011-07-13 1.8769 HTRO   Hexatronic

由此我想:

  1. 添加一个名为 percentage 的列,其中应包含基于每只股票首次上市日期的股票表现百分比。

  2. 根据数据框中所有股票的收盘价创建股票指数。由于股票数量随时间变化(不同引入日期、退市等),因此在计算新股票指数的百分比和价格时需要考虑这一点。

执行这些操作最简单的方法是什么?有什么办法不用遍历所有数据吗?

数据

df <- read.table(text = "
date close  ticker  stock.name
2001-09-06  3.06  LAGR   Lagercrantz
2001-09-07  2.89  LAGR   Lagercrantz
2001-09-09  2.67  LAGR   Lagercrantz
2001-09-10  2.67  LAGR   Lagercrantz
2001-09-11  2.56  LAGR   Lagercrantz
2001-09-12  2.24  LAGR   Lagercrantz
2001-09-13  2.44  LAGR   Lagercrantz
2001-09-06 20.70  MEAB   'Malmbergs Elektriska'
2001-09-07 20.60  MEAB   'Malmbergs Elektriska'
2001-09-09 20.40  MEAB   'Malmbergs Elektriska'
2001-09-10 20.50  MEAB   'Malmbergs Elektriska'
2001-09-11 20.50  MEAB   'Malmbergs Elektriska'
2001-09-12 20.70  MEAB   'Malmbergs Elektriska'
2001-09-13 20.60  MEAB   'Malmbergs Elektriska'
2011-07-06 1.8018 HTRO   Hexatronic
2011-07-07 1.8018 HTRO   Hexatronic
2011-07-08 1.8318 HTRO   Hexatronic
2011-07-11 1.8394 HTRO   Hexatronic
2011-07-12 1.8394 HTRO   Hexatronic
2011-07-13 1.8769 HTRO   Hexatronic
  ",
  header = TRUE)

1.和 2.

library(tidyverse)

df %>%
  group_by(ticker) %>%
  mutate(
    percentage = close / close[date == min(date)],
    average = mean(percentage))