Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメント

管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://hachisue.blog65.fc2.com/tb.php/111-5695e52b
この記事にトラックバックする(FC2ブログユーザー)

移動平均とフィルタ・・・

移動平均線は、信号処理で云う処の ”ローパス フィルタ:高域遮断” なのですが、
その雑談を少しばかり・・・。

移動平均の代表的な所で、
 1) 単純移動平均 : SMA
 2) 指数平滑移動平均 : EMA
 3) 加重移動平均 : WMA
 4) 三角移動平均 : TMA

いずれも、信号処理の考え方をすれば、
 元の生データ{x1、x2、・・・、xn} に対し、重付け{w1、w2、・・・、wn} によって
 たたみこみ演算をする 線形変換(linear transformation)

と説明できます。(⇒ つまり、線形フィルタ)

ところで、フィルタの種類を大別すると、
 ・線形フィルタ(FIRフィルタ、IIRフィルタ)
 ・非線形フィルタ
に区分されますが、
上記の移動平均線は、線形フィルタの一種といえます。
また、「重み付け」の事を 「フィルタ係数」 とも表現する事もでき、
FIRフィルタ係数は、基本的に、その総和は「1」にします。(振幅の規格化)

非線形フィルタは、例えば、局所的な領域内の最大値、最小値、中央値(メディアン)
など を求め、それらによって、特定の規則に従った変換をするものです。
非線形フィルタの使用例としては、
画像処理(ノイズ除去、鮮鋭化/鮮明化 etc)でよく用いられたりもします。

因みに、
デジタル信号処理において、
フーリエ級数展開方法から求めるFIRフィルタの係数 hn は、
その基本のローパス フィルタでは、
 ◇ LPFの係数 hn = sin(ωc nT) ÷ (nπ)  n≠0、n=±1、n=±2、・・・
   但し、n=0 の時は、h0 = ωcT/π
   上記のフィルタ係数は、振幅の規格化をしていないフィルタ係数です

フーリエ級数展開法 以外にも、フィルタ設計(係数の決定)するには、
周波数サンプリング法(周波数上のデータから、離散逆フーリエ変換IDFTをする)や、
IIRフィルタならば、
インパルス不変法(インパルス応答の時系列[s領域]から、デジタル化[z領域]に変換)、
双1次変換法(双1次変換を利用して、s領域⇒z領域 に変換)
など があります。

また、FIRフィルタを別の見方をすれば、
 時系列データに、窓関数をかけている(たたみこみ演算)
とも 考えることもできます。


・単純移動平均(SMA)
ローパス フィルタの解説で、よく見かけますが、改めて、簡単に説明すると、
重付け{1/N、1/N、・・・、1/N}のように、”すべての重みが等しい” フィルタ係数、
になります。
例えば、期間5 の SMA は
 ◇ SMA = (y1+y2+y3+y4+y5)÷5
なので、フィルタ係数= ”すべて 1/5” の FIRフィルタ です。

(p.s データ列を、x1,x2 ・・・ と表記せずに、y1,y2 ・・・ としたのは、
   特に意味は無い。個人的に見易くする為)

また、窓関数とみれば、矩形窓(方形波窓)を施している と言えますが、
その矩形窓の、一般的な周波数特性は、
 「周波数分解能は高いが、ダイナミックレンジは低い」
となっています。
この意味する事は、詳細な解説は省略しますが、
 「メインローブの幅が狭くて済むが、サイドロープとの音圧比が低い」
という事です。

この”周波数分解能”と”ダイナミックレンジ”は、トレードオフの関係にあり、
同時に改善する事はできません。


・指数平滑移動平均(EMA)
EMA は、FIRフィルタ(有限インパルス応答)ではなく、IIRフィルタ(無限インパルス応答)であり、
つまり、無限級数、もしくは、伝達関数に再帰還がある とも言えるのですが、

この無限級数において、誤差をほぼ無視できる個数で切って(有限個にして)、近似的に FIRフィルタと見立てると、そのタップ数(フィルタ係数の個数)は、期間Nに対して 3倍~4倍のタップ数を持たせると実用的な誤差範囲になります。

言葉を変えると、
期間Nの計算に対して、無限級数を打ち切る長さは、少なくても、その期間Nの3倍~4倍の過去データがなければ計算誤差が大きくなる とも言えます。
(期間N とは、漸化式で指定する算出期間)

もっとも、通常の漸化式で計算する際には、その初期段階の誤差は、初期値に単純平均値を用いる事から、もう少し、早く、誤差が収束すると思いますが・・・。

その時の(FIRフィルタと見立てた時の)フィルタ係数は
 ◇ EMA のフィルタ係数 = {αγ^0、αγ^1、αγ^2、αγ^3、・・・、αγ^m}
   但し、α = 2/(N+1)、 γ = (1-α) = (N-1)/(N+1)、 m = N の3倍~4倍

つまり、mをNの3倍~4倍程度にすれば、γ^m が 十分に小さく(収束)なるので、
それ以降のタップを無視できると言う事です。
(上記のフィルタ係数の求め方は、省略するが、
 要は、漸化式を無限級数の形に変形すれば良い)

因みに、修正移動平均(MMA、もしくは、RMAとも表記する) は、
EMA において、期間(2N-1) としたものに等しくなります。
詳細は、「指数平滑移動平均」を参照方。


・加重移動平均(WMA)
広義的には、フィルタ係数の重み付けに変化を持たせる事ですが、
一般的には(株式・FXでは)、フィルタ係数の重み付けを直線的に減じています。
 ◇ WMA のフィルタ係数 = {N/S、(N-1)/S、(N-2)/S、 ・・・、1/S}
   但し、S = N、(N-1)、(N-2)、 ・・・、1 の総和(Σn)
 参考:整数の数列(等差数列)の総和は、三角関数 = N(N+1)/2 になる。
     整数の総和(Σn)で割るのは、振幅の規格化(フィルタ係数の総和=1)とする為。

WMA は、EMA のように、直近のデータを強調している(重付けを大きくしている)ので、
直感的にも判るように、状態変化に追従し易い(つまり、周波数領域の特性では、高周波成分を多く持つ)
となっています。

このWMA の周波数特性を計算をすると、矩形窓(つまり、SMA)よりも、
メインローブの幅がやや広く、また、サイドロープもなだらかで、
結果、
高周波をより含む、つまり、直近データによりすばやく反応するのが見て取れます。

尚、WMA も、EMA と同様に、漸化式で表現することが出来ますが、
その詳細は、次の機会に譲って省略します。


・三角移動平均(TMA)
これは、フィルタ係数を三角波(中点で対称な、直線変化の山型の波形)とし
例えば、期間9のフィルタ係数は、
 ◇ TMA のフィルタ係数 = {1、2、3、4、5、4、3、2、1}
   ただ、振幅の規格化(フィルタ係数の総和=1)とするのが普通なので、
   上記のそれぞれの係数を Sum(1,2,3,4,5,4,3,2,1)=16 で割って、
 ◇ TMA のフィルタ係数 = {1/16、2/16、3/16、4/16、5/16、4/16、3/16、2/16、1/16}

フィルタ係数が偶対称(期間Nが偶数)であったり、
期間Nによっては、フィルタ係数が整数とならない事もありますが、
それらの時には、フィルタ係数を一種の丸め処理で代替し、整数として扱います。
(株式/FXの場合)

また、別の計算方法として、SMAを2回適応する方法もあります。
この時、期間N で計算する幅M(置換された期間M) は、
M = int(N/2)+1、あるいは、int[(N+1)/2]による切上げ[別表現でRoundUP(N/2)] となり、
 ◇ TMA(t) = SMA(SMA(price、N+1-M)、M)
   但し、M = int(N/2)+1
  あるいは、
 ◇ TMA(t) = SMA(SMA(price、M)、M)
   但し、M = int[(N+1)/2]


<追記 201/01/25>
※ SMA(SMA(price、M)、M) は、期間N が奇数の場合 計算誤りとなる(誤差が生じる)
  Excelにて計算値を検証した結果であるが、理屈(理論)は期間が等価でなくなる為?(未確認)

このように、SMA を2回適応する事で計算が可能なのは、
どうやら、三角形関数(もしくは、テント関数。 sin/cos の三角関数ではない)の特性で、
等価的に、矩形関数の畳み込みで表す事ができる のに由来している
ようですが、その証明の理屈(というか理解)は未だ出来ていません。
エクセル などで手計算すると、両者は等しくなるのは間違いないです。
参考として、ウィキペディア(フリー百科事典)の項目で「三角形関数」があります。

また、窓関数で考えると、三角窓(バートレット窓)と等価 だそうです。
参考としては、
テント関数は信号処理/通信工学 などにおいて、パルス信号の理想的波形の表現として、
よく使用されるそうです。

尚、コンピュータの処理速度の最適化(速さ)として考えた場合、
SMAの2回適応で計算するのと、フィルタ係数の畳み込み演算(積和演算)とで、
どちらが優位なのかは、興味があるところです。
(SMAの計算を漸化式で行なうのであれば、SMAの2回適応の方が速いかな!?)

【蛇足】
非線形フィルタの箇所で少し触れたが、データ列の代表値を表すのに、
統計学的な手法として、中央値(メディアン)を用いる方法があるが、
これを移動平均の算出方法として活用するには、データ列のソート処理が必要な為、
やや、計算時間が長くなるのは、注意すべき点である。
また、中央値(メディアン)の特徴として、
母集団の中に、突出してかけ離れたデータが1つでもあると、
単なる平均値では、その突出したデータに引っ張られ、
その他の多数を占める要素を代表するとは、言い難くなり勝ちだが、
中央値(メディアン)ならば、”かけ離れた”両サイド側のデータの影響を
少なくする性質がある。
反対に云えば、相関性が低い、ばらつき度が大きすぎるデータ列だと、
中央値(メディアン)よりも、平均値の方が適しているのかもしれない。

コメント

コメントの投稿

コメント

管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://hachisue.blog65.fc2.com/tb.php/111-5695e52b
この記事にトラックバックする(FC2ブログユーザー)

Appendix

検索フォーム

プロフィール

hachisue

Author : hachisue
自作PCをこよなく愛する管理人です

最新記事

最新コメント

ブロとも申請フォーム

この人とブロともになる

QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。