5

私は専門のプログラマーではありませんが、TradeStation と呼ばれる財務チャート パッケージでいくつかのテクニカル インジケーターが表示される方法を変更しようとしています (特定のチャート サプライヤーが関連しているわけではありません)。

ここに問題があります: ほとんどのインジケーターはゼロ点の周りにプロットされ、時にはこの点の近くで振動し、時には遠く離れて振動します. インディケータのプロット方法を変更して、ゼロ付近でさらに振動するようにしたいと考えています。しかし、ここがトリッキーな部分です。私はそれらの形状をあまり歪めたくありません。多少の変更は問題なく避けられませんが、インジケーターが元の状態を認識できるようにしたいと考えています。

過去に私は多くの方法を試しましたが、1 つの方法は対数タイプのスケールを使用していましたが、非常に高い値の振動がほとんど重要ではないため、これは成功しませんでした。これは目標ではありません。目標は、インジケーターの任意の 1 つの振動をほぼ同じに保ちながら、ゼロ (中心) に近づけるように配置を変更することです。または別の言い方をすれば; 目標は、インジケーターが同様の形状の振動を実行するようにすることですが、これらの振動の中心はゼロ (インジケーター スケールの中心) に近づける必要があります。

誰かがこれを行うことができる方法を知っていますか、または考えることができますか? 元の値にあまり歪みを与えずに、価格シリーズを中心点の周りでより振動させ続けるのに役立つアルゴリズムはありますか?

これに関するヘルプは大歓迎です、ありがとう。

==UPDATE== ここに画像の説明を入力 ピンクの線はオリジナルのオシレーターで、私が描いた黒い線です。これは私の目標が何であるかを大まかに表しています。円で囲まれた領域は、ゼロ値が振動のほぼ中心にあるように、線がゼロと交差する場所を示しています...しかし、振動の全体的な形状は元のものと比較して認識可能なままであり、高値の不一致も少なくなります。および各振動の低値。つまり、値がより類似しています。さまざまな指標にいくつかの異なるトレンド除去関数を追加しようとしましたが、これは形状を歪めすぎることがわかりました。

更新 2

y 軸を 50% と 80% で直線的に縮小して分割しようとしましたが、残念ながら、これはスケール ファクターと同じように機能するようです。これは正しいです?異なる振動間の関係は変わらないようです。私のプロット例を見ると、黒線で描かれた線はより安定した高低振動を示しています。つまり、値/サイズがより類似しており、これが重要な目標です。

次に、プロットにハイパス フィルターを追加して、どのような結果が得られるか、また目標に少しでも近づくかどうかを確認します。

いつものように、感謝の気持ちを込めてコメントを投稿してください。

クリス

更新 3

また、インジケーターにハイパス フィルターを実装しました。これもうまくいきませんでした。これもスケールファクターとして機能しているようです。私が本質的に求めているのは、大きな振動を小さくし、小さな振動を大きくすることです。使用されているインジケーターをより同期した範囲に持ち込む - 問題のインジケーターの基本的なプロパティを維持しながらこれを行います。それを説明するより良い方法は、私が減衰式を求めているということでしょうか?

誰か他のアイデアや私が試してみるべきことはありますか?

4

3 に答える 3

4

オーダーメイドの何かをしたい場合は、たとえば、フーリエ変換の低周波成分をフィルタリングできます。

次の信号があるとします。

ここに画像の説明を入力

次に、FFT を計算し、より高い周波数成分のみを保持します。コンポーネントの最初の 1.5% を無視するとします。元の信号と結果の振動信号の結果のプロットは次のとおりです。

ここに画像の説明を入力

チッ!

編集 2

これは、上記のハイパス フィルターに期待できることであり、低周波成分を単に処理するのではなく、指数減衰を追加します。

Mathematica でのプログラム (念のため):

centerOsc[x_] := 
  Module[{list, n, fp, coef, s}, 
   list = (Transpose@FinancialData[#, "Jan. 1, 2005"])[[2]] &@x;
   n = Length@list;
   fp = Transpose[{N[Range[n]]/n, list}];
   coef = FourierDST[list, 1]/Sqrt[n/2];
   coef = Table[N[coef[[i]] (1 - E^(-i/6))], {i, 1, Length@coef}];
   s = IntegerPart[Length@coef/100]; s = 1;
   {fp, {#, 
       Sum[coef[[r]]*Sin[Pi r #], {r, s, n - 1}]} & /@ (N[Range[n]]/
       n)}];
l = {"GE", "GOOG", "IBM", "MSFT"} ;(*Real prices from*)
GraphicsGrid@
 Partition[ListLinePlot[centerOsc[#],
     Axes -> False, Frame -> True, PlotLabel -> #,
     PlotRange -> {{0.1, .9}, Full}, 
     Epilog -> Line[{{0, 0}, {1, 0}}]] & /@ l, 2]

ここに画像の説明を入力

編集 2

前回の更新によると、ご希望の内容をより簡単に実現できるようです。y 軸を直線的に 50% と 80% で割って得られる結果を確認してください (プロットから抽出したデータを使用) :

ここに画像の説明を入力

あなたのプロットと比較してください:

ここに画像の説明を入力

于 2011-03-28T02:18:20.030 に答える
1

最初に提案するのは、すべてのインジケーターを平均0と標準偏差1に標準化することです。これにより、少なくともすべてのインジケーターが0を中心に配置されます。

http://en.wikipedia.org/wiki/Standard_score

-ラルフ・ウィンターズ

于 2011-03-28T15:38:02.203 に答える
0

私はあなたの例で入力/出力信号の低周波成分をマークしました: ここに画像の説明を入力 @belisarius があなたが望むものを言っているようです - 信号に FFT を実行し、低周波部分を削除してください。つまり、ハイパス フィルターアルゴリズムが必要です。ところで、ハイパス フィルターは、1D 畳み込みとハイパス カーネルでも実装できます。たとえば、3 成分のカーネル ベクトルの場合、ハイパス カーネルは[-1; 3; -1]. 私の意見では、畳み込みを使用したハイパス フィルターの実装が最も簡単です。ただし、通常、CPU 使用率に関しては、FFT による実装が最も高速です。

h番目

于 2011-03-28T15:59:36.613 に答える