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

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

スポンサーリンク

N次多項式フィットに行列を使う方法

Gao 博士のサイトで AFAのコード を見ていたら、多項式フィットを行う処理が次のように書き換えられてありました(AFAはフラクタル解析を行うアルゴリズムです)。

seg_data = data(xi);
%slope = polyfit(xi, seg_data', fit_order);
%left_trend1 = polyval(slope, xi);
% to be replaced by pre-calculated coefficients
left_trend = (A_coeff * seg_data)';

(前述のサイトにある detrending_method.m より引用)

polyfit() はMATLABで多項式近似を行う関数ですが、そこはコメントアウトされていて代わりに「left_trend = (A_coeff * seg_data)';」と書いてあります。

A_coeffという行列との積をとっているようですが、この行列の中身が気になったのでプロットすると、このようなグラフが表示されました。f:id:fxborg:20170524190848p:plain

これだけで多項式フィットができるなんてちょっと不思議ですね。よく分らなかったので計算過程を可視化してみました。

EXCELの行列関数

EXCELで行列関数を使ったことが無かったのですが、調べてみると MINVERSE 関数MMULT 関数 が使えるようです。

行列関数の使い方はちょっと分りづらくて

  1. 1.計算結果を出力する範囲を選んだ状態でF2キーを押す。
  2. 2.行列関数に与える範囲を指定した後に CTRL+SHIFT+Enter を押す。

という厄介な手順をふみます。こちらの動画などを参考にしてみてください。

 フィルターの範囲を定義

・・・とりあえず、Gao博士のコードに沿ってフィルターが作られる過程を追ってみました。まずは、対象データの長さを基にフィルターの大きさを定義しています。データの中央位置が0になるように調整しているようです。

f:id:fxborg:20170524213320p:plain

多項式の次数に合わせて行列を作成

上で定めた範囲を横軸としてn次関数のグラフを作ります。例えば、データ数7に対して、次数が2次の場合と4次の場合の例を示します。

f:id:fxborg:20170524225105p:plain

  • ・二次の多項式用の行列が行列1aでこのプロットがグラフ1aです。
  • ・四次の多項式用の行列が行列1bでこのプロットがグラフ1bです。

係数を求める

 n次関数を記録した行列Aを作成した後のプログラムはこう続きます。

coeff_output = inv(  A'  *  A ) *  A' ;

この式の意味をデータ数=7、次数2の例を使ってあらわすとこんな感じです。

1.A' * A を計算します。

f:id:fxborg:20170525011124p:plain

2.inv(A' * A ) を計算します。

f:id:fxborg:20170525011713p:plain

3.2の結果に Aの転置行列を掛けます。

f:id:fxborg:20170525013015p:plain

これで係数行列の出来上がりました。この係数行列を転置してプロットしてみるとこのようなグラフになりました。(何なのかは知らない・・・)

f:id:fxborg:20170525014126p:plain

最後に、行列 A と coeff_output を掛けてフィルタの完成です。

f:id:fxborg:20170525015113p:plain

このフィルターをプロットすると最初のグラフが現れます。

f:id:fxborg:20170525015227p:plainこのフィルタを使うと一発で多項式フィットが行えます。

f:id:fxborg:20170525020238p:plain

入力データと近似値をプロットするとこんな感じです。

f:id:fxborg:20170525021229p:plain

  1. ・青・・・入力データ
  2. ・赤・・・近似値

最後に

今回はGao博士のプログラムにある多項式のフィット関数について調べてみました。

アルゴリズム名もググってみたのですが、ちょっと見つかりませんでした。
(こっちにもありました。:最小二乗法の行列表現(一変数,多変数,多項式) | 高校数学の美しい物語 )

事前にフィルタを作ってしまえば、あとは掛け算するだけなのでプログラムも簡単そうです。一応、X軸が等間隔に並んでるデータのみという制約があるので注意が必要です。