2012-01-11 16 views
6

この質問は続きますthis oneです。株価データの転換点を特定する方法

私の目標は、株価データの転換点を見つけることです。

これまでのところ私:hereが説明したように

は、中心に5点法を使用してDr. Andrew Burnett-Thompsonの助けを借りて、平滑な価格設定を区別しようとしました。

データセットをスムージングするためにティックデータのEMA20を使用します。

グラフの各点について、1階微分(dy/dx)を取得します。 転向ポイントの2番目のグラフを作成します。 dy/dxが[-some_small_value]〜[+ some_small_value]の間になるたびに、このグラフにポイントを追加します。

問題は、以下のとおりです。 私は本当のターニングポイントを得ることはありません、私は近くに何かを得ます。 [some_small_value]で調整する

dy/dxが負から正に変わるときにポイントを追加するもう1つの方法を試しましたが、これはまた多すぎるポイントを作成します。これはEMA第3の方法は、n個の点のスライスにデータセットを分割するために、最小および最大のポイントを見つけることである

(としない1分終値の)データをチェック。これはうまくいく(理想的ではない)が、遅れている。

誰かがより良い方法がありますか?

私はあなたがあなたの最初の誘導体(さらにあなたをすべきである意味、口座に二次微分を取ることができる

enter image description here enter image description here

+1

なぜこの「タグ付きグラフアルゴリズム」ですか? – harold

+0

@harold私の推測では、彼はアルゴリズムを望んでおり、入力データをグラフ化することができます(上記参照)。 ; Dもっと深刻なことに、これは明らかにグラフアルゴリズムではありません。 – Patrick87

+0

タグが削除されました。あなたはこれをどのように解決するか考えていますか? :Dありがとう – Yaron

答えて

4

(最小/最大を第一誘導体とn点)出力の2枚の画像を添付)(y_{i-1} + y_{i+1} - 2y_i)/(dx)²を評価してください。これが特定のしきい値を上回っている場合は最大値を、それよりも低い場合は最小値を、そうでない場合はそれを破棄することができます。極値を見つける方法(y' = 0)は、この条件が鞍点にも有効であるため、多くの点を除外しなければなりません。

1

はここだけのアイデア、さまざまな角度からのソートの考え方、そしておそらく非常に悪い考えですが、分化が働いていないので、このようなものが考えかもしれません。

まず、意味のある最小X軸間隔を決定する必要があります。あなたの姿では、これを小さすぎると思うと、バンプから偽陽性を得るでしょう。これは概念的にはデータをスムーズにするという考え方に似ています。この間隔をdxと呼ぶ。

次に、サイズdxのスライディングウィンドウを使用して、あなたの曲線に対応する移動平均曲線を生成します。これを行うことについて考えることができるさまざまな方法があります(統計的な外れ値を取り除くため、またはウィンドウ内のより多くのポイントまたはより少ないポイントを使用するために)。この曲線g(x)とオリジナルの曲線f(x)を呼び出します。さらに、g(x)を計算するために使用するスライディングウィンドウ内のデータのばらつきの何らかの尺度を与える曲線h(x)を作成します(間隔から数点を使用する場合は標準偏差がうまくいくはずです)。今

は、フォームc_m(X)の曲線を計算開始= | F(X) - G(X)| - m * h(x)である。あなたはm = 1で始めることができます。c_m(x)が正である任意の点xは、局所最小/最大の候補である。ヒット数に応じて、mを増減させることができます。バイナリ検索と同様の方法でこれを行うことができます。より多くのポイントが必要な場合はm =(min + m)/ 2とし、ポイントを減らしたい場合はm =(max + m)/ 2それに応じて最大)。

ここに私が示唆しているものの例があります。我々は、次のシリーズを持っているとしましょう:

f(x) = [ 1, 2, 4, 3, 2, 3, 6, 7, 8, 7, 
      5, 4, 3, 2, 2, 3, 2, 3, 5, 8, 9] 

我々はXの周りのポイントの単純平均とることで(x)はグラムを構築DX = 5を選択:M = 1当社では

g(x) = [2.3, 2.5, 2.4, 2.8, 3.6, 4.2, 5.2, 6.2, 6.6, 6.2, 
     5.4, 4.2, 3.2, 2.8, 2.4, 2.4, 3.0, 4.2, 5.4, 6.3, 7.3] 

h(x) = [1.2, 1.1, 1.0, 0.7, 1.4, 2.4, 2.3, 1.7, 1.0, 1.5, 
     1.9, 1.7, 1.2, 0.7, 0.5, 0.6, 1.1, 2.1, 2.7, 2.4, 1.7] 

を取得:

c(x) = [0.1, xxx, 0.6, xxx, 0.2, xxx, xxx, xxx, 0.4, xxx, 
     xxx, xxx, xxx, 0.1, xxx, 0.0, xxx, xxx, xxx, xxx, 0.0] 

これは実際にはかなりうまくいっているようです。思考を分かち合いましょう。これは、平均値の定理が与えられれば、これは多かれ少なかれ分化の等価かもしれないことに注意してください。

+0

f(x)からg(x)にどれだけ正確に行くことができますか? f(x)とg(x)のデータポイント数は同じなので、単純な移動平均がどのようになるかわかりません。 – Ivan

+0

ああ、わかりました、それは動く意味です。 – Ivan

1

これはうまく動作します。Patrick87、ありがとうございます。以下の同じことを実現するために、Java関数である:

はStockPricesを想定すると、キー日付と値たstockpriceのマップを持っている(価格、平均のx = 5)

プライベートダブルgetCx(StockPrices stockPrices、LOCALDATE executionDate、int型のx doubleM){ return math.abs(getFx(stockPrices、executionDate) - getGx(stockPrices、executionDate)) - m * getHx(stockPrices、executionDate、x); }

private double getGx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getAvg(executionDate, 5); 
} 

private double getFx(StockPrices stockPrices, LocalDate executionDate) { 
    return stockPrices.getPrice(executionDate); 
} 

public double getHx(StockPrices stockPrice, LocalDate localDate, int x) { 
    //standard deviation 
    return Math.sqrt(getVariance(stockPrice, localDate, x)); 
} 

private double getVariance(StockPrices stockPrice, LocalDate localDate, int x) { 
    double sum = 0; 
    int count = 0; 
    for (int i = - (x/2); i <= (x/2) ; i++) { 
     LocalDate date = localDate.with(BusinessDay.add(localDate, i, stockPrice.getPriceMap(), 2)); 
     double avg = stockPrice.getAvg(date, 5); 
     double price = stockPrice.getPrice(date); 
     if (price != 0.0) { 
      sum += Math.pow((price - avg), 2); 
      count++; 
     } 
    } 
    return sum/count; 
} 
+0

完全なソースを提供してください。一部の実装が欠落しています。 – endeffects

関連する問題