「3連騰したら買い」は本当か?自己相関とランダムウォーク仮説をPythonで確かめてみた

基礎知識・戦略

先週、自分のポートフォリオの製造メーカー株のチャートを眺めてて「あれ、3日連続で上がった後って、なんか翌日も上がりやすくない?」って気づいた瞬間があったんです。→で、その場のノリで「3連騰したら買う」みたいなルールを頭の中で組み立てかけて、いや待てよと。これ、ちゃんと統計的に確かめもせずに「なんとなくパターンっぽい」で判断するの、一番やっちゃいけないやつだったなと反省しました。そこで「自己相関」と「ランダムウォーク仮説」というものを勉強し直すことにしました。

自己相関とは

自己相関(オートコリレーション)とは、ある時系列データが「過去の自分自身」とどれくらい相関しているかを測る指標です。株価のリターンで言えば、「今日のリターン」と「1日前のリターン」の相関係数を計算したもの、というイメージで大きく外れていません。

数式で書くとラグkの自己相関係数は次のようになります。

ρ(k) = Cov(r_t, r_{t-k}) / Var(r_t)

ここで r_t は時点tのリターン、kはラグ(何日前かの日数)です。ρ(k)が0に近ければ「過去の値動きと今日の値動きに関係はほぼない」、1に近ければ「過去が上がった翌日も上がりやすい」、-1に近ければ「過去が上がった翌日は下がりやすい(逆張り的な動き)」ということになります。

ランダムウォーク仮説との関係

ランダムウォーク仮説は、ざっくり言うと「株価の変動は予測不可能で、過去の値動きから将来の値動きを予測することはできない」という考え方です。効率的市場仮説ともセットで語られることが多く、「もし過去の値動きから未来が予測できるなら、みんなその情報を使ってすぐに利益を出そうとするので、その優位性はすぐに市場価格に織り込まれて消える」というロジックが背景にあります。

この仮説が正しいなら、リターンの自己相関はほぼ0になるはずです。つまり「3連騰したら買う」がもし本当に効くなら、それはランダムウォーク仮説に対する反証になる、というくらい大きな話になってしまいます(実際には手数料やスプレッドを考えると、たとえ弱い自己相関があっても取引コストで食われて終わることが多いです)。

Pythonで検証してみる

statsmodelsのacf関数と、複数ラグをまとめて検定できるLjung-Box検定を使うと、自己相関が統計的に0と言えるかどうかまで確認できます。

import yfinance as yf
import pandas as pd
from statsmodels.tsa.stattools import acf
from statsmodels.stats.diagnostic import acorr_ljungbox

# USD/JPYの日次データを取得
df = yf.download("JPY=X", start="2025-01-01", end="2026-07-24")
ret = df["Close"].pct_change().dropna()

# ラグ1〜10の自己相関係数
acf_values = acf(ret, nlags=10)
print("自己相関係数(ラグ1〜10):")
print(acf_values[1:])

# Ljung-Box検定(帰無仮説:自己相関は0)
lb_result = acorr_ljungbox(ret, lags=[10], return_df=True)
print(lb_result)

手元のドル円データで動かしてみたところ、ラグ1〜10の自己相関係数はどれも±0.05程度に収まっていて、Ljung-Box検定のp値も有意水準5%を超えていました。つまり「統計的に自己相関がある」とは言い切れない、ランダムウォーク仮説を否定できない結果でした。正直「そんな気がしてたパターン」があっさり数字で否定されるの、ちょっとへこみます。。。

投資への応用

この検証から得た一番の教訓は「チャートを見て感じたパターンは、まず自己相関とその有意性を確認してから戦略に組み込む」という順番の大事さです。自己相関がほぼゼロなら、単純な「連続陽線だから買う」的な戦略は根拠が弱いと判断できます。逆に、ボラティリティ(値動きの大きさ自体)には自己相関が見られることが多く(ボラティリティ・クラスタリングと呼ばれる現象です)、これはGARCHモデルなどリスク管理の文脈で活きてきます。「リターンの自己相関」と「ボラティリティの自己相関」は別物として扱う必要がある、というのも今回の副産物的な気づきでした。

まとめ

「なんとなくパターンっぽい」で戦略を組みかけた自分に、数字でブレーキをかけられたのは収穫でした。次はリターンではなくボラティリティの自己相関(クラスタリング)の方を同じ要領で確認して、GARCHモデルの勉強につなげてみようと思います。

タイトルとURLをコピーしました