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