フィッシャー変換はどのように計算されますか?
フィッシャー変換とは(そしてなぜ式が違って見えるのか)
フィッシャー変換は、時系列(多くの場合は価格系列)を、より「上限・下限のないオシレーター」のように振る舞う形へ変換するための数学的変換です。これは「統計的な予測」を行うからではなく、非線形関数を使って値をリマップするために「transform(変換)」と呼ばれます。
実務上の要点は次のとおりです:
- ローリングの高値/安値レンジを使って入力系列を有界な値に抑える、
- Fisher型の非線形マッピング(対数比に関連)を適用する、
- マップされた値を再帰的に更新し、「点ごとに」そのまま出すのではなく、指標が滑らかに反応するようにする。
マッピングは非線形であり、レンジはウィンドウ上で計算されるため、出力の厳密なスケールや感度は、選んだ設定と、計算に投入するデータに強く依存します。
中核となる計算:式、パラメータ、入力
広く使われているフィッシャー変換の計算は、次のような一般的な構造に従います。厳密な実装の詳細は出典によって異なりますが、以下の仕組みが本質的な構成要素を捉えています。
パラメータと入力
必要なのは次のとおりです:
- 入力系列:通常は、各時点ごとに与えられる派生価格値(たとえば中央値)です。
- ルックバックウィンドウ長(N):ローリングの最小値と最大値を計算するために使うバー数です。
- 再帰/反復:フィッシャーのマッピングは、先に計算した値を参照する再帰的な更新を使います。
ステップ1:ローリング正規化値を計算する
各時点 t(ルックバックに十分なデータが存在してから)について、直近 N ステップの入力系列のローリング最小値と最大値を計算します:
- Lowest(t) = ウィンドウ内の入力の最小値
- Highest(t) = ウィンドウ内の入力の最大値
次に、正規化位置を次のような形で計算することが多いです:
- x(t) = 2 × ((\frac{Input(t) - Lowest(t)}{Highest(t) - Lowest(t)})) − 1
これは、直近のmin/maxレンジの中で入力がどこに位置するかに基づいて、現在の入力を有界な値(概念的には −1 から +1 の間)へマッピングします。
計算例の前提: あなたは「Input(t)」が何であるかを定義しなければならず、値を再現するときは、同じ N と同じウィンドウ定義(現在のバーを含める/含めない)を一貫して使う必要があります。
ステップ2:フィッシャー型の非線形マッピングを適用する
有界な正規化値を、対数比変換を使ってフィッシャーのような領域へマップする中間値を計算します。よくあるパターンは次のとおりです:
- f(t) = 0.5 × ln((\frac{1 + x(t)}{1 - x(t)}))
x(t) が ±1 に近づくとき(ゼロ除算やゼロの対数を避けるため)、実装では通常、x(t) をわずかに小さい区間へクランプするなどのセーフガードを含めます(たとえば、ちょうど −1 と +1 を避ける)。
ステップ3:再帰的な更新(過去の値による平滑化)
多くのフィッシャー変換の式では、マップされた値を前回の出力で更新します。典型的な再帰構造は次のとおりです:
- fish(t) = fish(t−1) + f(t)
そして、追加の平滑化係数や中間の「previous」変数が導入されることもあります。正確な再帰の形は、指標の応答性を決めます。
ステップ4:任意の丸めまたはスケーリング
一部の実装では、最終系列を読みやすくするために再スケールしたり丸めたりします。これは表示上の選択であり、コアとなる数学的概念ではありません。
確認できる「実例」のアウトライン
ここではリアルタイムの市場データは仮定しないため、計算を学ぶ最も確実な方法は、小さな仮想データセットでそれを再現することです。
例のセットアップ(最初に前提を定義する)
- N = 5 を選びます。
- 各時点の Input(t) を選びます(たとえば、中央値の価格系列)—数値として提示します。
- 「最初の N 点」をどう扱うかを決めます(一般的には、ウィンドウが完成してから出力を作り始めます)。
- レンジが小さすぎるときに x(t) をどうクランプするかを決めます。
中間値を段階的に計算する
ウィンドウが存在する各時点について:
- 直近 N 個の入力値から Lowest(t) と Highest(t) を求めます。
- (2 × ((Input−Lowest)/(Highest−Lowest)) − 1) を使って x(t) を計算します。
- x(t) がちょうど ±1 に到達しないようにセーフガードします。
- f(t) = 0.5 × ln((1 + x)/(1 − x)) を計算します。
- 選んだ再帰に従って fish(t) を更新します。たとえば fish(t) = fish(t−1) + f(t)(fish(t−1) は、選んだ慣習に従って初期化します)。
正しく実装できたかの確認方法
同じ前提で同じ手順を実装すれば、次が一致するはずです:
- ローリングの min/max 値、
- 中間の x(t) シーケンス、
- フィッシャーのマッピング f(t)、
- 再帰的な fish(t) シーケンス。
どれか1つでも中間シーケンスが異なれば、最終出力も異なります。そのため、検証の焦点は最終行だけでなく、中間計算の再現に置くべきです。
制限と失敗モード(計算を壊しうるもの)
フィッシャー変換は定義された式ですが、実装の詳細の違いやデータの振る舞いによって、計算された出力は大きく変わり得ます。
1) ルックバックウィンドウ内の小さいレンジ、またはフラットなレンジ
Highest(t) − Lowest(t) が非常に小さくなると、正規化 ((Input−Lowest)/(Highest−Lowest)) が不安定になります。すると x(t) が ±1 に向かって急にジャンプし、その後、対数マッピングが極端な値へ押し出されます。
重要な含意: ゼロに近いレンジに対するセーフガードを定義する必要があります(たとえば、更新をスキップする、または計算した比率をクランプする)。
2) 対数比変換における特異点
マッピング (ln((1+x)/(1−x))) は、ちょうど x = 1 または x = −1 では定義されません。実データや丸めによって、これらの境界に非常に近い値が生じることがあります。
重要な含意: 実装では通常、無限大の値を避けるために x(t) を(−1, +1)の内側へわずかにクランプします。
3) 再帰の初期化と一貫しない慣習
計算はしばしば過去の出力を使うため、初期の fish(0)(または最初に計算される fish の値)の選択が、その後の値に影響します。
重要な含意: 同じ式を使っていても、初期の慣習が異なる2つの実装は分岐し得ます。
4) 入力定義がすべてを変える
もし「Input(t)」が別の価格指標(終値 vs. 中央値 vs. 加重価格)であるなら、ローリングのmin/max値が変わり、結果として x(t)、そしてフィッシャーの出力も変わります。
重要な含意: 入力系列の定義は、外部の細部として扱うのではなく、計算の一部として扱う必要があります。
5) データ品質の問題
欠けたバー、不規則なタイムスタンプ、再サンプリングされたデータは、ローリングのmin/maxウィンドウを変えてしまいます。「市場予測」がなくても、これらの計算メカニズムが指標ラインを歪める可能性があります。