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

' . iseeit.jp Finance × ICT . '
 
機械学習の外れ方 ①

予測は、当たっているのか
「精度」という言葉が隠すもの

誤差の平均は 1.2%。グラフに描くと、予測線と実測線はほとんど重なります。 ところが「上がるか下がるか」の的中率を測ると 50% でした。 同じ予測を、2つの物差しで測ると評価が逆になります。 作った本人が確かめていなかった、という話でもあります。

予測精度 MAPE / RMSE 方向一致率 ベースライン

[ 1 ]

作った本人が、確かめていなかった

このサイトでは、予測を扱うツールをいくつか公開しています。 株価のLSTM予測為替のLSTM予測モンテカルロによる区間推定

どれも予測値をグラフに描きます。実測とよく重なります。 それを見て「動いている」と判断していました。

ただ、当たっているかどうかは、一度も測っていませんでした。 重なって見えることと、当たっていることは別です。 この記事では、その答え合わせをします。

結論から書くと、評価は物差し次第で逆転しました。 誤差の平均で見れば「よく当たっている」。 方向の的中で見れば「コイン投げと変わらない」。 どちらも同じ予測の、同じ期間についての数字です。
[ 2 ]

誤差は、たしかに小さい

まず一般的な指標で測ります。翌日の終値を予測し、実測とのずれを集計する形です。

MAPE — 平均絶対パーセント誤差

予測と実測のずれを、実測値に対する割合で表し、平均したもの。 1%なら「平均して1%ずれた」。単位に依存しないので、株価でも為替でも比べられます。

RMSE — 二乗平均平方根誤差

ずれを二乗して平均し、平方根を取ったもの。 大きく外した回を重く見る性質があります。単位は元データと同じです。

合成データ(500日分)で、3つの予測方法を比べます。

予測方法MAPERMSE
ナイーブ(前日と同じ)1.23 %593
移動平均の外挿(5日)1.35 %660
トレンド外挿(10日回帰)1.30 %632

どれも 1%台。株価が3万円なら、誤差は平均400円弱です。 グラフに描けば、3本とも実測にぴったり沿います。

ただし、最も成績が良いのは「ナイーブ」でした。 前日の終値をそのまま答えにするだけ——何も計算していない予測です。 移動平均もトレンド外挿も、それに負けている。 この時点で、何かがおかしいと気づくべきでした。
[ 3 ]

なぜナイーブが勝つのか

理由は単純です。翌日の株価は、前日とほとんど同じだからです。

1日の変動幅(合成データ)
// 前日比の絶対値
中央値   0.55 %
95%点   2.8  %
最大     7.1  %

半分の日は0.55%しか動きません。 「前日と同じ」と答えれば、その日の誤差は 0.55% で済む。 誤差の小ささは、予測能力ではなく変動の小ささを反映しています

これが「ベースライン」という考え方です。 予測モデルの良し悪しは、絶対値では判断できません。 何も学習しない予測と比べて、どれだけ上回ったかで見る。 上回っていなければ、学習した意味がなかったということです。

ここで扱った移動平均もトレンド外挿も、ナイーブを超えられませんでした。 LSTMのような複雑なモデルでも、同じ結果になることは珍しくありません

[ 4 ]

方向は、当たっていない

投資の判断に使うなら、知りたいのは金額のずれではなく 「上がるか、下がるか」のはずです。そちらを測ります。

方向一致率

予測時点の値と比べて、予測が「上」と言ったときに実際も上がったか。 その一致した割合。50%ならコイン投げと同じです。

予測方法MAPE方向一致率
ナイーブ(前日と同じ)1.23 %測定不能
移動平均の外挿1.35 %50 %
トレンド外挿1.30 %48 %

50%と48%。コイン投げです。 MAPE では「1%台の高精度」に見えたものが、 方向で測ると何の情報も持っていないことになります。

ナイーブが「測定不能」な理由

ナイーブ予測は「前日と同じ」なので、上がるとも下がるとも言っていません。 予測値と予測時点の値の差がゼロなので、方向を判定できない。

誤差では最良、方向では測定すらできない。 この落差が、2つの指標が別のことを測っている証拠です。 MAPE は「どれだけ近いか」、方向一致率は「どちらへ動くと言えたか」。 近いことと、当てることは違います
[ 5 ]

指標を、切り替えてみる

合成データと、日経225などの実データで試せます。 指標を切り替えると、順位が入れ替わります。 評価する期間も動かせます。

Interactive · prediction scorer
予測の答え合わせ
3つの予測方法を、3つの指標で評価します。実データは Yahoo Finance から取得します(失敗時は合成データのまま)。
実測と予測(評価区間を強調)
評価の開始 0%
評価の終了 100%

MAPE と RMSE では、3つの手法に差がほとんどありません。 ところが方向一致率に切り替えると、ナイーブが測定不能になり、他も50%前後に落ちます。 実データでも同じことが起きるか、確かめてみてください。

[ 6 ]

期間を変えると、数字が3倍動く

もうひとつ、評価を難しくすることがあります。 いつを測るかで、精度が大きく変わります

評価区間MAPERMSE方向一致率
穏やかな期間0.65 %25257 %
変動の大きい期間2.17 %93643 %
全期間の平均1.35 %66050 %

RMSE は 3.7倍の開きがあります。同じ予測方法、同じデータです。 変えたのはどこを測るかだけ

そして、よく当たる期間ほど予測が要りません。 穏やかな期間で MAPE 0.65% を出せるのは、 そもそも値が動いていないからです。 予測が本当に欲しいのは変動の大きい局面ですが、 そこでは精度が3倍悪化します

全期間の平均(1.35%)は、どちらの実態も表していません。 穏やかな期間の良い数字と、荒れた期間の悪い数字を混ぜた値です。

[ 7 ]

測り方を、私も間違えた

この記事を書く過程で、方向一致率を最初 75% と算出しました。 「意外と当たっている」と思いかけたのですが、計算が誤っていました。

比較の基準がずれていた
// ✗ 誤り:前々日の値と比べていた
const pd = Math.sign(pred[i] - P[i-1]);
const ad = Math.sign(act[i]  - P[i-1]);

// ○ 正しい:予測時点の最新値と比べる
const pd = Math.sign(pred[i] - P[i]);
const ad = Math.sign(act[i]  - P[i]);

基準を1日ずらすと、2日分の変化を見ることになります。 2日あれば動きが大きくなるぶん方向も揃いやすく、 実力より良い数字が出ます

間違いは、都合の良い方向へ倒れやすい。 75%という数字が出たとき、私は疑うより先に納得しかけました。 期待した結果が出ると、検算の手が止まる。 思ったより良い数字が出たら、まず測り方を疑う—— それが今回いちばんの学びでした。
[ 8 ]

何を知りたいのか、から決める

指標に優劣があるわけではありません。目的が違えば、選ぶものも違います

知りたいこと見るべき指標
どれくらいの金額でずれるかMAPE / MAE
大きく外す危険がどれくらいかRMSE
売買の判断に使えるか方向一致率
学習に意味があったかナイーブとの差
どの局面で使えるか期間ごとの数字
「精度」という一語では、何も決まりません。 精度98%と書いてあっても、それが何を測った数字かで意味が変わります。 MAPE 1.2% とだけ書かれた予測は、方向をまったく当てていないかもしれない—— この記事で見たとおりです。
[ 9 ]

まとめ

自分で公開したツールを、自分で測り直した結果でした。 グラフが重なって見えることを、いつのまにか当たっている証拠だと思っていた。 測ってみれば、そうではありませんでした。

この記事のまとめ

  • MAPE 1.2% でも、方向一致率は 50%。同じ予測の、同じ期間の数字。
  • 誤差が小さいのは変動が小さいから。予測能力ではない。
  • ナイーブ予測(前日と同じ)が最良になることがある。それを超えなければ学習の意味がない。
  • ナイーブは方向を測定できない。上がるとも下がるとも言っていないため。
  • 期間を変えると RMSE が 3.7倍動く。全期間の平均は実態を表さない。
  • よく当たる期間ほど、予測が要らない。値が動いていないだけ。
  • 測り方を間違えると良い数字が出る方向へ倒れる。期待どおりの結果ほど疑う。
  • 「精度」の一語では何も決まらない。何を知りたいかで指標を選ぶ
機械学習の外れ方 — シリーズ
  1. 予測は、当たっているのか(この記事)
    「精度」という言葉が隠すもの
  2. 学習期間を変えると、答えが変わる
    窓幅の選び方と、1行のリーク
  3. 「異常」は、誰が決めたのか
    閾値の恣意性

関連記事

『予測は、当たっているのか — 「精度」という言葉が隠すもの』を公開しました。

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

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

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