取引戦略を最適化することを目的としたアプリケーションを作成しています。簡単にするために、「ここに入る」というトレーディング戦略と、「トレードの場合はここでエグジットする」という別のトレーディング戦略があると仮定して、2 つのモデルを用意します。市場の反対側にいる場合に失う金額) と、どれだけの利益を得る必要があるか (つまり、市場が同意した場合にどれだけの利益を得るか) を示します。
簡単にするために、過去の実現取引をティックと呼びます。つまり、「ティック 28 でエントリー」した場合、これは、データセットの 28 番目のトレードの時点で、このトレードの価格でトレードをエントリーしたことを意味します。ティックはデータセットに時系列で保存されます。
ここで、データセット全体に対するエントリ戦略が 500 エントリになると想像してください。エントリごとに、正確なエントリ ティックを事前に計算できます。また、各エントリ ポイントのエグジット戦略によって決定されるエグジット ポイントを計算することもできます (これもティック数として)。各エントリについて、モデル化された損失と利益、およびこれらの損失または利益が発生したティックを事前に計算することもできます。最後に行わなければならないことは、最初に何が起こったかを計算することです。つまり、戦略の終了、損失の終了、または利益の終了です。
したがって、取引の配列を繰り返し処理し、exitTick[i] = min(exitTickByStrat[i], exitTickByLoss[i], exitTickByProfit[i]) を計算します。そして、プロセス全体が非常に遅いです (これを 1 億回行うとしましょう)。キャッシュミスが主な原因だと思います。問題は、これをどうにかして高速化できるかどうかです。自明ではない長さの 4 つの配列を反復処理する必要があります。私が思いついた 1 つの提案は、データを 4 つのタプルにグループ化することです。つまり、(entryTick、exitOnStrat、exitOnLoss、exitOnProfit) のような構造体の配列を 1 つ持つことです。キャッシュの予測可能性が向上したため、これは高速になる可能性がありますが、確かなことは言えません。これまでテストしていないのは、プロファイラーのサンプリングが信頼できないように見えるのに対し、プロファイラーの計測がアプリのリリースバイナリに対して何らかの形で機能しないためです (Intel のプロファイラーを試しました)。
最後の質問は、この問題を高速化できるかどうかです。リリース バイナリを使用したメモリ プロファイリングに使用する最適なプロファイラーは何ですか? 私はWin7、VS2010で作業しています。
編集:すべてに感謝します。元の質問をできるだけ単純化しようとしたため、混乱しました。読みやすいように、ターゲットは予想/実現利益を意味し、ストップは予想/実現損失を意味します。
オプティマイザーは力ずくです。したがって、いくつかのストラト設定 (インジケーター期間など)、最小/最大 breakEvenAfter/breakEvenBy、そしてストップ/ターゲット値をティックで与える数式があります。これらの式も最適化の対象です。したがって、私は次のような最適化の構造を持っています
for each in params
{
calculateEntries()
for each in beSettings
{
precalculateBeData()
for each in targetFormulaSettings
{
precalculateTargetsAndRespectiveExitTicks
for each in stopFormulaSettings
{
precalulcateStopsAndRespectiveExitsTicks
evaluateExitsAndDetermineImprovement()
}
}
}
}
そのため、私は可能な限り事前に計算し、必要な場合にのみ計算します。そして、30 秒のうち、計算は evaluateExitsAndDetermineImprovement() 関数で 25 秒を費やします。この関数は、元の質問で説明したこと、つまり min(exitOnPattern, exitOnStop, exitOnTarget) を選択します。関数を 1 億回呼び出す必要があるのは、すべてのパラメーターを組み合わせた組み合わせが 1 億回あるためです。ただし、最後の for サイクル内では、exitOnStops 配列のみが変更されます。それが役立つ場合は、いくつかのコードを投稿できます。すべてのコメントに感謝します!