我是R的新手(我之前使用的是Stata)。我目前正在重新进行一些涉及的财务理论测试:
宣布时间序列
计算相关变量,如每日回报
排名股票表现(横截面)
表单组合
运行回归。
我的问题是:
广义数据集的含义是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
以下是我工作中的障碍:
宣布时间序列并计算每日回报:我发现宣布时间序列比使用Stata要困难得多。我尝试了ts()
和其他一些人,但最终我不知道如何以聪明的方式计算每只股票的每日回报率#34;。我试过了diff()
,但它需要应用正确的日期顺序。
排名股票回报。我还没到达这个部分。但是,如果有人可以帮我,如果我应该使用宽或长的数据来节省时间。我必须在一天内对股票的回报进行排名,然后对它们进行分组并计算每个组的参数。
运行回归和投资组合分析。我查看了投资组合分析软件包并猜测它使用了大量数据,因为给定的示例显示了许多代码作为数据框的名称(每个股票的1个价格列)。
答案 0 :(得分:3)
解决您的问题:
xts
包经常用于财务数据,由于缺少周末和假期而形成不规则的时间序列。 xts
包中包含diff
版本,该版本使用正确的日期排序来计算回报。下面的代码使用xts
包和diff
示例数据来正确计算回报。rank
函数用于对每天的回报进行排名。由于rank
仅适用于单个数据向量,因此apply
函数用于选择每一行,对返回进行排名,然后将排名组合成矩阵。结果矩阵需要恢复为xts
时间序列,该时间序列由Reclass
完成。最后,出于示例的目的,将数据和结果组合成一个使用merge
完成的时间序列可能会有所帮助。PerformanceAnalytics
包感兴趣。 xts
时间序列与每个资产在其自己的列中与PerformanceAnalytics
配合良好。例如,代码使用计算的回报并假设等权重投资组合,使用Return.portfolio
包中的PerformanceAnalytics
函数计算投资组合回报的时间序列。您提到您有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))