首页 文章

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

提问于
浏览
3

我是R的新手(我以前用过Stata) . 我目前正在重新做一些涉及的金融理论测试:

  • 宣布时间序列

  • 计算相关变量,如每日回报

  • 股票表现(横截面)

  • 表单组合

  • 运行回归 .

我的问题是:

  • 我应该使用 wide datasetlong dataset 来更方便地编写脚本并节省更多时间吗?

  • 我应该使用哪些相应的命令?

我的意思是广泛的数据集是900个股票的900列价格 . 长数据意味着1个价格列和900个行 . 该数据包括过去10年的每日数据 . 所以这是一个大规模的数据处理 . 这就是为什么你分享给我的任何经验都是宝贵的 .

Wide data example:

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

Long data example:

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

这是我工作中的障碍:

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

  • 排名股票回报 . 我还没到达这个部分 . 但是,如果有人可以帮我,如果我应该使用宽或长的数据来节省时间 . 我必须在一天内对股票的回报进行排名,然后对它们进行分组并计算每个组的参数 .

  • 运行回归和投资组合分析 . 我查看了投资组合分析包并猜测它使用了大量数据,因为给定的示例显示了许多代码作为数据帧的名称(每个股票的1个价格列) .

1 回答

  • 3

    解决您的问题:

    • R有许多表示时间序列的方法 . xts 包经常用于财务数据,由于缺少周末和假期而形成不规则的时间序列 . xts 包中包含 diff 的版本,该版本使用正确的日期排序来计算回报 . 下面的代码在示例数据上使用 xts 包和 diff 来正确计算回报 .

    • rank 函数用于对每天的回报进行排名 . 由于 rank 仅适用于单个数据向量,因此 apply 函数用于选择每一行,对返回进行排名,然后将排名组合成矩阵 . 结果矩阵需要恢复为 xts 时间序列,该序列使用 Reclass 完成 . 最后,出于示例的目的,将数据和结果组合成一个使用 merge 完成的时间序列可能会有所帮助 .

    • 您表示您对使用 PerformanceAnalytics 包感兴趣 . xts 每个资产在其自己的列中的时间序列与 PerformanceAnalytics 配合良好 . 例如,代码使用计算的回报并假设等权重投资组合,使用 PerformanceAnalytics 包中的 Return.portfolio 函数计算投资组合回报的时间序列 .

    您提到您有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))
    

相关问题