Rを使用していくつかの投資戦略をバックテストしています。以下のスクリプトがあります。
set.seed(1)
output.df <- data.frame(action=sample(c("initial_buy","sell","buy"),
10000,replace=TRUE),stringsAsFactors=FALSE)
output.df[,"uid"] <- 1:nrow(output.df)
cutrow.fx <- function(output.df) {
loop.del <- 2
while (loop.del <= nrow(output.df)) {
if ((output.df[loop.del,"action"]=="initial_buy" &
output.df[loop.del-1,"action"]=="initial_buy")|
(output.df[loop.del,"action"]=="sell" &
output.df[loop.del-1,"action"]=="sell")|
(output.df[loop.del,"action"]=="buy" &
output.df[loop.del-1,"action"]=="sell")|
(output.df[loop.del,"action"]=="initial_buy" &
output.df[loop.del-1,"action"]=="buy")){
output.df <- output.df[-loop.del,]
} else {
loop.del <- loop.del + 1
}
}
output.df<<-output.df
}
print(system.time(cutrow.fx(output.df=output.df)))
戦略は次のことを決定します。1)いつ株式の購入を開始するか。2)いつ株式に追加拠出を追加するか。3)すべての株式をいつ売却するか。過去10年間の株価のデータフレームがあります。株式を売買する日付を示す3つのスクリプトを作成し、3つの結果とorder
それらを組み合わせます。
「不可能なアクション」の一部を削除する必要があります。たとえば、事前に新しいユニットを購入しないと同じ株を2回販売できないため、上記のスクリプトを使用して、これらの不可能なアクションを削除しました。しかし、for
ループはちょっと遅いです。
それをスピードアップするための提案はありますか?
アップデート01
私はを次のように更新しcutrow.fx
ましたが失敗します:
cutrow.fx <- function(output.df) {
output.df[,"action_pre"] <- "NIL"
output.df[2:nrow(output.df),"action_pre"] <- output.df[1:(nrow(output.df)-1),"action"]
while (any(output.df[,"action_pre"]=="initial_buy" & output.df[,"action"]=="initial_buy")|
any(output.df[,"action_pre"]=="sell" & output.df[,"action"]=="sell")|
any(output.df[,"action_pre"]=="sell" & output.df[,"action"]=="buy")|
any(output.df[,"action_pre"]=="buy" & output.df[,"action"]=="initial_buy")) {
output.df <- output.df[!(output.df[,"action_pre"]=="initial_buy" & output.df[,"action"]=="initial_buy"),]
output.df <- output.df[!(output.df[,"action_pre"]=="sell" & output.df[,"action"]=="sell"),]
output.df <- output.df[!(output.df[,"action_pre"]=="sell" & output.df[,"action"]=="buy"),]
output.df <- output.df[!(output.df[,"action_pre"]=="buy" & output.df[,"action"]=="initial_buy"),]
output.df[,"action_pre"] <- "NIL"
output.df[2:nrow(output.df),"action_pre"] <- output.df[1:(nrow(output.df)-1),"action"]
}
output.df[,"action_pre"] <- NULL
output.df<<-output.df
}
私は、ジョンによって何らかの形でインスピレーションを得て(答えで彼が何を意味するのか正確にわからないので、どういうわけか使用しました)、ベクトル比較を使用しました。繰り返しには、whileループを使用します。しかし、出力は同じではありません。
ここでのforループは避けられませんか?