使用 R:Fama MacBeth 回归 - 投资组合形成和股票 return 排名
Using R: Fama MacBeth Regression - Portfolio formation and Stock return ranking
我对R很陌生(我以前用过Stata)。我目前正在重做一些金融理论测试,其中涉及:
声明时间序列
每天计算相关变量returns
排名股票表现(横截面)
形成投资组合
运行 回归。
我的问题是:
- 我应该使用wide dataset还是long dataset来写脚本更方便省时?
- 我应该使用哪些相应的命令?
我所说的宽数据集是指 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
以下是我在工作中遇到的障碍:
声明时间序列并每天计算return:我发现与Stata相比,声明时间序列并使用它要困难得多。我尝试了 ts()
和其他一些方法,但最终我不知道如何计算 "smart way" 中每只股票的每日 return。我试过 diff()
但它需要应用正确的日期顺序。
排名股票returns。我还没有达到这一部分。但是,如果我应该使用宽数据或长数据以节省时间,如果有人可以帮助我。我将不得不在一天内对 return 个股票进行排名,然后将它们分组并计算每组的参数。
运行 回归和投资组合分析。我查看了投资组合分析包并猜测它使用了广泛的数据,因为给定的示例将许多代码显示为数据框的名称(每只股票有 1 个价格列)。
解决您的问题:
- R 有多种表示时间序列的方法。
xts
包经常用于因缺少周末和节假日而形成不规则时间序列的金融数据。 xts
包包含 diff
的一个版本,它使用正确的日期排序来计算 returns。下面的代码在您的示例数据上使用 xts
包和 diff
来正确计算 returns.
rank
函数用于每天排名returns。由于rank
只对单个数据向量起作用,所以apply
函数用于select每一行,对returns进行排名,然后assemble排名成一个矩阵。结果矩阵将需要恢复为 xts
时间序列,这是用 Reclass
完成的。最后,为了示例的目的,将数据和结果合并到一个时间序列中可能会有所帮助,这是通过 merge
. 完成的
- 您表示您有兴趣使用
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))
我对R很陌生(我以前用过Stata)。我目前正在重做一些金融理论测试,其中涉及:
声明时间序列
每天计算相关变量returns
排名股票表现(横截面)
形成投资组合
运行 回归。
我的问题是:
- 我应该使用wide dataset还是long dataset来写脚本更方便省时?
- 我应该使用哪些相应的命令?
我所说的宽数据集是指 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
以下是我在工作中遇到的障碍:
声明时间序列并每天计算return:我发现与Stata相比,声明时间序列并使用它要困难得多。我尝试了
ts()
和其他一些方法,但最终我不知道如何计算 "smart way" 中每只股票的每日 return。我试过diff()
但它需要应用正确的日期顺序。排名股票returns。我还没有达到这一部分。但是,如果我应该使用宽数据或长数据以节省时间,如果有人可以帮助我。我将不得不在一天内对 return 个股票进行排名,然后将它们分组并计算每组的参数。
运行 回归和投资组合分析。我查看了投资组合分析包并猜测它使用了广泛的数据,因为给定的示例将许多代码显示为数据框的名称(每只股票有 1 个价格列)。
解决您的问题:
- R 有多种表示时间序列的方法。
xts
包经常用于因缺少周末和节假日而形成不规则时间序列的金融数据。xts
包包含diff
的一个版本,它使用正确的日期排序来计算 returns。下面的代码在您的示例数据上使用xts
包和diff
来正确计算 returns. rank
函数用于每天排名returns。由于rank
只对单个数据向量起作用,所以apply
函数用于select每一行,对returns进行排名,然后assemble排名成一个矩阵。结果矩阵将需要恢复为xts
时间序列,这是用Reclass
完成的。最后,为了示例的目的,将数据和结果合并到一个时间序列中可能会有所帮助,这是通过merge
. 完成的
- 您表示您有兴趣使用
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))