2025.06.25
ChatGPTで代替経済指標の分析をしてみた Part2
はじめに
グループ研究開発本部・AI研究開発室のS.Sです。
6/13にイスラエルとイランの衝突のニュースが報じられて以来、地政学リスクの高まりが意識され、株価の下落や原油価格の高騰につながっています。
前回の記事ではちょうどトランプ関税が話題になっていたところで経済政策不確実性指数(EPU)を取り上げたので、今回も同じ流れで似たようなニュース記事ベースの指数の地政学リスク版であるgeopolitical risk index (GPR)を取り上げたいと思います。
今回の記事ではニュースが出たと思われる日を起点に株式インデックス・ドル・原油などの各種資産への影響をイベントスタディの形式で見てみることにしましょう。
GPRとは
定義と目的
Geopolitical Risk Index(GPR)は、新聞記事に登場する「戦争」「テロ」「軍備増強」など地政学的リスクを示す用語の出現頻度を集計し、リアルタイムの地政学的緊張度合いを定量化する指標です。
指数の開発者
開発は米連邦準備制度理事会のエコノミスト、Dario Caldara と Matteo Iacoviello によって行われ、IFDP No. 1222「Measuring Geopolitical Risk」として 2018年2月に発表されました。
測定方法
主要10紙(Financial Times、New York Times、Wall Street Journal など)を対象に、8つのカテゴリ(戦争開始、衝突、軍事動員、恐怖表現など)の関連用語が記事中に登場する割合を算出。各紙・各カテゴリごとに「該当記事数/全記事数」を求め、加重平均して指数化します。
時系列と公開頻度
指数の作成で参照されているニュース媒体は直近とそれ以前の期間で若干異なります。
- Historical Index: 1900年~1984年(少数紙)
- Recent Index: 1985年~現在(10紙)
サブ指数の構成
- Geopolitical Threats: 戦争やテロの脅威を示す用語群
- Geopolitical Acts: 実際の行為・衝突を示す用語群
として分けることで、「脅威の高まり」と「実際の衝突動向」を区別して分析可能ですが、今回の記事ではメイン指数の分析のみにとどめます。
イベントスタディのコード作成
それではGPR変化が資産価格に与える影響をイベントスタディの形で見ていきましょう。
まずは以下のようなプロンプトで分析コードを生成してもらいます。
gpr/gpr_daily_20250623.csvはgeopolitical risk indexの日次データです。 このデータを入力ファイルとして受け取り、地政学リスクの株価(SP500)・ドルインデックス・原油価格への影響を評価するpythonコードを書いてください。 具体的にはGPRの変化率を分位数で3分割して、変化が生じた時から前後30日間の平均リターンを上記の各資産ごとに算出してください。
間隔は1日ごとでよくあるイベントスタディのように分析してください。
アウトプットはresult_dfに格納すること。
累積リターンの形式で算出できるように以下のような修正のプロンプトも投げておきます。
イベントスタディのリターンは前後90日間の平均リターンが格納されています。
0日~90日後, 90日前~0日でそれぞれ累積リターンを格納するようにしてください。
上記のプロンプトを投げると以下のようなコードを出力してくれました。
※細かい部分はGPRの変化率の移動平均をとるなど少し手直ししています。
import yfinance as yf
import pandas as pd
import numpy as np
from tqdm import tqdm
# 資産データ取得
symbols = {
'S&P500': '^GSPC',
'USD': 'DX-Y.NYB',
'CrudeOil': 'CL=F',
}
start_date = '2000-01-01'
end_date = '2025-12-31'
data = {}
for name, symbol in symbols.items():
df = yf.download(symbol, start=start_date, end=end_date)
data[name] = df['Close']
price_df = pd.concat(data, axis=1)
# 日次リターン
returns_df = price_df.pct_change()
# GPRデータ読み込み
gpr_df = pd.read_csv('gpr_daily_20250623.csv', parse_dates=['Date'])
gpr_df = gpr_df.set_index('Date').squeeze().sort_index().pct_change().rolling(7).mean()
gpr_df = pd.qcut(gpr_df, 3, labels=['low', 'mid', 'high']).loc["2000-01-01":]
# イベントウィンドウ設定
window = 30
lags = np.arange(-window, window+1)
result_list = []
for q in ['low', 'mid', 'high']:
idx = gpr_df.index[gpr_df == q]
for asset in returns_df.columns:
event_returns = []
for event_date in tqdm(idx):
window_returns = []
for lag in lags:
target_date = event_date + pd.Timedelta(days=lag)
if target_date in returns_df.index:
window_returns.append(returns_df.loc[target_date, asset])
else:
window_returns.append(np.nan)
event_returns.append(window_returns)
event_returns = np.array(event_returns)
# 0日を基準に分割
zero_idx = window # lags[window] == 0
# 0日~+30日
post_cumrets = np.nanmean(np.nancumsum(event_returns[:, zero_idx:], axis=1), axis=0)
# -30日~0日(逆順で累積→元の順に戻す)
pre_cumrets = np.nanmean(np.nancumsum(event_returns[:, :zero_idx+1][:, ::-1], axis=1)[:, ::-1], axis=0)
# 格納
for i, lag in enumerate(lags[zero_idx:]):
result_list.append({
'GPR_chg_q': q,
'Asset': asset,
'LagDay': lag,
'MeanReturn': post_cumrets[i]
})
for i, lag in enumerate(lags[:zero_idx+1]):
result_list.append({
'GPR_chg_q': q,
'Asset': asset,
'LagDay': lag,
'MeanReturn': -pre_cumrets[i]
})
result_df = pd.DataFrame(result_list)
分析結果
それでは上記のコードで影響分析をした結果をみてみましょう。
地政学リスクの影響をもっとも受けやすい原油では、リスクが高まると価格が上昇するというイメージ通りのパターンが現れています。

ドルについてもやはり安全資産への需要からリスクが高まると価格が上昇するトレンドが現れています。

最後に株式インデックスですが、こちらはリスクの高まりとともに明確な下落トレンドが現れるというわけではなく、若干解釈しづらい結果となっています。

まとめ
今回のイベントスタディにより地政学リスクについてもニュースベースの指標であるGPRによりある程度トレンドを掴めることがわかりました。
他の指標などと組み合わせて使うことで、大きな動きが起こりそうな時は察知できるものと思われます。
最後に
グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD

