У меня есть матрица из 10 акций на 100 дней (100 строк и 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 на 10). Для выбранных акций на предыдущем шаге я проверяю сигналы и выбираю акции с двумя самыми высокими сигналами, а также акции с двумя самыми низкими сигналами и сохраняю их индекс в длинной краткой матрице. (+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
}
Любая помощь в преобразовании этих циклов в операции с массивами будет принята с благодарностью!