【アノマリー分析】月曜日や月末は本当に上がりやすい?Pythonで市場の「癖」を検証する方法

  • URLをコピーしました!

「月曜日の株価は荒れやすい」「月末は上がりやすい」といった噂を耳にしたことはありませんか?

投資の世界には、経済学の理論では説明できないけれど、なぜか繰り返される市場のパターンが存在します。これを「アノマリー」と呼びます。

多くの投資家がこのアノマリーを信じて売買していますが、本当に利益が出るほどの傾向があるのかは、自分の目で確かめてみないと分かりません。今回はPythonというプログラミング言語を使って、実際の株価データから市場の「癖」をあぶり出す方法を具体的に解説します。

目次

市場に潜む「アノマリー」とは?分析を始める前の共通認識

株価は本来、企業の業績やニュースによって論理的に動くはずです。しかし、実際には「なぜか特定の時期にだけ決まった動きをする」という不思議な現象が観測されます。これを分析する前に、まずはアノマリーの正体とその背景にある仕組みを整理しておきましょう。

市場のアノマリーは単なる迷信ではなく、投資家の心理や機関投資家の決まった行動パターンから生まれることが多いと言われています。例えば、週末に悪いニュースが出ることを恐れて金曜日に株を売る人が多ければ、週明けの月曜日は安く始まりやすくなります。こうした「人間の行動の偏り」が、データとして積み重なってアノマリーを形成しています。

統計的に観測される「説明のつかない法則」

アノマリーとは、伝統的な金融理論では説明がつかないものの、統計的に優位な差として現れる現象を指します。本来、市場が効率的であれば、こうした「癖」は見つかった瞬間に誰かが利用し、すぐに消えてしまうはずです。

しかし、実際には何十年も前から指摘されているアノマリーがいまだに残っていることも少なくありません。これは、市場に参加しているのが感情を持った人間であることや、税金の計算、企業の決算時期といった「制度上の都合」が影響しているためです。

例えば、以下のような有名なアノマリーが世界中で知られています。

市場でよく知られている主なアノマリー

  • 月曜日効果:月曜日の収益率が他の曜日より低くなる
  • 月末・月初効果:月の変わり目に株価が上昇しやすい
  • 1月効果:1月の小型株の収益率が高くなる現象
  • 5月に売れ(Sell in May):5月から夏にかけて株価が低迷する

なぜ特定の曜日や日にちに偏りが出るのか?

特定のタイミングで株価が動く背景には、明確な理由が存在するケースもあります。例えば、月末に株価が上がりやすいのは、多くの人が積立投資を行っていたり、企業が資産運用のリバランス(再調整)を行ったりするため、買い注文が集中しやすいからです。

また、月曜日の動きが他と違うのは、土日の間に溜まったニュースが一気に消化されることが原因と考えられています。このように、「誰が、いつ、どんな目的で売買しているか」という視点を持つと、データの裏側にあるストーリーが見えてきます。

確かに「アノマリーは過去のものだ」という意見もありますが、自分自身でデータを検証することで、現在の市場でも通用する法則なのかを判断できるようになります。

今回Pythonで検証する2つの主要なアノマリー

この記事では、投資家が最も意識しやすい2つのアノマリーに焦点を当てて分析を行います。

1つ目は「月曜日効果」です。土日を挟んだ後の市場がどのように反応するのか、曜日ごとの平均収益率を算出して比較します。2つ目は「月末・月初効果(TOM効果)」です。月の最終営業日から翌月の数日間にかけて、本当に買いが優勢になっているのかを確かめます。

これらの検証を通じて、Pythonを使ったデータ分析の基礎から、グラフによる可視化までを一気に習得していきましょう。

検証の準備|Python環境とライブラリを整える

分析を始めるには、道具を揃える必要があります。Pythonには株価の分析に特化した便利なツールが豊富に用意されており、それらを組み合わせるだけで、プロの分析官に近い作業を自宅で行うことができます。

ここでは、データを取得するためのライブラリと、それを整理するためのライブラリを準備します。自分で一からプログラムを書く必要はありません。先人が作った便利なパーツを呼び出して使うだけなので、初心者の方でも安心して進めてください。

yfinanceをインストールしよう

株価データを取得する際、最も手軽で強力なのが「yfinance」というライブラリです。これはYahoo Financeのデータを無料で取得できるツールで、日本株から米国株、さらにはビットコインのような暗号資産まで、幅広いデータを網羅しています。

通常、株価データを入手するには有料の契約が必要なことも多いですが、yfinanceを使えばコマンド一つで10年分以上のデータを一瞬で手に入れることができます。まずは以下のコマンドで、必要なツールを自分の環境に取り込みましょう。

pip install yfinance pandas matplotlib seaborn

データの加工に欠かせないpandasと可視化ツール

取得した生データは、そのままでは分析に使えません。そこで登場するのが「pandas」というライブラリです。これは表形式のデータを扱うのが得意なツールで、Excelのような操作をプログラム上で行うことができます。

日付ごとに株価を並べ替えたり、曜日を判定したりといった作業はすべてpandasが担当します。また、数字の羅列を見ているだけでは傾向が分かりにくいため、matplotlibやseabornといったツールを使って、直感的に理解できるグラフを作成します。

分析に活用する主なライブラリの役割

  • yfinance:世界中の市場から株価データをダウンロードする
  • pandas:データを日付や曜日ごとに整理・集計する
  • matplotlib:折れ線グラフや棒グラフの土台を作る
  • seaborn:統計データを美しく色分けして可視化する

Google Colabなら環境構築なしで実行できる

自分のパソコンにPythonをインストールするのが面倒な場合は、「Google Colaboratory(コラボ)」を使うのが一番の近道です。Googleアカウントさえあればブラウザ上でPythonを実行できるため、環境構築で挫折することがありません。

Google Colabを使えば、今回紹介するコードをコピー&ペーストするだけで、すぐにグラフが表示されます。まずはブラウザで「Google Colab」と検索し、新しいノートブックを作成してみてください。そこがあなたの分析室になります。

株価データを取得する|検証の土台作り

準備が整ったら、いよいよ実際のデータを取得してみましょう。今回は、日本市場の代表的な指標である「日経平均株価」を例に分析を進めます。期間は直近の10年分程度あれば、統計的な傾向を見るのに十分です。

データの取得は、取得したい銘柄の「ティッカーシンボル」を指定するだけで完了します。日経平均の場合は「^N225」というコードを使います。このステップでは、単にデータをダウンロードするだけでなく、その後の分析がしやすいように「収益率」という形に加工するところまで解説します。

過去10年分の日経平均データをダウンロードする

yfinanceを使って、2014年から現在までのデータを取得してみましょう。以下のコードを実行すると、毎日の始値、高値、安値、終値、出来高が自動的に表形式で保存されます。

import yfinance as yf

# 日経平均株価のデータを取得
ticker = "^N225"
data = yf.download(ticker, start="2014-01-01")

# データの先頭を確認
print(data.head())

このように、たった数行で大量の歴史的データが手に入ります。自分で毎日記録をつける必要はありません。

終値から「前日比(収益率)」を算出する

アノマリー分析で重要なのは「価格そのもの」ではなく、「前日から何%動いたか」という収益率です。株価が1万円の時の100円の動きと、4万円の時の100円の動きでは、その重みが全く異なるからです。

pandasの pct_change() という機能を使えば、全ての日の収益率を一瞬で計算できます。これによって、異なる時期の動きを同じ土俵で比較できるようになります。

# 前日比(収益率)を計算
data['Returns'] = data['Adj Close'].pct_change()

欠損値を処理して分析可能な状態にする方法

データ取得の初日は「前日のデータ」がないため、収益率が計算できず「NaN(欠損値)」という空っぽの状態になります。これが入っていると後の計算でエラーが出る可能性があるため、最初に取り除いておきましょう。

「データは汚いもの」という前提で、分析前に掃除をする習慣をつけることが大切です。以下の1行を加えるだけで、きれいな分析用データが完成します。

# 最初の行にある欠損値を削除
data = data.dropna()

「月曜日効果」を検証|曜日ごとの収益率を比較する

データの掃除が終わったら、いよいよ本題の「曜日別アノマリー」を検証します。「月曜日は週末の不安から売られやすい」という仮説が、過去10年の日経平均に当てはまっているのかを見ていきましょう。

ここでは、日付データから曜日(月〜金)を判定し、それぞれのグループごとに平均値を計算します。単純に月曜日だけを見るのではなく、他の曜日と比較することで、月曜日がいかに「特殊なのか、あるいは普通なのか」を浮き彫りにします。

日付データから「曜日」の情報を抽出する

pandasのインデックス(日付)には、その日が何曜日かを教える機能が備わっています。 dt.day_name() を使えば、「Monday」や「Tuesday」といった名前を取り出すことができます。

# 日付から曜日を取得して新しい列を作る
data['Day_of_Week'] = data.index.day_name()

これで、各行に「その日が何曜日だったか」というラベルがつきました。

曜日ごとの平均収益率を算出するコード

次に、曜日ごとにデータをグループ分けして、収益率の平均を計算します。これがアノマリー分析の核心部分です。もし特定の曜日だけ極端に数字が低ければ、そこには何らかの「癖」があることになります。

# 曜日ごとの平均収益率を計算
day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
avg_returns = data.groupby('Day_of_Week')['Returns'].mean().reindex(day_order)

print(avg_returns)

この結果を見て、「月曜日はマイナスなのに、水曜日はプラスだ」といった違いを発見するのがデータ分析の醍醐味です。

グラフで可視化して視覚的に傾向を掴む

数字の羅列よりも、棒グラフにした方が一目で傾向がわかります。seabornというライブラリを使って、曜日別のリターンを可視化してみましょう。

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
sns.barplot(x=avg_returns.index, y=avg_returns.values)
plt.title('Average Daily Returns by Day of the Week')
plt.ylabel('Average Return')
plt.show()

グラフが右肩上がりになっていたり、特定の曜日だけ凹んでいたりしませんか?これが、あなたの手で暴き出した市場の癖です。

特定の曜日だけ動きが異なるか確認しよう

仮に「月曜日のリターンが低い」という結果が出たとしても、それが偶然かどうかを考える必要があります。例えば、10年のうち特定の1年だけ大暴落が月曜日に起きた場合、平均値が引きずられてしまうからです。

念のため、中央値(極端な値に影響されない真ん中の値)も確認してみるのがおすすめです。平均と中央値がどちらも低いのであれば、そのアノマリーはかなり信頼できる「癖」だと言えるでしょう。

「月末・月初」の癖を暴く|特定の日付に注目する

次に検証するのは、多くの投資家が給料日や積立設定日として意識する「月末・月初効果」です。一般的に、月の終わりから新しい月の始まりにかけては、市場に新しい資金が流れ込みやすいため、株価が上昇しやすいと言われています。

この分析では、日付の「日」に注目します。月末の最終営業日を0として、その前後数日間で株価がどう動いているかを追跡します。もしここで明確な上昇が見られるなら、積立投資の日付を少しずらすだけで、リターンが改善するかもしれません。

月末から数日間のデータを切り出すロジック

月の満了時期を特定するには、pandasの is_month_end という機能が便利です。しかし、単純な日付だけでなく「月末の5日前から月初の2日まで」といったスパンで分析したい場合は、もう少し工夫が必要です。

以下の表は、分析対象とする期間のイメージをまとめたものです。

分析対象とする期間の構成

  • 月末期間:月の最終営業日から遡って4〜5営業日前
  • 月初期間:新しい月の第1営業日から第2営業日ごろ
  • 比較対象:それ以外の「月の半ば」の期間

「25日から翌月3日まで」をグループ化して集計する

具体的に、「25日〜月末」と「月初〜3日」の期間を「TOM(Turn Of Month)」としてフラグを立ててみましょう。それ以外の期間と収益率を比較することで、この期間が本当に特別なものかを判定します。

# 月末・月初フラグの作成(例:25日以降または3日以前)
data['Is_TOM'] = (data.index.day >= 25) | (data.index.day <= 3)

# TOM期間とそれ以外の平均収益率を比較
tom_comparison = data.groupby('Is_TOM')['Returns'].mean()
print(tom_comparison)

月末に株価が跳ね上がる現象は本当にある?

もし Is_TOM がTrueのグループの方が、Falseのグループよりも明らかにリターンが高い場合、月末・月初アノマリーが存在している証拠です。日経平均株価においては、この傾向が非常に強く出ることが歴史的に知られています。

確かに、個別の銘柄によっては決算発表などの影響で打ち消されることもありますが、市場全体を見渡すと「給料日後の買い」や「機関投資家のリバランス」という大きな波が観測できるはずです。

積立投資のタイミングとアノマリーの関係

この分析結果は、日々の積立投資に直結します。もし「月初が高い」というデータが出ているなら、あえて市場が落ち着いている「月の半ば」に買い付ける設定にすることで、少しでも安く多くの株数を買える可能性があります。

データを知ることは、単なる知識欲を満たすだけでなく、自分のお金を守り、増やすための「武器」になるのです。

分析の罠にハマらないために|結果を正しく解釈するコツ

ここまでの検証で、いくつかの面白い傾向が見つかったかもしれません。しかし、データ分析には常に「罠」が潜んでいます。見つけたアノマリーを鵜呑みにして全財産を投じる前に、冷静に結果を検証し直すステップが必要です。

統計上の数字は、切り取り方次第でどうにでも見えてしまいます。ここでは、初心者が陥りやすい失敗を防ぎ、より精度の高い判断を下すためのチェックポイントを解説します。

サンプル期間を変えると結果は一変する

アノマリー分析で最も多いミスが、「期間の選び方」です。例えば、過去10年では月曜日が安かったとしても、直近の2年だけに絞ると、逆に月曜日が高くなっていることがあります。

市場の環境は常に変化しています。金利が高い時期、低い時期、景気がいい時、悪い時。それぞれの期間で同じ傾向が出ているかを確認してください。もし特定の期間だけで成立している法則なら、それはアノマリーではなく「たまたま起きた偏り」かもしれません。

手数料と税金を考慮した「実質リターン」を考える

アノマリーを利用して利益を出そうとする場合、取引コストを無視することはできません。例えば「月曜日に買って火曜日に売れば、平均0.05%の利益が出る」というデータが見つかったとしましょう。

しかし、実際の売買には以下のようなコストがかかります。

取引時に発生する主なコスト

  • 売買手数料:証券会社に支払う費用
  • スプレッド:買値と売値の差(隠れたコスト)
  • 税金:利益に対して約20%かかる(日本の場合)

これらを差し引いた後に利益が残らなければ、そのアノマリーに投資価値はありません。データの数字はあくまで「理論上の最大値」であることを忘れないでください。

異常値(暴落・暴騰)が平均値を歪めていないか?

10年間のデータの中に、一度だけ「1日で10%下落した月曜日」があったとします。すると、他の月曜日がどれだけ堅調でも、平均値は大きくマイナスに引っ張られてしまいます。

こうした極端な数値を「異常値」と呼びます。分析の際には、平均値だけでなく「プラスだった日とマイナスだった日の割合(勝率)」も確認するようにしましょう。平均がマイナスでも、勝率が50%を超えているなら、一部の暴落が数字を歪めているだけだと判断できます。

確かに、こうした細かい検証は手間がかかりますが、その手間こそが「根拠のある投資」を支える土台になります。

自分の気になる銘柄で検証してみよう

日経平均でのやり方がわかれば、あとは応用するだけです。トヨタ自動車のような個別株や、米国を代表するS&P500、あるいは最近話題のインド株など、あらゆる対象を同じコードで分析できます。

自分が入金している銘柄にどんな「癖」があるかを知っておけば、急な値動きに慌てることも少なくなります。最後に、コードを少し書き換えるだけで他の銘柄を分析する方法を紹介します。

個別銘柄にアノマリーは存在する?

個別銘柄の場合、市場全体のアノマリーに加えて、その企業特有のスケジュールが影響します。例えば、配当権利落ち日や決算発表日などです。

yfinanceのコードを書き換えて、気になる銘柄をチェックしてみましょう。

  • トヨタ自動車: 7203.T
  • Apple: AAPL
  • S&P500: ^GSPC

日本株と米国株で傾向はどう違うか

日本市場と米国市場では、時差や参加者の顔ぶれが異なるため、アノマリーの出方も変わります。例えば、米国株は金曜日の夜(日本時間)に雇用統計などの重要指標が発表されることが多いため、週明け月曜日の反応が日本株よりもビビッドに出る傾向があります。

「日本市場ではこうだったけど、本場アメリカではどうだろう?」と、自分なりに比較対象を広げていくと、分析の楽しさがさらに広がります。

コードの銘柄名(ティッカー)を書き換える手順

これまでに使ったコードの ticker = "^N225" の部分を、好きなコードに書き換えるだけで、全ての分析が再実行されます。

# 米国株の代表指標、S&P500に変更してみる
ticker = "^GSPC"
data = yf.download(ticker, start="2014-01-01")

このように、一度自分だけの「分析テンプレート」を作ってしまえば、一生使える強力なツールになります。

まとめ:データで市場の「癖」を味方につける

投資の世界には、月曜日や月末といった特定のタイミングで株価が動く「アノマリー」が確かに存在します。しかし、それが今も有効なのか、自分の資産を投じる価値があるのかは、過去のデータを使って自分で検証して初めて確信に変わります。

Pythonを使えば、これまで専門家しかできなかったような高度な分析を、誰でも数分で行うことができます。大切なのは、噂を鵜呑みにせず、事実(ファクト)に基づいて判断する姿勢です。

今回学んだ分析のポイントを振り返りましょう。

  • yfinanceを使えば、世界中の株価データが無料で手に入る
  • 「収益率」に変換することで、公平な比較ができる
  • 曜日や日付でグループ化すれば、市場の隠れた癖が見えてくる
  • 手数料や異常値に注意して、結果を冷静に解釈する

まずは気になる1銘柄から、Pythonを使って市場の裏側を覗いてみてください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次