ドル円アノマリー追記:データが暴く「公務員の給料」も刈り取られる日
前回の記事では、「毎月25日の給料日」を起点としたシステム的な円売り・ドル買いアノマリーについて解説しました。今回はさらに解像度を上げ、「毎月1日〜31日の日付別」でドル円の平均変化率(リターン)を可視化してみました。
使用したPythonコードは以下の通りです。
‘’’Python
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
# 分析期間の設定
dateStart = "2015-01-01"
dateEnd = "2026-05-23"
ticker = "JPY=X" # ドル円
df = yf.download(
ticker,
start=dateStart,
end=dateEnd,
auto_adjust=False,
progress=False
)
if isinstance(df.columns, pd.MultiIndex):
close = df["Close"][ticker].dropna()
else:
close = df["Close"].dropna()
daily_return = close.pct_change() * 100
analysis_df = pd.DataFrame({"Return": daily_return})
analysis_df.index = pd.to_datetime(analysis_df.index)
analysis_df["Day_of_Month"] = analysis_df.index.day
analysis_df = analysis_df[analysis_df.index.dayofweek < 5]
pivot_table = analysis_df.groupby("Day_of_Month")["Return"].mean()
heatmap_data = pd.DataFrame(pivot_table).T
plt.figure(figsize=(20, 3))
sns.heatmap(heatmap_data, annot=True, cmap="coolwarm", center=0, fmt=".3f",
cbar_kws={'label': 'Average Daily Return (%)'}, linewidths=0.5)
plt.title("USD/JPY Average Daily Return by Day of the Month (1-31)\n(Positive[Red] = USD Buy / JPY Sell)")
plt.xlabel("Day of the Month")
plt.yticks([])
plt.tight_layout()
plt.show()
‘’’
出力された結果(1〜31日のヒートマップ)
結果は非常に示唆に富むものでした。
月末(民間サラリーマンの給料日起点)のドル買いとは別に、「毎月19日〜20日」にかけて強烈なドル買い(赤色)が点灯し、直後の「21日」に急落(青色)していることが分かります。
このサイクルの起点は何か?それは公務員の給料日および年金支給日(15日)です。
15日に振り込まれた巨大な資金が、NISAなどの自動積立システムを通じて約4営業日後(19日~20日)に為替市場に着弾します。そして、その機械的な「買い需要」をあらかじめ知っている海外の投機筋(スマートマネー)が、最高値でドルを売りつけ、弾が尽きた翌21日に一斉に利益確定をして価格を叩き落としているのです。
