Я пытаюсь запустить сценарии моделирования, которые, в свою очередь, должны предоставить мне лучший сценарий для заданной даты, обратно протестированный на пару месяцев. Вход для конкретного сценария имеет 4 входных переменных, причем каждая из переменных может находиться в 5 состояниях (625 перестановок). Поток модели выглядит следующим образом:Параллельная обработка для нескольких вложенных циклов
- Simulate 625 сценарии, чтобы получить каждый из своей прибыли
- ранга каждые из сценариев в зависимости от их прибыли
- Повторите процесс через расширяющееся окно 1 дня для последние 2 месяца, начинающиеся 1 декабря 2015 года, - создание временных рядов рангов по каждому из 625 сценариев.
Несчастливый результат для этого - 5 вложенных для циклов, которые могут занять очень много времени. Я взглянул на пакет foreach
, но я обеспокоен тем, как объединение результатов будет работать в моем сценарии.
текущий код, который я использую работает следующим образом, сначала я создаю возможные состояния каждого из входов вместе с окном
a<-seq(as.Date("2015-12-01", "%Y-%m-%d"),as.Date(Sys.Date()-1, "%Y-%m-%d"),by="day")
#input variables
b<-seq(1,5,1)
c<-seq(1,5,1)
d<-seq(1,5,1)
e<-seq(1,5,1)
set.seed(3142)
tot_results<-NULL
Следующая вложенная для петель перейти к пробегают моделирования для меня ,
for(i in 1:length(a))
{
cat(paste0("\n","Current estimation date: ", a[i]),";itteration:",i," \n")
#subset data for backtesting
dataset_calc<-dataset[which(dataset$Date<=a[i]),]
p=1
results<-data.frame(rep(NA,625))
for(j in 1:length(b))
{
for(k in 1:length(c))
{
for(l in 1:length(d))
{
for(m in 1:length(e))
{
if(i==1)
{
#create a unique ID to merge onto later
unique_ID<-paste0(replicate(1, paste(sample(LETTERS, 5, replace=TRUE), collapse="")),round(runif(n=1,min=1,max=1000000)))
}
#Run profit calculation
post_sim_results<-profit_calc(dataset_calc, param1=e[m],param2=d[l],param3=c[k],param4=b[j])
#Exctract the final profit amount
profit<-round(post_sim_results[nrow(post_sim_results),],2)
results[p,]<-data.frame(unique_ID,profit)
p=p+1
}
}
}
}
#extract the ranks for all scenarios
rank<-rank(results$profit)
#bind the ranks for the expanding window
if(i==1)
{
tot_results<-data.frame(ID=results[,1],rank)
}else{
tot_results<-cbind(tot_results,rank)
}
suppressMessages(gc())
}
Моя самая большая проблема заключается в связывании результатов, учитывая, что действия внешнего цикла находятся в зависимости от мощности внутренних петель.
Любой совет о том, как продолжить, будет очень признателен.
Из вашего кода кажется, что вы можете просто векторизовать все это? С 'expand.grid (a, b, c, d, e)' в качестве вашего ввода. – Laterow
Большое вам спасибо за полезный комментарий. Мой фон, к сожалению, не основан на программировании, поэтому, хотя я понимаю концепцию «векторизации» проблемы, я ранее не реализовал эти структуры. Знаете ли вы о хорошем источнике, возможно, где я могу взглянуть на некоторые примеры? Или, может быть, если бы вы были настолько любезны, чтобы предоставить образец слова вложенной петли с функциями 3 'for', которые я мог бы просто создать из –