【发布时间】:2012-02-24 16:08:44
【问题描述】:
我有一个 100 天(100 行和 10 列)的 10 个股票收益矩阵。我正在对其应用以下操作。
我使用了循环,这在更大的数据集上需要很长时间。我确信这可以使用数组操作来简化。
1) 选择每行中前 3 和后 3 的值,并将值的索引存储在“选择”矩阵(也是 100x10 向量)中作为“1”
Ret=array(rnorm(1000),dim=c(100,10))
select=array(rep(0,1000),dim=c(100,10))
Ret.top <- t(apply(Ret, 1, order, decreasing=T)[1:3,])
Ret.bottom <- t(apply(Ret, 1, order, decreasing=F)[1:3,])
for( i in 1:dim(Ret)[1])
{
select[i,Ret.top[i,]]=1
select[i,Ret.bottom[i,]]=1
}
2) 然后我得到了一个信号向量,该向量每天为所有股票计算(信号矩阵,100 x 10)。对于上述步骤中选定的股票,我检查信号并选择具有 2 个最高信号的股票和具有 2 个最低信号的股票,并将它们的指数存储在一个多空矩阵中。 (+1 表示最高信号,-1 表示最低信号)
signal=array(rnorm(1000),dim=c(100,10))
longshort= array(rep(0,1000),dim=c(100,10))
for( i in 1:dim(Ret)[1])
{
x=order(signal[which(select[i,]==1)],decreasing=T)[1:2]
longshort[i,x]=1;
y=order(signal[which(select[i,]==1)],decreasing=F)[1:2]
longshort[i,y]=-1
}
任何将这些循环转换为数组操作的帮助将不胜感激!
【问题讨论】:
-
您似乎只使用了
signal[which(select[i,]==1)]中的前10 个信号。此外,x 将始终是数字 1-6,因此对于索引 6-10,您永远不会有任何长短信号!
标签: arrays r matrix indexing signals