ファイナンス、情報通信技術のスキル・アグリゲーション・サイト

' . iseeit.jp Finance × ICT . '
 
AutoEncoder × 金融 入門

異常検知は、相場の
「いつもと違う」に気づけるか

正常な値動きだけを覚えさせた機械は、相場の異変に気づけるのか。 USD/JPY の実データで「検知が働くこと」を確かめ、擬似データを何十通りも回して「戦略として使えるか」を評価します。 実データと擬似データに、別々の役割を与える——金融における異常検知の、入門です。

AutoEncoder 教師なし学習 USD/JPY TensorFlow.js バックテスト

[ 0 ] はじめに

「いつもと違う」に、機械が気づく

相場が荒れ始めたとき、人が気づくのはたいてい動きが大きくなってからです。 ではルールで書けばいいかというと、これが難しい。「1日で2%下がったら警戒」のような閾値は、 静かに壊れていく異常を取り逃がします。値幅は小さいのに、動き方だけが普段と違う——そういう局面です。

そこで発想を変えます。異常の形を教えるのではなく、正常な形だけを覚えさせて、当てはまらなくなったら気づかせる。 これが AutoEncoder による異常検知です。この記事では、その仕組みを説明したうえで、 実際の為替データと擬似データの両方で検証します。

先にお断りしておきます。 この記事は技術の解説を目的とした教育コンテンツであり、投資助言ではありません。 登場する USD/JPY は「手法が実データで動くか」を確かめるための題材で、特定の通貨や取引を推奨するものではありません。 また戦略の評価に使うのは擬似データであり、そこで得られた数値が実際の運用成績を意味することはありません。
[ 1 ] 前提

金融における「異常」とは何か

価格の異常と、パターンの異常

「大きく動いた」ことと「異常である」ことは、同じではありません。 決算発表の日に大きく動くのは想定内ですし、逆に値幅が小さいまま、動き方の質が変わることもあります。 ボラティリティが静かに上がり始める、上下動のリズムが崩れる——こうしたパターンの変化を捉えたい。

人間の目では、追いきれない

為替は24時間動き、通貨ペアは無数にあり、見るべき指標も多い。 すべてを人が監視するのは現実的ではありません。機械に「普段と違う」を見張らせたい理由は、まずここにあります。

「これが異常だ」と教えられない

機械学習で分類をやるなら、普通は「正常」「異常」のラベル付きデータが要ります。 ところが相場では、どこからが異常だったのかを誰も定義できません。 後から振り返れば「あれは危機だった」と言えても、事前にラベルは存在しない。

だから教師なしで行きます。異常を教えるのではなく、正常だけを大量に見せる。 これが、この後の設計すべての出発点です。

[ 2 ] 仕組み

AutoEncoder の直感 — 狭い穴を通す

圧縮して、復元する装置

AutoEncoder は、入力を一度狭いところに押し込めてから、元に戻す装置です。 ここでは「直近10日ぶんの値動き」を入力し、いったん4つの数字にまで圧縮して、 そこからまた10日ぶんを復元させます。

10 → 4 → 10

10個の情報を4個に減らすので、途中で必ず何かが失われます。だから完璧な復元はできない。それでも「できるだけ元に近づけろ」と訓練するのが、この装置の学習です。

狭い穴には、よくある形しか通れない

重要なのは何を使って訓練するかです。平穏な期間の値動きだけを見せて訓練すると、 この装置は「平穏な値動きを4つの数字で表す方法」だけを身につけます。 逆に言えば、それ以外の形は上手に通せなくなる。

復元の失敗が、異常度

そこに普段と違う値動きを入れると、復元がうまくいきません。この元の形と復元した形のズレ—— 再構成誤差——が大きいほど「いつもと違う」ことを意味します。異常のラベルを一切使わずに、 異常度の目盛りが手に入るわけです。

アクセスログの異常検知と、同じ原理です。 LSTM × AutoEncoder の記事では、 サーバーの正常なアクセスパターンを学ばせて、攻撃を浮かび上がらせました。 学ばせる対象が「アクセスの波形」から「値動きの波形」に変わっただけで、考え方はそっくりそのままです。
[ 3 ] 実データ

USD/JPY で、検知が働くか確かめる

まず確かめたいのは「この手法は、本物の相場でも反応するのか」です。 擬似データでいくら綺麗に動いても、実データで無反応なら意味がありません。

前半だけで学習する

取得した期間の前半だけを使って AutoEncoder を訓練し、後半は一切見せません。 標準化に使う平均や標準偏差も、前半のデータだけから計算します。 これは未来の情報を使ってしまうことを防ぐためで、 検証では絶対に外せない約束事です。

下のデモは、その場でブラウザが AutoEncoder を訓練します。上段が実際のレート、下段が異常スコア。 値動きが荒れた時期に、スコアが跳ね上がるかを見てください。

Demo 1 · real FX anomaly detection
USD/JPY × AutoEncoder
実データの取得に失敗した場合は、同梱の擬似為替データに切り替えて動作します(表示で区別します)。
準備中…
USD/JPY レート(緑の破線までが学習期間)
異常スコア(再構成誤差の z 値)— 高いほど「いつもと違う」
異常スコア zz = 2 の目安線

レートが大きく振れた局面で、異常スコアが跳ねているのが見えるはずです。 正常だけを学ばせた装置が、教えていない異変に反応した——検知そのものは、実データでも働きます。

ただし、擬似データのように「ここが危機」と帯で示せるほど、きれいには分かれません。 スコアは全期間にわたって細かく上下し、閾値を超える日もあちこちに散らばります。 跳ねた日が本当に「異常」だったのか、それとも単なる一時的な荒れだったのか—— 画面を見ているだけでは、判定できないのです。この扱いにくさが、次の節の本題になります。

[ 4 ] 壁

「正解」がない、という壁

検知が働いた。では次に「この異常スコアを使って資産配分を変えたら、成績は良くなるのか」を確かめたくなります。 ところがここで、実データは致命的に不利になります。

どこが異常だったのか、誰も知らない

実データには異常のラベルがありません。スコアが跳ねた日が「本当に異常だった」かを判定する基準がないので、 的中率も誤検知率も測れないのです。目で見て「それらしい」以上のことは言えません。

歴史は、1本しかない

さらに深刻なのがこちらです。実データで戦略を評価すると、得られるのはたった1つの結果です。 「この2年間ではこうなった」——それだけ。もう一度別の2年間をやり直すことはできません。

これは、検証において最も危うい状態です。1回の結果がたまたま良ければ「効く」と信じ、 たまたま悪ければ「効かない」と切り捨ててしまう。どちらも、根拠としては薄すぎます。

だから、役割を分けます。 実データは「検知が働く」ことを示すために。 擬似データは「戦略として使えるか」を評価するために。 擬似データなら危機の位置も強さも自分で決められ、しかも何十通りでも作れます。 それぞれ得意なことをやらせる、という分担です。
[ 5 ] 評価

擬似データで、何十回も試す

ここからは擬似データです。リスク資産と安全資産の2つを用意し、途中に危機を2回、意図的に埋め込みます。 異常スコアの使い方は3通り。

戦略配分の決め方
静的 60/40何があってもリスク資産60%を維持
連続シフト異常度に比例して、毎日じりじり守りへ寄せる
閾値+ヒステリシス閾値を超えたら守りへ。別の低い閾値を下回るまで戻さない

配分の判断には前日までの情報しか使わず、売買のたびに取引コストを差し引きます。 現実に寄せた、意地の悪い条件です。

1回だけ見ると、勝者はばらばら

まず「1つの相場だけ」を見てください。次に「30相場」を回してください。 同じ手法なのに、見える景色がまるで変わります

Demo 2 · winner distribution
1回の結果と、30回の分布
擬似データ・2資産。判断は前日までの情報のみ、取引コスト控除つき。数値は手法の傾向を見るためのもので、運用成績ではありません。
取引コスト0.10%
「まず1相場だけ見る」を押すと、ある1つの相場での勝者が分かります。何度か押してみてください。
「30相場で分布を見る」を押すと、30通りの相場それぞれで誰が勝ったかを数えます。

30回まわすと、構造が現れる

1相場だけ見ていると、静的が勝ったり連続シフトが勝ったりで、いかにも「運任せ」に見えます。 ところが30回まとめると、はっきりした順序が現れます。上のデモを2つのコストで押した結果が、これです。

Sharpe が最良だった回数静的 60/40連続シフト閾値+ヒス
取引コスト 0.1%2 / 304 / 3024 / 30
取引コスト 0.5%6 / 300 / 3024 / 30

閾値+ヒステリシスが、どちらの条件でも24勝。そして取引コストを上げると、 連続シフトは4勝から0勝へ消えました。毎日じりじり動かす設計は売買が多く、 コストに真っ先に食われるからです。逆に、一切売買しない静的は2勝から6勝へ増えました。 コストをさらに 0.6% まで上げると静的は10勝まで伸び、それでも閾値ルールが20勝で首位を保ちます。

同時に測っている、もうひとつの数字

デモの下段には DD圧縮・vol削減・回転比 も出ています。注目したいのは回転比が常に約3.7倍で動かないこと。コストを変えても、連続シフトが閾値ルールの3倍以上売買している事実は変わりません。一方 DD圧縮はコスト0.1%で50%、0.5%で33%と縮みます。守りの効果すら、コストに削られていくのです。

ここが、この記事のいちばんの学びです。 少数の観測は、構造を隠します。数回見ただけでは「毎回違う結果」に見えても、 回数を増やせば分布が現れる。検証に必要なのは、良い1回ではなく、たくさんの回です。 そして実データでは、その「たくさんの回」が原理的に手に入りません。
[ 6 ] まとめ

検知は入口、評価には反復が要る

AutoEncoder は「正常を学び、外れたら気づく」装置でした。アクセスログでも為替でも、原理は同じです。 そして実データは検知が働くことの証拠を、擬似データは戦略として使えるかの評価を、 それぞれ担当しました。どちらか一方では、片側しか分かりません。

この記事のまとめ

  • 相場の異常は事前にラベルがない。だから正常だけを学ぶ教師なしが向く。
  • AutoEncoder は 10→4→10 の狭い穴。復元の失敗が、そのまま異常度になる。
  • 実データ(USD/JPY)でも検知は働く。ただし正解ラベルがなく、歴史は1本だけ
  • だから戦略の評価は擬似データで。危機を仕込め、何十通りも試せる
  • 30相場では閾値+ヒステリシスが24勝。コストを上げると連続シフトは0勝に、静的は2勝→6勝に。
  • 少数の観測は構造を隠す。必要なのは良い1回ではなく、たくさんの回。

最後に、いちばん大切なことを。異常検知が答えてくれるのは「いつもと違う」までです。 そこから「では、どうするか」を決めるのは検知器ではなく、その後ろの設計——今回でいえば配分ルールでした。 同じスコアを使っても、動き方の設計だけで勝率がゼロになることもある。 気づくことと、うまくやることは、別の問題なのです。

この結果の射程。 ここで得た数値は、あくまで擬似データの生成条件のもとでの傾向です。 危機の深さも頻度もこちらで決めており、実際の市場はまったく違う形をしています。 再度になりますが、本記事は教育目的の技術解説であり、投資判断の根拠となるものではありません。

関連記事

『異常検知は、相場の「いつもと違う」に気づけるか — AutoEncoder入門』を公開しました。

ファイナンシャル・プランニング
債券利回り計算(単利)

最終利回り計算(単利) : 債券を購入時点から、最終償還日まで保有していた場合に得られる収益の利回りを単利にて計算します。

所有期間利回り計算(単利) : 債券の購入時点から、最終償還日前の売却時点までの所有期間に得られる収益の利回りを単利にて計算します。