Python経済指標関連の取得

コモディティの価格を時系列で登録し、為替などの相関関係を知るようにする

コモディティの価格を時系列で登録し、為替などの相関関係を知りたい。
必要なコモディティの種類は?

コモディティ価格と為替(特にドル円やユーロ円など)の相関関係を把握するためには、以下のような主要なコモディティを時系列で登録するのが有効です。
特にFXや経済動向を分析する際には、以下の分類で把握しておくと良い

✅ 必要なコモディティの種類(カテゴリー別)
① エネルギー系
名称 代表指標 備考
WTI原油 WTI Crude Futures 米ドル建て。インフレや経済活動の先行指標。
ブレント原油 Brent Crude Futures 欧州圏の価格指標。WTIと並んで注視される。
天然ガス Henry Hub 欧州エネルギー危機などで為替と連動しやすい。

Henry Hub 欧州エネルギー危機などで為替と連動しやすい。
② 金属系
名称 代表指標 備考
金(ゴールド) Gold Spot Price 安全資産。ドルと逆相関の傾向あり。
銀(シルバー) Silver Spot Price 金と類似の動き。産業需要も関与。
銅(カッパー) Copper Futures 景気敏感資産。中国・新興国と関係が深い。
プラチナ・パラジウム Platinum/Palladium 産業用・自動車触媒用途で価格変動大。
③ 農産物系(インフレ関連)
名称 代表指標 備考
小麦 Wheat Futures 戦争・天候で価格大きく変動。
トウモロコシ Corn Futures 飼料用として需給に影響。
大豆 Soybean Futures 食料・バイオ燃料で重要。
④ その他注目資源
名称 代表指標 備考
リチウム Lithium Price Index EV市場と密接に関連。中国・豪州に依存。
コバルト・ニッケル Cobalt/Nickel Prices バッテリー需要と連動。資源ナショナリズムの影響も。

✅ 登録しておきたい為替通貨ペア(相関分析用)
通貨ペア 注目理由
USD/JPY ドル建てのコモディティ価格に直結。
EUR/USD 欧州経済とエネルギー需要の指標。
AUD/USD 豪州=資源国。銅・鉄鉱石と連動性あり。
CAD/USD カナダも資源国(特に原油)。
USD/CNH 中国との資源輸入の関係性(特に銅・石炭)。

✅ おすすめの時系列データソース
データ種類 ソース例
原油・金属・農産物先物 Investing.com, TradingEconomics, Quandl
通貨為替レート Yahoo Finance API, ECB, FRED, 為替API
IMMポジション(投機筋) CFTCのCoTレポート
金利・CPIとの関連 各国中央銀行、BLS、BOJなど

✅ SQLiteやNeo4jへの登録用途
* SQLite:時系列データの保存・分析に最適(例:WTI原油価格とドル円の過去5年分の変動)
* Neo4j:コモディティ間、通貨間、インフレ・金利・景気指標との**関係性可視化(ナレッジグラフ)**に有効

✅ 補足:相関関係の例
* WTI価格上昇 ⇒ 米長期金利上昇 ⇒ ドル高 ⇒ 円安
* 金価格上昇 ⇒ リスクオフ(ドル売り) ⇒ 円高

Python経済指標関連の取得

去年WTIの価格を取得できたがライブラリの変更などで取得ができない
今後に備えてcsvにしてDBに格納しておく

経済指標関連は過去は invetpyでできたけど
内部API変更により使えなくなった

Python×APIを活用して株価を取得してみた

を参考に行う

インストール関しては

PythonでFRED、Alpha Vantage、Binanceからデータを取得する方法

pip install requests pandas python-dotenv ccxt

でインストール

APIキーが必要になる

FREDの米国経済指標をpythonでグラフ化
を参考に

https://fred.stlouisfed.org/docs/api/fred/
へアクセス
API Keys をクリックし
Request or view your API keys
をクリック

これでアカウントがなければ登録し
APIキーを発行する

登録する時に用途を聞かれる

I am developing a personal economic analysis application that stores FRED data (e.g., oil prices, CPI, interest rates) into a local SQLite and Neo4j database. The application is intended for tracking trends, visualizing correlations, and supporting financial decision-making.

SQLiteとNeo4jを使って経済指標(WTIなど)の時系列分析や相関分析を行いたいと考えているので

意味は
私は、FREDのデータ(例:原油価格、CPI、金利など)をSQLiteやNeo4jに格納し、経済指標のトレンドや相関関係を可視化・分析する個人用のアプリケーションを開発しています。これは主に家計管理や金融判断のサポートを目的としています

となる

 I have read and agree to the St. Louis Fed’s Terms of Use, Privacy Notice & Policy, and Legal Notices, Information and Disclaimers.

「私は、セントルイス連邦準備銀行(St. Louis Fed)の 利用規約、プライバシー通知とポリシー、および法的通知・情報・免責事項を読んだ上で、これらに同意します。」
という意味

これにチェックを入れる

これでキーが取得できる

ModuleNotFoundError: No module named 'fredapi'

となるので
https://pypi.org/project/fredapi/
を参考に

pip install fredapi
import pandas as pd     # データ処理用ライブラり
import os              # フォルダを作成したりするのに活用するライブラリ  
import yfinance as yf # Yahoo Financeデータ取得用ライブラリ
from fredapi import Fred # FRED API操作用ライブラリ

# –FREDからデータ取得情報に設定——————————————-
# FRED APIキーを設定
fred_api_key = ''
fred = Fred(api_key=fred_api_key)
# 取得する経済指標シリーズIDをリストを定義する、リストの名称はseries_ids
series_ids = ['CBBTCUSD', 'CPIAUCSL', 'FEDFUNDS', 'DGS10', 'DEXJPUS']
# 取得したい期間を指定
start_date = '2020-01-01'
end_date = '2023-12-31'
# ——————————————————————————-
# ★★★取得結果を格納する箱の作成
fred_data = {}
# ★★重要ループ処理の実行—————————————————

for series in series_ids:
    data = fred.get_series(series, observation_start=start_date, observation_end=end_date)
    # PandasのDataFrameに変換し、列名をシリーズIDに設定
    df = data.to_frame().reset_index()
    df.columns = ['Date', series]
    # 辞書に保存
    fred_data[series] = df
    
    print(series)

を実行すると

 python test.py
CBBTCUSD
CPIAUCSL
FEDFUNDS
DGS10
DEXJPUS

となる

まずは実験成功

次に環境変数に代入する

export FRED_API_KEY="" 

pip install full_fred

も必要

これで

import os
import pandas as pd
import seaborn as sns
from full_fred.fred import Fred
import matplotlib.pyplot as plt

#pandas:1.3.5で本プログラムは動作確認しています。
print('pandas:', pd.__version__)

を実行した時に

pandas: 2.2.3

となる

Pipでインストールしていないと

Traceback (most recent call last):
  File "/Users/snowpool/aw10s/FRED/gdp.py", line 4, in <module>
    from full_fred.fred import Fred
ModuleNotFoundError: No module named 'full_fred'

となるので注意

次に

import os
import pandas as pd
import seaborn as sns
from full_fred.fred import Fred
import matplotlib.pyplot as plt

#pandas:1.3.5で本プログラムは動作確認しています。
#print('pandas:', pd.__version__)
# FRED_API_KEY = os.getenv('FRED_API_KEY')
fred = Fred()
print(f"FRED APIキーが環境変数に設定されている:{fred.env_api_key_found()}")


def get_fred_data(name, start="2013-01-01", end=""):
    df = fred.get_series_df(name)[["date", "value"]].copy()
    df["date"] = pd.to_datetime(df["date"])
    df["value"] = pd.to_numeric(df["value"], errors="coerce")
    df = df.set_index("date")

    if end == "":
        df = df.loc[f"{start}":]
    else:
        df = df.loc[f"{start}":f"{end}"]
    return df

def MakeGraphFromFred(name, start):
    if(type(name)!=list):
        df_UNRATE = get_fred_data(name, start=start)
        data1 = df_UNRATE
        data1 = data1.reset_index()
        fig, axes = plt.subplots(1, 1, figsize=(6,4), tight_layout=False, facecolor="whitesmoke")
        axes.plot(data1['date'], data1['value'])
        axes.set_xlabel('date')
        axes.set_ylabel(name)
        axes.set_title(name)
    else:
        num = len(name)
        fig, axes = plt.subplots(num, 1, figsize=(10,4*num/2), tight_layout=False,sharex=True, facecolor="whitesmoke")
        for i in range(num):
            df_UNRATE = get_fred_data(name[i], start=start)
            data1 = df_UNRATE
            data1 = data1.reset_index()
            axes[i].plot(data1['date'], data1['value'])
            axes[i].set_xlabel('date')
            axes[i].set_ylabel(name[i])
#             axes[i].set_title(name[i])
        
    plt.show()
    return

plt.rcParams['font.family'] = 'Times new roman' #
#[ 'serif' | 'sans-serif' | 'cursive' | 'fantasy' | 'monospace' ]

MakeGraphFromFred("UNRATE", start="1980-01-01")

とすることで
1980年からの失業率をグラフで表示

次にこれをcsvに保存する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です