はじめに
過去の記事では、NYダウや日経平均のデータ分析を行ってきました。今回は、「前日のNYダウが上昇した場合、翌日の日経平均を始値で買って終値で売ったら利益が出るのか?」という、仮説をPythonを使って検証してみます。
この検証を通して、市場の連動性の一端をデータから確認しましょう。
💻 検証の準備:使用するツールとデータ
使用ライブラリ
今回の分析には、以下のPythonライブラリを使用します。
| ライブラリ名 | 用途 |
|---|---|
yfinance |
株価データの取得(NYダウ、日経平均) |
pandas |
データ分析、加工 |
numpy |
数値計算、条件分岐処理 |
matplotlib |
グラフ描画(今回は結果表示のみ) |
検証期間とデータ
- 検証期間: 2015年1月1日 から 2025年10月18日
-
対象指数:
-
NYダウ (
^DJI) -
日経平均株価 (
^N225)
-
NYダウ (
📈 検証ロジック
今回の検証の仮説とトレードルールは以下の通りです。
- 判定条件: 前日のNYダウの終値が、その前の日の終値よりも上昇していた場合。
- トレード: 翌日の日経平均を始値(Open)で買い、その日の終値(Close)で売却する(デイトレード)。
- 利益: トレードによる日中リターン((終値 - 始値) / 始値)を計算し、累積リターンと勝率を評価する。
🐍 Pythonコード
データ取得、加工、検証を行うPythonコード全体です。
import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# ティッカーシンボル
TICKER_DOW = '^DJI' # NYダウ
TICKER_NIKKEI = '^N225' # 日経平均
# データ取得期間
START_DATE = '2015-01-01'
END_DATE = '2025-10-18'
# データのダウンロード
print("株価データのダウンロード中...")
dow_data = yf.download(TICKER_DOW, start=START_DATE, end=END_DATE)
nikkei_data = yf.download(TICKER_NIKKEI, start=START_DATE, end=END_DATE)
print("ダウンロード完了。")
# --- データ加工 ---
# 1. NYダウの前日比の上昇/下落を判定する列を作成
# Dow_Up: True(上昇)/ False(下落または変わらず)
# shift(1)で前日の終値を現在の行に持ってくる
dow_data['Dow_Up'] = (dow_data['Close'] > dow_data['Close'].shift(1))
# 2. 必要な日経平均のデータ(OpenとClose)を抽出
nikkei_trade_data = nikkei_data[['Open', 'Close']].copy()
nikkei_trade_data.columns = ['Nikkei_Open', 'Nikkei_Close']
# 3. NYダウの判定結果と日経平均の当日のトレードデータを結合
combined_df = pd.merge(
dow_data['Dow_Up'].to_frame(), # .to_frame() でDataFrame化
nikkei_trade_data,
left_index=True,
right_index=True,
how='inner'
)
# 4. NYダウの前日のデータと、日経平均の当日のデータを対応させる
# Dow_Upを1日分シフト(前日のNYダウの判定を当日の日経平均の行に移動)
combined_df['Prev_Dow_Up'] = combined_df['Dow_Up'].shift(1)
# 最初の行(シフトによりNaNになる)を削除
combined_df.dropna(inplace=True)
# --- 利益の計算と検証 ---
# 5. NYダウが上がった翌日(Prev_Dow_Up == True)の日経平均の日中リターンを計算
# 日中リターン = (終値 - 始値) / 始値
# 条件に合わない日はトレードしない(リターン0)
combined_df['Daily_Return'] = np.where(
combined_df['Prev_Dow_Up'] == True,
(combined_df['Nikkei_Close'] - combined_df['Nikkei_Open']) / combined_df['Nikkei_Open'],
0
)
# 6. 実際にトレードした日(NYダウ上昇の翌営業日)のデータを抽出
trade_days = combined_df[combined_df['Prev_Dow_Up'] == True]
# 7. 勝率の計算
winning_trades = len(trade_days[trade_days['Daily_Return'] > 0]) # 利益が出た回数
total_trades = len(trade_days) # 総トレード回数
win_rate = (winning_trades / total_trades) * 100 if total_trades > 0 else 0
# --- 結果の表示 ---
print("\n--- 検証結果(NYダウ上昇の翌日、日経平均を始値買い→終値売り)---")
print(f"検証期間: {START_DATE} から {END_DATE}")
print(f"総トレード回数(NYダウ上昇の翌日): {total_trades} 回")
print(f"利益が出た回数: {winning_trades} 回")
print(f"**利益が出る確率(勝率)**: {win_rate:.2f} %")
# 8. 累積リターンの確認(参考)
combined_df['Cumulative_Return'] = (1 + combined_df['Daily_Return']).cumprod()
final_return_pct = ((combined_df['Cumulative_Return'].iloc[-1] - 1) * 100)
print(f"累積利益率(トータルリターン): {final_return_pct:.2f} %")
# 累積リターンをグラフで可視化
plt.figure(figsize=(10, 6))
combined_df['Cumulative_Return'].plot(title='Cumulative Return of Nikkei 225 Trading Strategy (2015-2025)')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.grid(True)
plt.show()
✅ 検証結果の考察
上記のコードを実行すると、以下のような結果が出力されます。
| 指標 | 結果 |
|---|---|
| 検証期間 | 2015-01-01 から 2025-10-18 |
| 総トレード回数 | 1372 回 |
| 利益が出た回数 | 670 回 |
| 利益が出る確率(勝率) | 48.83% |
| 累積利益率(トータルリターン) | プラス |
📊 結果から読み取れること
- 勝率: 勝率は50%に届きませんでした。。これは、前日NYダウが上がったからといって、翌日の日経平均の始まり値に、前日のNYダウの値上がりが織り込まれていて、当日の朝、日経平均を買っても、勝てるわけではないことを示しています。やはり、安易な金儲けはできないですね(笑)
- 累積利益率: 累積利益率がプラスになっているようですが、これは最近の株高が反映されている可能性が強いですね。逆に、期間の前半は、ずっとマイナスでした(笑)
- 市場の連動性: この結果は、「NYダウの上昇は、翌日の日経平均の取引開始時に、すでに織り込まれている」という解釈につながります。すなわち、多くの場合、NYダウの結果は翌日の日経平均の始まり値に最も強く影響する、ということですね。
📌 注意点
この検証は、取引手数料や税金などを一切考慮していません。実際の取引ではこれらのコストがかかるため、見かけ上の利益率よりも実際の利益は小さくなります。
🚀 まとめ
NYダウの上昇が翌日の日経平均の日中取引に与える影響を検証しました。この検証では、前日のNYダウの上げに基づいて、日経平均を買うというシンプルな戦略が優位性を持たないことが分かりました(笑)
株価指数間の連動性を探ることは、市場分析の重要な視点の一つです。今後も様々な分析をPythonでやってみたいですね!
