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

时间:2015-10-08 10:10:11

标签: r loops stata rank portfolio

我是R的新手(我之前使用的是Stata)。我目前正在重新进行一些涉及的财务理论测试:

  1. 宣布时间序列

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

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

  4. 表单组合

  5. 运行回归。

  6. 我的问题是:

    1. 我应该使用宽数据集长数据集来更方便地编写脚本并节省更多时间吗?
    2. 我应该使用哪些相应的命令?
    3. 广义数据集的含义是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. 宣布时间序列并计算每日回报:我发现宣布时间序列比使用Stata要困难得多。我尝试了ts()和其他一些人,但最终我不知道如何以聪明的方式计算每只股票的每日回报率#34;。我试过了diff(),但它需要应用正确的日期顺序。

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

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

1 个答案:

答案 0 :(得分:3)

解决您的问题:

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