1

私は整数の「オンライン」シリーズを持っているので、数ミリ秒ごとに新しい番号があります。頻度は指定されていません。数が多い場合もあれば、数がない場合もあります。

実際には、この数字はいわゆる「真の価格」です。取引アプリケーションで使用しています。

今は最後の数値を「真の価格」として使用しているだけなので、シリーズはまったく追跡しません。しかし、このようなアプローチにはいくつかの問題があります。このシリーズを見てみましょう:

  1. 98; 最後 = 98
  2. 100; 最後 = 100
  3. 101; 最後 = 101
  4. 100; 最後 = 100
  5. 101; 最後 = 101
  6. 100; 最後 = 100
  7. 101; 最後 = 101
  8. 100; 最後 = 100
  9. 101; 最後 = 101
  10. 100; 最後 = 100
  11. 99; 最後 = 99
  12. 98; 最後 = 98

問題は、私の「真の価格」が非常に短期間に 100 から 101 に何度も変更されてしまうことです。真の価格を変更するたびに、多くの作業 (再計算、発注など) が必要になるため、そのような真の価格を変更する必要はありません。この変更 (100-101-100-101) は「測定の問題」によるものであり、フィルタリングする必要があります。「計測」は直せないので、ここで直さなければなりません。

アプローチの 1 つは、「3LastAverage」アルゴリズムを使用することです。

  1. 98; 3 最後の平均 = 98
  2. 100; 3 最後の平均 = 99
  3. 101; 3 最後の平均 = 99.67 => 100
  4. 100; 3 最後の平均 = 100.33 => 100
  5. 101; 3 最後の平均 = 101
  6. 100; 3 最後の平均 = 100
  7. 101; 3 最後の平均 = 101
  8. 100; 3 最後の平均 = 100
  9. 101; 3 最後の平均 = 101
  10. 100; 3 最後の平均 = 100
  11. 99; 3 最後の平均 = 100
  12. 98; 3 最後の平均 = 99

このようなアプローチが常に機能するとは限らないことがわかるように、私はまだ 100-101-100 の問題を抱えています。おそらく、より多くの数値を使用して「平均」を計算できます...しかし、そのような例のため、そのようなアプローチはうまくいきません:

  1. 99; 3lastAverage = 99 (99 が欲しい)
  2. 100; 3lastAverage = 100 (100 が欲しい)
  3. 101; 3lastAverage = 100 (101 が必要)
  4. 102; 3lastAverage = 101 (102 が必要)
  5. 103; 3lastAverage = 103 (103 が欲しい)

一般に、物事が「OK」になったときは、truePrice を最後の数字にする必要があります。

したがって、整数の「オンライン」シリーズがあるため、このシリーズのいわゆる「真の値」を計算する必要があります。これは、次のように定義されています。

  • すべてが問題なければ、これは最後の数字です
  • 直列に同じ数が多すぎる場合(測定の問題のため)、「真の値」はあまり頻繁に変化するべきではありません。最も適切な値を使用する必要があります

私の提案は次のとおりです。

  • 「真の値」が 1 秒に 2 回以上同じ価格になることを禁止するだけです。

例えば:

  1. 0.000 : 98; 真の値 = 98
  2. 0.100 : 100; 真の値 = 100
  3. 0.200:101; 真の値 = 101
  4. 0.300 : 100; 真の値 = 101 (100 は 0.2 秒前のステップ 2 で既に使用されています)
  5. 0.400 : 98; 真の値 = 101 (98 は 0.4 秒前のステップ 1 で既に使用されています)
  6. 0.500 : 99; 真の値 = 99
  7. 0.600 : 100; 真の値 = 99 (0.5 秒前のステップ 2 で 100 が使用されました)
  8. 1.500:101; 真の値 = 101 (101 が使用されてから 1 秒以上経過)。

ただし、そのようなアプローチには次のような「バグ」もあります。

  1. 99tp = 99
  2. 100tp = 100
  3. 101 tp = 101
  4. 102 tp = 102
  5. 103 tp = 103
  6. 102 tp = 103
  7. 101 tp = 103
  8. 100 tp = 103
  9. 99tp = 103
  10. 98tp = 98
  11. 97tp = 97

ここでの問題は、「tp」がレベル 103 で長時間「凍結」されていたことです。

大変な質問で大変申し訳ありません。しかし、おそらく誰かが密接な問題を解決していて、経験を共有することができます. 私の主な問題は、2 つの相反する問題を同時に解決する必要があることです。

  • 「真の価格」は、一般的な条件下での「最後の」値でなければなりません
  • 「真の価格」は頻繁に変更すべきではありません (そのため、以前の値を何らかの方法で使用する必要があります)。
  • また、いつ「一般的な」条件があり、いつ「測定上の問題」があるのか​​を判断するのは困難です。

だから私の質問は本当に漠然としていて、誰かがそのようなことを解決しようとしていたことを願っています. いつものように、この問題を解決するには「常識」を使用する必要があります。

4

1 に答える 1

5

価格の長期的 (低頻度) の変化に対応したいが、小さな短期的 (高頻度) の変動は無視します。そこで必要になるのがローパスフィルターです。

さまざまな特性を持つさまざまな種類のローパスフィルターがたくさんあります。移動平均はローパス フィルターの一種ですが、平滑化とラグを交換するという問題があります (高周波数の変動を平滑化するには、かなり長いシーケンスにわたって平均化する必要がありますが、その後、低周波の変化が明らかになるまでには長い時間がかかります)。

そのため、指数加重移動平均などの他のローパス フィルターを試して、それらが要件を満たしているかどうかを確認してください。

このタスクについてもう 1 つ言えることは、移動平均に最も近い整数をいつ再計算するかを決定することは、悪いことです。なぜなら、移動平均が 2 つの整数の中間に近い場合、小さな変動が増幅されるからです。 . (移動平均が 99.49 から 99.51 になると、丸め操作により、この小さな変動が 99 から 100 の大きな変動に増幅されます。)

代わりにすべきことは、ヒステリシスを使用してこの種の応答を回避することです。再計算を行うときは、移動平均 a の現在の値a 0 を記録し、移動平均aが少なくとも ε、つまり |移動するまで、別の再計算を行わないでください。a  − <em>a 0 | ≥ε。

于 2012-12-21T14:52:15.857 に答える