0

取引戦略を最適化することを目的としたアプリケーションを作成しています。簡単にするために、「ここに入る」というトレーディング戦略と、「トレードの場合はここでエグジットする」という別のトレーディング戦略があると仮定して、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 配列のみが変更されます。それが役立つ場合は、いくつかのコードを投稿できます。すべてのコメントに感謝します!

4

3 に答える 3

1

取引戦略についてはよくわかりませんが、通常は最適化を行います。さて、多くの最適化方法があります。同様に、別の最小関数を使用するコンテナのタイプ(boostにはstlライブラリよりも多少高速な関数があると思います)、同じ計算を減らしてみてください。また、より高速な関数を使用して速度を上げるか、アルゴリズムを再設計することで最適化できます。

プロファイリングには、Win7 x64 で GlowCode を使用します。リリース ビルドでも問題ありません。

于 2012-10-04T10:39:25.157 に答える
0

それで、いくつかの作業の後、Alexandre C のアドバイスを理解しました。キャッシュミスのプロファイリングを実行したとき、evaluateExits() 関数の 15M 呼び出しのうち、30K のキャッシュミスしかないことがわかりました。したがって、この関数のパフォーマンスは妨げられません。キャッシュによる。したがって、VTune が実際に有効な結果を生成していることを「信じ始める」必要がありましたが、奇妙ではあります。VTune 出力の分析が現在のスレッドの名前と一致しないため、新しいスレッドを開始することにしました。意見や推奨事項をありがとうございました。

于 2012-10-10T19:04:53.567 に答える
0

たぶん私はあなたのシステムを完全に誤解して
いますが、あなたが「事前計算」するのは何ですか、いつ、なぜ1億回ですか???

役立つかどうかはわかりませんが、システムが大幅に簡素化される可能性があります - 2 つの一般的な取引戦略があります: (説明は私のものであり、公式のものではありません
) 1) 「固定点出口」 - 取引が発生すると、すべての出口点が計算されます一度、市場の状況/価格に対して定期的にチェックされます。
2) 「可変ポイント エグジット」 - 市場が動くと、エグジット ポイントが再計算されます (通常は、より多くの利益を確保する/損失を減らすため)。

ケース 1) 実際の計算は 1 回しか行われないため、非常に高速である必要がありますケース2
) 計算は毎回行われますが、さまざまな方法で最適化することができます。ポイントを取得し、実際の市場状況に近いもののみを取得して再計算します。

どのキャッシュ ミスについて言及しているのかわかりません。あなたのデータキャッシュ?CPUキャッシュ?

于 2012-10-04T10:25:03.140 に答える