TechFULの中の人

TechFULスタッフ・エンジニアによる技術ブログ。IT関連のことやTechFULコーディングバトルの超難問の深掘り・解説などを毎週更新

未来予測と勘違い


こんにちは.TechFUL PROのアルバイトをしているzekiです. TechFUL PROでは人工知能に関する問題を提供しています.

今回は時系列データの未来予測についてです. 株価や仮想通貨,天気,流行など,未来予測は魅力的な題材が多いですよね. 天気予報なんかは非常に精度良く当たる印象があります. 一方で株価や仮想通貨などの未来予測は非常に困難であるとされています. こういう困難な問題に直面すると,機械学習技術を使ってみたくなりますよね? ですが残念ながら大抵の場合はうまくいきません. それは未来予測という問題が本質的な不可能性を持っているからなんです.

時系列におけるランダム性

例えば,投げられたボールの運動を未来予測するとします. ボールの運動は投げられた瞬間に決定し,きれいな放物線を描くでしょう. 非常に簡単に未来予測ができるはずです. これは,投げられた瞬間から,「新たな情報」が必要ないということであり,ボールに対して新たな情報が影響していないということです. 途中で急にボールの向きが変わったりしたら,風などが新たな情報として加わったと考えられるでしょう. ボールの動きが頻繁に変化し,我々がその原因を知らないのだとすれば,それは「ランダムな動き」として考えられます. 株価などはどこかで様々な人間が取引することによって変動しますが,その取引の動機について我々は知る由もありません. まさに「ランダムな動き」を持っているわけです. もちろん,多くの人が共有された特定の情報(ニュースなど)をもとに取引を行えば,ある程度の傾向も現れますが,やはり基本はランダムな動きになっていると考えられます.

ブラウン運動

代表的なランダムな運動といえばブラウン運動です. ブラウン運動は50%で一定量増加,50%で一定量減少する,ということを連続的に行うもので,数学的な性質も面白いのですが,今回は省略します. コードとグラフはこんな感じです.

import numpy as np

def brownian_motion(dt, T, std, init = 0.0):
    time_series = [[0,init]]
    y = init
    for t in np.arange(dt,T+dt,dt):
        y += np.random.normal(0, std)*np.sqrt(dt)
        time_series.append([t,y])
    return np.array(time_series).T

f:id:techful-444:20211122152139p:plain
ブラウン運動の例.dt=0.01, T=1,000, std=0.03で,np.random.seed(15).
ブラウン運動において重要なのは時間$dt$後の変化が x \sim N(0,\sigma)というような,正規分布に従う乱数 x \sqrt{dt} の積で表されるということです. つまり,すべての時間においてランダムな変化をしています.

ブラウン運動の予測

当然完全にランダムな動きなので未来予測なんてできるはずがありません. つまり,これを予測しようとしたときに「予測できてそうに見える挙動」はすべて勘違いであることを意味しています. 特に,根拠が不透明な,深層学習などによる予測ではこのような勘違いが発生しやすいです. 試しに予測してみましょう. 入出力は以下のように設定してみます.

f:id:techful-444:20211122142130p:plain:w300
モデルの概略.時間t-3からt(現在)までの運動データを用いて直後の未来t+1での値を予測する.
最近の情報から時間1だけ未来を予測するというモデルになっています. これで無数のパターンのブラウン運動の予測を学習すると上記の軌跡への予測は次のようになります.
f:id:techful-444:20211122150749p:plain
ブラウン運動の軌跡とそれに対する予測.2つはほとんど重なっている.
非常にうまく予測できているように見えるかもしれません. ですがそれは不可能であり,勘違いです. 試しに拡大してみると
f:id:techful-444:20211122150756p:plain
拡大図
予測がちょうど横に1だけズレた形になっています. これは「現在の値」を「次の瞬間の値」として出力しているということです. つまりまったく予測できていないんですね.

大抵の時系列は直近の値に近い値を取ります. であるならば,次の瞬間の値と予測の値は,現在の値からの差分を比べるほうが良いでしょう. すると次のようなグラフになります.

f:id:techful-444:20211122144638p:plain
差分 x_{t+1}-x_tの予測の様子.
まったく予測できていない様子がよくわかりますね.

最後に

今回の現象は勘違いの一例に過ぎません. 株価なんかは多くの指標や分析方法が公開されています. しかしながらほとんどの場合,大きな成功は望めません. 新しく優秀な方法はどこかに勘違いがある可能性が高いと言えるでしょう. 未来予測は機械学習の応用先としてはメジャーな部類ですが,トップクラスに難しい問題とも言えます. よくできていそうな自分のモデルが「本来解けないもの」を解いていないか,慎重にチェックすることが重要です.