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

' . iseeit.jp 情報通信技術 . '
 
TensorFlow.js / MNIST → 為替 ①

MNISTから先へ、
何が要ったか

TensorFlow.js の教科書デモは、きれいに動きます。学習曲線もちゃんと下がる。 ところが「これ、実際に使えるの?」と問うと、途端に足りないものが見えてきます。 教科書デモと実用ツールを隔てる3つの壁を、分類と時系列を並べて体感します。

TensorFlow.js MNIST vs 時系列 LSTM への動機 対比デモ

§ 0 — 導入

動いた。でも、それで終わっていた

以前 gwaw.jp で、TensorFlow.js の教科書的なデモを2つ作りました。 AutoEncoder による時系列の異常検知と、 LSTM による USD/JPY 短期予測です。 どちらも学習曲線はきれいに下がり、それらしい結果を出しました。

ですが、どちらも動かしていたのは合成データ(自分で作った疑似データ)でした。 「これ、実際の為替で使えるの?」——そう問い直した瞬間、足りないものが一気に見えてきます。 教科書デモは入口であって、ゴールではなかった。

この記事は、その教科書デモから実用ツールへ進むために越えるべき 3つの壁——実データ・時系列・不確実性——を見取り図として示します。 シリーズ全体の地図だと思ってください。

§ 1 — 何が違うのか

教科書デモと実用ツールの断層

入門で誰もが通る MNIST(手書き数字の分類)は、実はとても恵まれた課題です。 為替予測と並べると、その「恵まれ方」がくっきり見えます。

観点MNIST(分類)為替予測(時系列)
データ最初から手元に揃っている自分で取りに行く
入力固定サイズの1枚過去の並び(時系列)
正解明確・すでにある未来にしかない
順序無関係(並べ替え可)命(並べ替え不可)
外れただの間違い意味を持つ(異常の兆候)

この表の差が、そのまま3つの壁になります。まずは「順序」の違いを、手を動かして掴んでみてください。 下のデモは、同じ「シャッフル」操作を分類と時系列の両方にかけます。

Interactive · Classification vs Time-series
分類 vs 時系列 — 同じシャッフルをかけると?
TensorFlow.js の実学習はしていません。2つのタスクの構造の違いを体感するための可視化です。
分類(MNIST型) 整列
各画像は独立。画像 → ラベルの対応は、並び順と無関係。
時系列(為替型) 整列
過去の並びから翌日を予測。並びが壊れると予測は無意味に。
系列のなめらかさ
窓からの予測
妥当
「順番をシャッフル」を押してください。同じ操作が、左右で正反対の結果になります。

左(分類)は無害。並べ替えても、各画像とラベルの対応は正しいまま。 右(時系列)は致命的。並びを壊した瞬間、なめらかだった折れ線はノイズになり、 過去の窓から翌日を読む、という予測そのものが成り立たなくなります。

同じ「シャッフル」が、片方では無害・片方では致命的。 これが分類と時系列を隔てる最も本質的な違いです。時系列では順序が情報そのもの。 ここが、次の LSTM が要る理由に直結します。
§ 2 — 壁①:実データ

サンプルは、誰かが用意してくれていた

MNIST は数行でロードできます。tf.data を呼べば、綺麗に整えられた数万枚が手に入る。 でもそれは、誰かがすでに集めて整えてくれていたからです。

実データはそうはいきません。為替の値を使いたければ、自分で取りに行く必要がある。 しかもブラウザから外部APIを直接叩くと、CORS の壁で弾かれます。 「データを手に入れる」こと自体が、最初の技術課題になるのです。

壁①をどう越えるか

この壁は、VPS側に小さな中継役(プロキシ)を置き、さらに「取れなかったとき」に備えた多段の逃げ道で越えます。詳しくは2本目で。

§ 3 — 壁②:時系列

順番に、意味がある

§1のデモで見たとおり、時系列は順序が命です。MNIST の画像はシャッフルして学習できますが、 為替は昨日の終値が今日に効く。並べ替えたら情報が壊れます。

では、順序をどうモデルに伝えるか。答えが「窓(ウィンドウ)」で過去N日を束ねて1つの入力にするという発想で、 その並びを扱うのに向いたネットワークが LSTM です。入力の形からして、分類とは別物になります。

分類 / MNIST
1枚の画像 ラベル「7」
時系列 / 為替
D-8D-7D-1 翌日 D の値

1枚 → 1ラベルだった入力が、過去N日 → 翌日1点に変わる。 この構造の転換こそ、LSTM が要る理由です。

§ 4 — 壁③:不確実性

外れることに、意味がある

MNIST で 7 を 1 と読んだら、それは単なる誤分類です。直すべき「間違い」でしかありません。

ところが為替予測の「外れ」は違います。予測が大きく外れた点は、市場に何か異常が起きた点かもしれない。 外れが、消すべきノイズではなく、拾うべきシグナルになるのです。

予測と異常検知は、裏表。 「うまく予測できない」を逆手に取ると、それはそのまま異常検知になります。 LSTM(予測)と AutoEncoder(異常検知)を同じデータに重ねると、この裏表が1枚の絵になる—— それが3本目の核心です。
§ 5 — シリーズの地図

3つの壁を、どう越えるか

3つの壁は、それぞれ次の記事で越えていきます。

壁① 実データ
→ 2本目「yf-proxy.php と3段フォールバック」でCORSを越える
壁② 時系列
→ 3本目「LSTMで過去の窓を束ねる」で順序を扱う
壁③ 不確実性
→ 3本目「予測の外れを AutoEncoder と重ねる」で異常を拾う

この3つを越えた先に、実在する本番ツール—— iseeit.jp の「為替 LSTM 予測 & アノマリー検出デモ」があります。 教科書デモから、そこまでの道のりを辿るのがこのシリーズです。

この記事のまとめ

  • 教科書デモ(MNIST)は恵まれた課題。データが揃い、順序が無関係で、外れはただの間違い。
  • 実用ツール(為替予測)は逆。データを取りに行き・順序が命・外れに意味がある
  • この差が3つの壁:実データ・時系列・不確実性
  • 同じシャッフルが分類には無害・時系列には致命的 → 時系列は順序が情報そのもの → LSTM が要る。

関連記事(教科書デモ側)

Next — TensorFlow.js 実用化②
実データを、どう取るか — yf-proxy.php と3段フォールバック

最初の壁「実データ」。ブラウザから Yahoo Finance を直接叩くと CORS で弾かれる。 VPS側に置いた軽量プロキシと、Yahoo Finance → CSV → 合成データの3段フォールバックで、止まらないデータ取得を作ります。