皆さん、R でトレーディング戦略のバックテスト コードを適切に構築する方法を学び始めたところです。最初の例として、t 日の終値が 50 より大きいときにインデックスをロングする非常に単純な戦略をテストしています。日移動平均. 終値が 50 日間の平均を下回った場合、ロング ポジションは売却されますが、戦略が完全にショートになることはなく、ロングまたはフラットになるだけです。
したがって、これを適切にテストするために、以下のネストされた if/else if ステートメントを使用してかさばる for ループをコーディングしました。これはあまり速く実行されません。速度を向上させる一般的な方法があるかどうか疑問に思っています。Rはベクトル化されているはずですが、コードをそのまま実行することはできません。
以下のように「データソート」と呼ばれるデータフレームがあり、毎日「シグナル」と「位置」の列を追加したいとします。そのため、日ごとに時間インデックス i を使用してループし、「信号」列と「位置」列を日ごとに埋めます。位置ベクトルは値 0 または 1 のみを取ることができ、信号は値 -1、0、1 のみを取ることができます。基本的な問題は、いつでも信号ベクトル値が前日の位置 t-1 に依存することです...これにより、操作をベクトル化することができなくなりますか、それとも私はその考えが間違っていますか?
アドバイスをいただければ幸いです。また、quantmod および quantstrat パッケージにはいくつかのバックテスト機能が含まれていることを認識しています...最終的にはこれらのパッケージが処理するにはシグナルが複雑になりすぎるため、自分で構築したいと思います。ありがとうございました。
Date CO2 MA
2006-01-03 61.70 57.88
2006-01-04 62.02 57.95
2006-01-05 61.35 57.96
2006-01-06 62.91 58.03
2006-01-09 62.32 58.09
2006-01-10 62.30 58.14
for(i in 1:length(datasort$CO2)) {
if (i==1) {
if(datasort$CO2>=datasort$MA) {
datasort$signal[i]<-1
datasort$position[i]<-1}
else if (datasort$CO2[i]<datasort$MA[i]){
datasort$signal[i]<-0
datasort$position[i]<-0}}
else if (i>1){
if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==0))
{datasort$signal[i]<-1
datasort$position[i]<-1}
else if ((datasort$CO2[i]>=datasort$MA[i])&(datasort$position[i-1]==1))
{datasort$signal[i]<-0
datasort$position[i]<-datasort$position[i-1]}
else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==1))
{datasort$signal[i]<- -1
datasort$position[i]<-datasort$position[i-1]-1}
else if ((datasort$CO2[i]<datasort$MA[i])&(datasort$position[i-1]==0))
{datasort$signal[i]<-0
datasort$position[i]<-datasort$position[i-1]}
}}