FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

時系列データに適した凹包(concave hull)アルゴリズム

時系列データを凹包(concave hull)したがる人なんて、まずいないとは思うけど、チャートパターン等をプログラミングしようと考えてる人には役立つかも・・・。

f:id:fxborg:20171119230238p:plain(USDJPY 4h)

凸包と凹包

凸包にはしっかりとした定理(wiki参照)があるのですが、凹包には「これが正しい凹包」というようなものは無いようです。

凸包を作成するには、点の集合に対して直線を押し当てながら取り囲んでいくのですが、凹包の場合は直線の代わりに棒(線分)や曲線などを押し当てて凹みを作っていきます。

凹包のアルゴリズムとしては「アルファ・シェイプ法」、「スイング・アーム法」、「K近傍法」等があります。ただ、時系列データにそのまま適用できるものはありませんでした。

時系列データに向かない理由 

そもそも野生動物の行動圏推定などのデータを扱うものなので無理もないのですが・・・。(行動圏推定の基礎知識2014.8 ,スライド)

時系列データ(特にFX等)には、

  1. ・X軸方向に延々と伸長していく。
  2. ・高値と安値しか使わない(データは疎ら)。
  3. ・データに順序がある。
  4. ・リペイントはさせたくない。

のような特徴があるので、色々試したのですがどうも上手くいきませんでした。

上手くいかない例

まず、アルファシェイプなどの曲線などを深く押し当てるアルゴリズムの場合は、X軸方向に細長い形状だと大半の点が選ばれてしまうので、チャートの形状を見るような場合には向かないと感じました。(これは好みかな)

f:id:fxborg:20171120100422p:plain

(円弧を押し当てる例)

また、スイングアーム法の様に各点の距離を基に局所的な凸包を行っていくと時間を飛び越した点を繋いでしまう場合があります。これもやはりNGです。

f:id:fxborg:20171120103901p:plain
(スイングアーム法の例)

それから、K近傍法については距離の近いK個の点をグループ化して凸包を行うものですが、時系列データのX軸上の密度は均一なのであまり意味はありません。

時系列データに適した方法

いろいろと考慮されたアルゴリズムは時系列データには向かないようなので、X軸方向の距離だけでグループ化し凸包を行いました。

f:id:fxborg:20171120111520p:plain

この方法は真っ先に思い付いた方法で単純すぎて試してなかったのですが、結局こちらの方法に落ち着きました。オンライン処理が出来てリペイントを起こさないのがよいところです。

最後に

今回は凹包のアルゴリズムについて調べてみました。時系列データを凹包するのはチャーティストぐらいだと思うので自分なりの考えで行ってみました。これを基礎にZIGZAGやチャートパターンなどのインジケーターに繋げていきたいと思います。

こちらからどうぞ

Libraries/concave.zip
Libraries/concave.dllKaspersky VirusDesk にて検査済み)
indicators/concave.mq5 

※ATAN2関数を高速化する為にこちらのコードを利用させていただきました。