読者です 読者をやめる 読者になる 読者になる

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

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

スポンサーリンク

MTA区間線形近似アルゴリズムをPythonに移植。

MTA(マルチスケール・トレンド・アナリシス)は Ilya Zaliapin氏らにより開発された区間線形近似アルゴリズムです。たまたまこちらのブログで知りました。

こちらにMATLABによる実装があったので、さっそくPythonに移植してみました。
(とりあえず動いたレベル)

f:id:fxborg:20170307032721p:plain

こんな感じです。

MATLABとPythonの移植について

MTAアルゴリズムの詳細についてはオリジナル(PDF)をご覧いただくとして、今回はMATLABからPythonへ移植作業について・・・です。

まずはMATLABのコードを「そのまま動かせないかな?」と調べてみたらOctaveというフリーソフトがありました。

GNU Octave

https://www.gnu.org/software/octave/

 MATLAB との互換性

Octaveは、MATLABとの互換性を主に目指しており、MATLABの機能の多くをOctaveも持っている。またMATLABのために書かれたプログラムも修正せずに動作するものが多い。

  1. 1.行列を基本のデータ形式にしている
  2. 2.複素数に対応
  3. 3.強力なbuild-in関数と、ライブラリを持つ
  4. 4.ユーザ定義関数によって拡張可能

GNU Octave - Wikipedia

試してみたところ「Statisticsパッケージ」を追加したらそのまま動きました。また、ステップ実行でのデバックも行なえるようです。

MATLABからPython移行メモ

MATLABからPythonへ移行した際に、以下のような点でハマりました。 

リストのインデックスの違い

MATLABでは配列のインデックスは1から始まります。Pythonは0始まりなので地味に応えます。

【MATLAB】
arr=[10 20 30 40 50]
for i=1:5    
   disp(arr(i)):
end;


【Python】

arr=[10, 20, 30, 40, 50]

for i in range(5):
   print(arr[i])

 

リストの範囲指定(スライス)方法の違い

さらにリストの範囲を指定する際の指定方法が微妙に違います。

【MATLAB】

arr=[10 20 30 40 50]
arr(2:4)   → [20 30 40]


【Python】
arr=[10, 20, 30, 40, 50]
arr[1:4]  → [20,30,40]

セル配列の移植

MATLABには「セル配列」というデータ型があるのですが、ジャグ配列などを扱う時などに使うようです。

【MATLAB】
jag=cell(3,1);
jag(1,1) = [1];
jag(2,1) = [1 2];
jag(3,1) = [1 2 3];

>>
{
[1,1] = [1]
[2,1] = [1 2]
[3,1] = [1 2 3]
}


【Python】
jag=[[]] * 3
jag[0] = [1]
jag[1] = [1, 2]
jag[2] = [1, 2, 3]

>>
[ [1], [1, 2], [1,2,3] ] 

 他にもいろいろありましたが、リストの扱いが微妙に違う点が一番やっかいですね。

最後に

今回はMTA区間線形近似アルゴリズムのコードをPythonに移植してみました。最終的にはcAlgoで使いたいのですが、実際に使う際は計算の簡略化が必要かもしれません。

それからOctaveはIDEがよいですね。 気になるMATLABのコードを見つけたら、今後はOctabeで試してみたいと思います。

こちらからどうぞ