使用 R:Fama MacBeth 回归 - 投资组合形成和股票 return 排名

Using R: Fama MacBeth Regression - Portfolio formation and Stock return ranking

我对R很陌生(我以前用过Stata)。我目前正在重做一些金融理论测试,其中涉及:

  1. 声明时间序列

  2. 每天计算相关变量returns

  3. 排名股票表现(横截面)

  4. 形成投资组合

  5. 运行 回归。

我的问题是:

  1. 我应该使用wide dataset还是long dataset来写脚本更方便省时?
  2. 我应该使用哪些相应的命令?

我所说的宽数据集是指 900 只股票有 900 列价格。长数据表示 1 个价格列和 900 行中的股票。该数据包括过去 10 年的每日数据。 所以这是一个海量的数据处理。这就是为什么您与我分享的任何经验都是宝贵的。

宽数据示例:

dateyyyymmdd          price.AAA       price.BBB
1    2015-10-02           10.1           10.7
2    2015-10-01           10.3           10.4
3    2015-09-30           10.4           10.4
4    2015-09-29           10.6           10.6
5    2015-09-28           10.7           11.0
6    2015-09-25           10.4           10.8
7    2015-09-24            9.8           10.2
8    2015-09-23            9.9           10.1
9    2015-09-22            9.9            9.9
10   2015-09-21           10.1           10.1

长数据示例:

dateyyyymmdd             id                price
1    2015-10-02           AAA           10.7
2    2015-10-01           AAA           10.4
3    2015-09-30           AAA           10.4
4    2015-09-29           AAA           10.6
5    2015-09-28           AAA           11.0
6    2015-10-02           BBB           10.8
7    2015-10-01           BBB           10.2
8    2015-09-30           BBB           10.1
9    2015-09-29           BBB            9.9
10   2015-09-38           BBB           10.1

以下是我在工作中遇到的障碍:

  1. 声明时间序列并每天计算return:我发现与Stata相比,声明时间序列并使用它要困难得多。我尝试了 ts() 和其他一些方法,但最终我不知道如何计算 "smart way" 中每只股票的每日 return。我试过 diff() 但它需要应用正确的日期顺序。

  2. 排名股票returns。我还没有达到这一部分。但是,如果我应该使用宽数据或长数据以节省时间,如果有人可以帮助我。我将不得不在一天内对 return 个股票进行排名,然后将它们分组并计算每组的参数。

  3. 运行 回归和投资组合分析。我查看了投资组合分析包并猜测它使用了广泛的数据,因为给定的示例将许多代码显示为数据框的名称(每只股票有 1 个价格列)。

解决您的问题:

  1. R 有多种表示时间序列的方法。 xts 包经常用于因缺少周末和节假日而形成不规则时间序列的金融数据。 xts 包包含 diff 的一个版本,它使用正确的日期排序来计算 returns。下面的代码在您的示例数据上使用 xts 包和 diff 来正确计算 returns.
  2. rank函数用于每天排名returns。由于rank只对单个数据向量起作用,所以apply函数用于select每一行,对returns进行排名,然后assemble排名成一个矩阵。结果矩阵将需要恢复为 xts 时间序列,这是用 Reclass 完成的。最后,为了示例的目的,将数据和结果合并到一个时间序列中可能会有所帮助,这是通过 merge.
  3. 完成的
  4. 您表示您有兴趣使用 PerformanceAnalytics 包。 xts 每个资产在其自己的列中的时间序列适用于 PerformanceAnalytics。例如,该代码使用计算出的 returns 并假设一个等权重投资组合,使用 PerformanceAnalytics 包中的 Return.portfolio 函数计算投资组合 returns 的时间序列。

您提到您拥有 900 项资产的 10 年每日数据。这个行数对于 R 来说一点也不大,但列数可能很大。我会尝试使用类似下面的代码,看看是否存在任何性能问题。如果是这样,您可以尝试几个选项。

library(xts)
#   transform to an xts time series
dfx <- xts(df[,-1], order.by=as.Date(df[,1]))
#   calculate returns; no return (NA) is calculated for first date so remove
df_ret <- diff(dfx, arithmetic=FALSE, na.pad=FALSE)-1
#   label columns containing returns
colnames(df_ret) <- sub("price", "return",colnames(df_ret))
#   calculate ranks for each row of returns, add ranks as columns to data, and restore as xts time series
df_rank <- Reclass(t(apply(df_ret, 1, rank)))
#   lable columns containing ranks
colnames(df_rank) <- sub("return","rank",colnames(df_rank))
# returns and ranks can be combined with prices if desired
dfx <- merge(dfx, df_ret, df_rank)

#  Calculate returns for a portfolio equi-weighted at beginning of period and not rebalance
library(PerformanceAnalytics)
port_ret <- Return.portfolio(R=df_ret, weights=c(.5,.5))