r - 使用 R : Fama MacBeth Regression - Portfolio formation and Stock return ranking

标签 r loops stata rank portfolio

我是 R 的新手(我以前用过 Stata)。我目前正在重做一些金融理论测试,其中包括:

  1. 声明时间序列

  2. 计算每日 yield 等相关变量

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

  4. 形成作品集

  5. 运行回归。

我的问题是:

  1. 我应该使用宽数据集还是长数据集来更方便地编写脚本并更好地节省时间?
  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. 声明时间序列并计算每日 yield :我发现与 Stata 相比,声明时间序列并使用它要困难得多。我尝试了 ts() 和其他一些方法,但最终我不知道如何以“智能方式”计算每只股票的每日 yield 。我试过 diff() 但它需要应用正确的日期顺序。

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

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

最佳答案

解决您的问题:

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

您提到您拥有 900 项 Assets 的 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))

关于r - 使用 R : Fama MacBeth Regression - Portfolio formation and Stock return ranking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33012741/

相关文章:

java - 在不使用任何循环或条件的情况下打印特定范围内的数字 (Java)

JAVA - 绞刑吏游戏,在未知字母中保留输入的正确字母

r - R和Stata的合并命令比较

stata - 如何导出 Spearman 相关性

R:基于多个变量/列/约束查找相似/"duplicate"条目对

database - R - Windows 中的 Microsoft Access mdb 数据库

r - 将字符串变量分组为 R 中的因子

r - 在vistime中改变颜色的问题

r - 连接到 R 中的 redis 集群

android - 如何在无限循环中不断更新 Activity 中的 TextView?