実行にかなりの時間がかかるコードがあります。私の概算によると、テストしたい一連の組み合わせで実行するには数日かかるため、常に小さいセットで実行します。そのため、これを foreach ループ構成に変換して、マルチコア プロセッサを利用できるようにしたいと考えています。次のコードを foreach ループに変換するのに苦労しています。
pcall=c
lcall=d
pandlcall=c()
pandl=c()
cltime=c()
clpr=c()
for (i in 1:(dim(poss)[1]-1)) {
for (j in 1:(length(b)-poss[i,2])) {
if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]>=pcall) {
pandlcall[i]=1
pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
cltime[i]=poss[i,2]+j
clpr[i]=b[poss[i,2]+j]
break
} else {
if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]<=lcall) {
pandlcall[i]=-1
pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
cltime[i]=poss[i,2]+j
clpr[i]=b[poss[i,2]+j]
break
} else {
next
}
}
}
}
基本的に私は外国為替のバックテストを作成しようとしています. ご覧のとおり、上記のコードは、利益または損失の特定の基準が作成されたときに特定の値を保存します。両方のループを実行した後、 の data.frame が必要ですpandlcall, pandl, cltime, clpr
。そのため、各反復中にこの値をベクトルとして保存します。ご覧のとおり、ループを実行している別の data.frames ですb
。poss
dopar foreachで使えるように作り直すのに何日も苦労しました。試行錯誤の中で、ベクトルからリストへの値の保存を置き換えたので、たとえば、pandlcall[i]=1
持っていたreslist[[1]][i]=1
のではなく、最終的に data.frame ではなくリストを持っていました。ループの前に、この空のリストを作成しましたreslist=list(pandlcall,pandl,cltime,clprice)
。
これら 2 つの基本的な for ループ (i & j) では機能しますが、外側の for ループを foreach ループに「置き換える」と、もちろん機能しません。私が念頭に置いていたアイデアは、これら 4 つのオブジェクト (「ベクトル」) を持つリストを作成し、i 番目のループごとに各オブジェクトの i 番目の位置に値を配置するようなものでした。