分析に必要な各種経済指標のデータとの関連付け

分析に必要な各種経済指標のデータとの関連付け

AIによる時系列分析や予測において本当に必要なのは、
👉 「金価格(など予測対象)」と
👉 「各種経済指標との関連付け(=特徴量選定と因果仮説)」です。

✅ その理由(AIの本質に基づく)
AI(特にLSTMやProphetなどの時系列モデル)は、**「将来の値を予測するために、過去の関連データのパターンを学習」**します。
つまり:
* 単独の金価格系列では限界がある
→ 過去の金価格だけでは、政策変更・インフレ期待・為替変動に追いつけない
* 経済指標と結びつけてこそ「なぜ上がるか/下がるか」が予測できる
→ CPIの上昇やドル円の変動が金価格に与える影響など

✅ だから必要なのは「関連付け」=特徴量選定 + 時間的因果性
必要な処理 内容 例
📊 相関分析 金価格とCPI・WTI・ドル円の関係性を数値化 .corr() や ヒートマップ
🕒 ラグ特徴量 CPIやドル円の1日遅れ・1週間遅れの影響を追加 CPI_t-1, USDJPY_t-7
⛓ 因果関係の仮説 「インフレ率が上がると金が買われる」など CPI↑ → 金価格↑
⚙ 特徴量エンジニアリング 変化率、移動平均、ボラティリティなどの導入 ΔCPI, SMA_20

✅ 例:金価格を予測するための特徴量候補
特徴量 説明
CPI 消費者物価指数(インフレ期待)
WTI 原油価格(インフレ・景気指標)
USDJPY 為替(円安→金価格上昇しやすい)
金価格_t-1 前日終値
ΔCPI CPIの変化量(前月比)
SMA_20_gold 20日移動平均(トレンド)
金/CPI比 実質金価格(インフレ調整後価格)

✅ まとめ:分析に本当に必要なのは?
項目 必要性 補足
📈 チャート表示 ✅ 人間の理解に必要 傾向・異常・変動要因の発見
📊 指標との関連付け ✅ AI予測精度に不可欠 入力特徴量(多変量予測)
🧠 因果仮説 ✅ 分析の出発点 「何が影響しているか」をモデルに伝える

✅ 次にできること
* 🧠 特徴量エンジニアリングの開始(変化率・ラグ・差分)
* 📦 SQLiteやNeo4jで「日付→経済指標→金価格」の関連構造を保持
* 🔮 ProphetやLSTMにマルチ変数として入力して予測

ご希望あれば、次のステップとして:
* ✅ 「金価格予測用の学習データ(特徴量セット)」を自動生成するスクリプト
* ✅ 「影響度の高い特徴量ランキング」分析
* ✅ 「変化率・ラグ特徴量」を生成するコード
などご案内可能です。どこから進めたいですか?

ChatGPT に質問する
あなた:
FX、為替の分析をしたい場合、必要となる指標は? できるかぎり集めたいので、必要な指標を全て示して

ChatGPT:
素晴らしい取り組みです!
FX(外国為替)・為替レートの分析を本格的に行うために必要となる経済指標・市場指標・ポジションデータを、以下にカテゴリ別・優先度付きで網羅的に整理しました。

✅ 【最重要】中核となる経済指標(為替を動かす主要因)
カテゴリ 指標名 FREDコード / 取得元 内容
🧑‍💼 雇用 非農業部門雇用者数(NFP) PAYEMS(FRED) 米国雇用統計の中心指標、サプライズで為替が大きく動く
👷‍♂️ 失業率 失業率 UNRATE(FRED) 労働市場の健全性を反映
📈 インフレ CPI(消費者物価指数) CPIAUCSL(FRED) インフレ率(注目度高)
📊 物価 PCEコアデフレーター PCEPILFE(FRED) FRBが重視する物価指標
📦 生産 鉱工業生産 INDPRO(FRED) 経済活動の実態を示す
🛒 消費 小売売上高 RSXFS(FRED) 個人消費の強さを表す
🏛 金融政策 政策金利(FF金利) FEDFUNDS(FRED) FOMCの最終利上げ判断指標
📈 金利差 米・日本の10年債利回り差 DGS10 / JP10Y 長期金利差は為替の方向を決定

✅ 【重要】短期変動・投機を捉えるための指標
カテゴリ 指標名 取得先 内容
💼 ADP雇用統計 ADP民間雇用者数 ADP公式 NFPの先行指標(民間推計)
🏗 ISM製造業/非製造業 PMI指標 ISM公式 景気の加熱・冷え込みを評価
🌍 貿易 貿易収支 NETEXP(FRED) 国際収支・通貨需要を反映
🧾 財政 政府財政収支 FRED / 統計局 政策余地・財政リスクの判断
💬 FOMC発言 FOMCドットチャートや声明 FRB公式 将来の金利動向を織り込む判断材料

✅ 【ポジション系】センチメント分析に不可欠な指標
カテゴリ 指標名 取得先 内容
📊 IMMポジション 通貨先物建玉(Netポジ) CFTC(毎週金曜) 投機筋の動向を把握(過熱判断)
💹 リスク指標 VIX指数(恐怖指数) VIXCLS(FRED) リスクオン/オフの判定に重要
📈 株式指数 S&P500, NASDAQなど SP500(FRED)など リスク資産への流入・退避確認
🏦 金利先物 FedWatch、SOFR先物 CMEなど 金利の織り込みを可視化

✅ 【通貨ごとに重視される補足指標】
🇺🇸 米ドル(USD):
* GDP(GDPC1)
* フィラデルフィア連銀指数(PHIIND)
* シカゴ購買部協会指数
🇯🇵 円(JPY):
* 日銀政策金利(BoJ)
* コアCPI(日本)
* 実質実効為替レート(REER)
🇪🇺 ユーロ(EUR):
* ドイツIFO景況感指数
* ユーロ圏CPI
* ECB政策金利
🇨🇳 人民元(CNY):
* 中国GDP・CPI・製造業PMI
* 人民元中間値(CNH基準値)

✅ 【補足】その他考慮すべき指標
カテゴリ 指標名 内容
📊 景気動向指数 景気先行指数(USSLIND)
🏡 住宅関連 住宅着工件数(HOUST)、中古住宅販売
🏦 中央銀行バランスシート FRB、ECB、BoJなど
🛢 コモディティ 金価格(GC=F)、原油(CL=F)、銅など

✅ 分析に使えるデータソース一覧
データソース 内容 APIなど
FRED 米経済指標(無料) pandas_datareader
CFTC IMMポジション Excel or スクレイピング
TradingEconomics 世界の経済指標 REST API(有料もあり)
Yahoo Finance 為替・コモディティ yfinance
Quandl 金利・コモディティ・COT 一部無料・有料
Investing.com イベントカレンダー スクレイピング or 手動

✅ 次におすすめのステップ
1. ✅ 必要指標リストをCSVで保存 or 管理
2. ✅ FREDやYahooから取得スクリプトを一括作成
3. ✅ SQLiteやNeo4jに格納 → 分析&予測

必要であれば:
* ✅ 上記リストをCSVファイルにして渡す
* ✅ FREDなどから自動取得するスクリプト
* ✅ SQLiteへ連携するコード
など、あなたの分析基盤を整える形でサポート可能です。
次に進めたいステップを教えてください!

これで気になることは
* 🧠 特徴量エンジニアリングの開始(変化率・ラグ・差分)
* 📦 SQLiteやNeo4jで「日付→経済指標→金価格」の関連構造を保持 はこの順番で行う? それとも別の案件になる?

この2つは基本的に同じ分析プロジェクトの中で「役割が違うだけ」

✅ それぞれの役割の違い
ステップ 目的 主なツール タイミング
🧠 特徴量エンジニアリング モデルの精度を上げるために、学習用データを整備する pandas, numpy, scikit-learn モデル構築前に必須
📦 SQLite/Neo4jへの関連構造保存 人が理解・探索・説明するための構造化された関係表現 SQLite, Neo4j, cypher 可視化・レポート・RAG/LLM活用に有効

関係性は
[時系列データの取得]

[SQLiteで一元管理] ─────→ (RAGやLLMとの連携)

[特徴量エンジニアリング(差分・変化率・ラグ)]

[AIモデル構築(LSTM・Prophet・回帰など)]

[結果をNeo4jに格納して因果関係として見える化]

となる

📌 現実的な実行順はこうなります:
1. ✅ SQLiteに元データを格納する(データ基盤を整える)
2. ✅ 特徴量エンジニアリングを行う(モデル用データを整える)
3. ✅ モデルで予測・分析する
4. ✅ 分析や因果関係を人が探索するためにNeo4jへ登録

✅ まとめ:分けるべきか?
条件 同一案件でOK 分けたほうが良い
モデル精度を高めたい ✅
モデルとLLM/RAGの両方やる ✅(役割分担すればOK)
LLM用に知識構造をつくりたい ✅ Neo4j中心の別構造として

✅ 提案:以下のように分けて設計するとスムーズです
モジュール名 内容
feature_engineering.py 差分・ラグ・変化率などを作成してCSV/DF化
store_data_sqlite.py すべての指標をSQLiteに保存・更新
export_to_neo4j.py 分析結果や関係性をグラフDBに格納
train_model.py LSTMやProphetで予測モデル構築

ドル円レートの取得

ドル円レートの取得

yfinance でドル円は以下のティッカーで取得できます:
* USDJPY=X

gold: 金先物価格(USD/oz)
cpi: 米国の消費者物価指数(FREDから)
oil: WTI原油価格(USD/バレル)
usd_jpy: ドル円為替レート(1 USD = ◯◯ JPY)

取得した結果はcsvに保存し sqliteに保存することで毎回再取得せずに行えるようにしたい

mkdir auto_deel
cd auto_deel 

で作業ディレクトリ作成

 vim fetch_and_save_all.py

でスクリプト作成

import pandas as pd
import pandas_datareader.data as web
import yfinance as yf
import datetime
import os

# 保存先
csv_dir = "csv_data"
os.makedirs(csv_dir, exist_ok=True)

# 日付範囲
start = "2000-01-01"
end = datetime.datetime.today().strftime("%Y-%m-%d")

# 金価格(すでに保存済みのCSVを使用)
gold = pd.read_csv("gold_price_gc_f.csv", skiprows=[1], parse_dates=["Price"])
gold.rename(columns={"Price": "Date", "Close": "gold_price"}, inplace=True)
gold = gold[["Date", "gold_price"]]
gold.to_csv(f"{csv_dir}/gold.csv", index=False)

# CPI
cpi = web.DataReader("CPIAUCSL", "fred", start, end).reset_index()
cpi.columns = ["Date", "cpi"]
cpi.to_csv(f"{csv_dir}/cpi.csv", index=False)

# WTI
oil = web.DataReader("DCOILWTICO", "fred", start, end).reset_index()
oil.columns = ["Date", "oil"]
oil.to_csv(f"{csv_dir}/oil.csv", index=False)

# ドル円
usd_jpy = yf.download("USDJPY=X", start=start, end=end, interval="1d")[["Close"]]
usd_jpy.rename(columns={"Close": "usd_jpy"}, inplace=True)
usd_jpy.reset_index(inplace=True)
usd_jpy.to_csv(f"{csv_dir}/usd_jpy.csv", index=False)

print("✅ すべてのデータをCSVに保存しました。")

これで実行すると

Traceback (most recent call last):
  File "/Users/snowpool/aw10s/auto_deel/fetch_and_save_all.py", line 16, in <module>
    gold = pd.read_csv("gold_price_gc_f.csv", skiprows=[1], parse_dates=["Price"])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1026, in read_csv
    return _read(filepath_or_buffer, kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 620, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1620, in __init__
    self._engine = self._make_engine(f, self.engine)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1880, in _make_engine
    self.handles = get_handle(
                   ^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/common.py", line 873, in get_handle
    handle = open(
             ^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'gold_price_gc_f.csv'

これは金価格を保存ファイルから読み込んでいるため
新規に作業ディレクトリ作成しているため、これだと動作しない

import pandas as pd
import pandas_datareader.data as web
import yfinance as yf
import datetime
import os

# 保存先ディレクトリ
csv_dir = "csv_data"
os.makedirs(csv_dir, exist_ok=True)

# 期間
start = "2000-01-01"
end = datetime.datetime.today().strftime("%Y-%m-%d")

# ✅ 金価格(GC=F)
gold = yf.download("GC=F", start=start, end=end, interval="1d")[["Close"]]
gold.rename(columns={"Close": "gold_price"}, inplace=True)
gold.reset_index(inplace=True)
gold.to_csv(f"{csv_dir}/gold.csv", index=False)

# ✅ CPI(FRED)
cpi = web.DataReader("CPIAUCSL", "fred", start, end).reset_index()
cpi.columns = ["Date", "cpi"]
cpi.to_csv(f"{csv_dir}/cpi.csv", index=False)

# ✅ 原油(WTI:FRED)
oil = web.DataReader("DCOILWTICO", "fred", start, end).reset_index()
oil.columns = ["Date", "oil"]
oil.to_csv(f"{csv_dir}/oil.csv", index=False)

# ✅ ドル円(USD/JPY)
usd_jpy = yf.download("USDJPY=X", start=start, end=end, interval="1d")[["Close"]]
usd_jpy.rename(columns={"Close": "usd_jpy"}, inplace=True)
usd_jpy.reset_index(inplace=True)
usd_jpy.to_csv(f"{csv_dir}/usd_jpy.csv", index=False)

print("✅ すべてのデータをCSVに保存しました。")

というように全て取得するに修正

これで実行すれば

/Users/snowpool/aw10s/auto_deel/fetch_and_save_all.py:16: FutureWarning: YF.download() has changed argument auto_adjust default to True
  gold = yf.download("GC=F", start=start, end=end, interval="1d")[["Close"]]
[*********************100%***********************]  1 of 1 completed
/Users/snowpool/aw10s/auto_deel/fetch_and_save_all.py:32: FutureWarning: YF.download() has changed argument auto_adjust default to True
  usd_jpy = yf.download("USDJPY=X", start=start, end=end, interval="1d")[["Close"]]
[*********************100%***********************]  1 of 1 completed
✅ すべてのデータをCSVに保存しました。

となって CSVファイルに保存ができる

次に
CSV → SQLite登録スクリプト

vim save_to_sqlite.py  

内容は

import sqlite3
import pandas as pd
import os

csv_dir = "csv_data"
db_path = "commodity_data.db"

conn = sqlite3.connect(db_path)

# 読み込むCSVファイル
datasets = {
    "gold_price": "gold.csv",
    "cpi": "cpi.csv",
    "oil": "oil.csv",
    "usd_jpy": "usd_jpy.csv"
}

for table, file in datasets.items():
    df = pd.read_csv(os.path.join(csv_dir, file), parse_dates=["Date"])
    df.to_sql(table, conn, if_exists="replace", index=False)
    print(f"✅ {table} を保存しました。")

conn.close()
print("✅ すべてのデータを SQLite に保存しました。")

これを実行すると

✅ gold_price を保存しました。
✅ cpi を保存しました。
✅ oil を保存しました。
✅ usd_jpy を保存しました。
✅ すべてのデータを SQLite に保存しました。

次に
SQLiteからデータ読み込んで相関分析する

🔹 対象テーブル
* gold_price
* cpi
* oil
* usd_jpy

SQLite → Pandas データフレーム → 日付で結合
相関分析・ヒートマップの作成

ステップ 説明 優先度
SQLite→Pandas→結合 分析のベースとなる時系列データを生成 ✅必須
相関係数・ヒートマップ 経済指標と金価格の関係性を把握 ✅必須
Prophet予測 簡単・解釈しやすい時系列予測 👍推奨
LSTM予測 複雑だが精度の高い多変量時系列予測 必要に応じて

とりあえず価格予測は置いておいて
相関関係までをやる

SQLite → pandas データ読み込み & 日付で整形

import sqlite3
import pandas as pd

# SQLiteファイルのパス
db_path = "commodity_data.db"

# SQLiteに接続
conn = sqlite3.connect(db_path)

# 各テーブルを読み込み(Dateをdatetime型に)
gold = pd.read_sql("SELECT * FROM gold_price", conn, parse_dates=["Date"])
cpi = pd.read_sql("SELECT * FROM cpi", conn, parse_dates=["Date"])
oil = pd.read_sql("SELECT * FROM oil", conn, parse_dates=["Date"])
usd_jpy = pd.read_sql("SELECT * FROM usd_jpy", conn, parse_dates=["Date"])

conn.close()

日付で結合(内部結合)
# 日付で結合(内部結合:全ての指標が揃っている日付のみ残す)
df = gold.merge(cpi, on="Date") \
         .merge(oil, on="Date") \
         .merge(usd_jpy, on="Date")

# 欠損値を除外
df.dropna(inplace=True)

# 日付順に並べ替え
df.sort_values("Date", inplace=True)

# 結果確認
print(df.head())
print(df.tail())

これを保存
# 必要に応じてCSV保存して後工程へ渡せるように

df.to_csv("merged_commodity_data.csv", index=False)
print("✅ データを merged_commodity_data.csv に保存しました。")

データの中身確認(列構成)

print("📊 列名一覧:", df.columns.tolist())

を行うようにする

結合方式の違い(用途別)
結合方式 使いどころ
how=”inner” 全ての指標が存在する日だけ使いたい(分析用)✅推奨
how=”outer” 欠損があっても全部のデータを残したい場合
how=”left” 特定の指標(例:金価格)を中心に他を揃えたい時

これらを行うスクリプト

sqlite_to_pandas_and_merge.py

を作成

これは
SQLite → pandas → 結合&保存スクリプト

内容は

import sqlite3
import pandas as pd

# SQLiteファイルのパス
db_path = "commodity_data.db"

# SQLiteに接続
conn = sqlite3.connect(db_path)

# 各テーブル読み込み(Date列をdatetime型として読み込む)
gold = pd.read_sql("SELECT * FROM gold_price", conn, parse_dates=["Date"])
cpi = pd.read_sql("SELECT * FROM cpi", conn, parse_dates=["Date"])
oil = pd.read_sql("SELECT * FROM oil", conn, parse_dates=["Date"])
usd_jpy = pd.read_sql("SELECT * FROM usd_jpy", conn, parse_dates=["Date"])

conn.close()

# 日付で内部結合(共通の日付のみ残す)
df = gold.merge(cpi, on="Date") \
         .merge(oil, on="Date") \
         .merge(usd_jpy, on="Date")

# 欠損値を除去
df.dropna(inplace=True)

# 日付順に並べ替え
df.sort_values("Date", inplace=True)

# 結果の確認
print("✅ 結合完了。データの先頭:")
print(df.head())

print("\n📊 列構成:")
print(df.columns.tolist())

# CSVとして保存
df.to_csv("merged_commodity_data.csv", index=False)
print("\n✅ merged_commodity_data.csv に保存完了")


実行結果

python sqlite_to_pandas_and_merge.py 
✅ 結合完了。データの先頭:
        Date          gold_price    cpi    oil             usd_jpy
0 2000-09-01               277.0  173.6  33.42  105.94999694824219
1 2000-11-01   263.8999938964844  174.2  33.14              108.25
2 2000-12-01  268.70001220703125  174.6  32.06  111.19000244140625
3 2001-02-01               268.5  176.0  29.88  115.41999816894531
4 2001-03-01  265.20001220703125  176.1  27.78               117.5

📊 列構成:
['Date', 'gold_price', 'cpi', 'oil', 'usd_jpy']

✅ merged_commodity_data.csv に保存完了

これで
* 📊 相関分析(ヒートマップ)
* 🔮 Prophetで金価格予測(CPI・ドル円あり)
* 🤖 LSTM構築(多変量予測)

ができるらしいのでまずは目的の相関分析を試す

相関分析+ヒートマップ表示のスクリプトを作成

 vim correlation_heatmap.py

内容は

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# CSVファイル読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])

# 相関対象の列だけ抽出
corr_df = df[["gold_price", "cpi", "oil", "usd_jpy"]]

# 相関係数を計算
corr_matrix = corr_df.corr(method="pearson")  # 他に "spearman", "kendall" も可能

# 相関係数の表示
print("📊 相関係数:")
print(corr_matrix)

# ヒートマップ描画
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", fmt=".2f", square=True)
plt.title("相関ヒートマップ(金価格・CPI・WTI・ドル円)")
plt.tight_layout()
plt.show()

実行結果は

📊 相関係数:
            gold_price       cpi       oil   usd_jpy
gold_price    1.000000  0.919815  0.541180  0.156031
cpi           0.919815  1.000000  0.445084  0.431734
oil           0.541180  0.445084  1.000000 -0.224121
usd_jpy       0.156031  0.431734 -0.224121  1.000000
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 30456 (\N{CJK UNIFIED IDEOGRAPH-76F8}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 38306 (\N{CJK UNIFIED IDEOGRAPH-95A2}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12498 (\N{KATAKANA LETTER HI}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12540 (\N{KATAKANA-HIRAGANA PROLONGED SOUND MARK}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12488 (\N{KATAKANA LETTER TO}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12510 (\N{KATAKANA LETTER MA}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12483 (\N{KATAKANA LETTER SMALL TU}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12503 (\N{KATAKANA LETTER PU}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 65288 (\N{FULLWIDTH LEFT PARENTHESIS}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 37329 (\N{CJK UNIFIED IDEOGRAPH-91D1}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 20385 (\N{CJK UNIFIED IDEOGRAPH-4FA1}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 26684 (\N{CJK UNIFIED IDEOGRAPH-683C}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12539 (\N{KATAKANA MIDDLE DOT}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12489 (\N{KATAKANA LETTER DO}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 12523 (\N{KATAKANA LETTER RU}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 20870 (\N{CJK UNIFIED IDEOGRAPH-5186}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:22: UserWarning: Glyph 65289 (\N{FULLWIDTH RIGHT PARENTHESIS}) missing from font(s) DejaVu Sans.
  plt.tight_layout()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 30456 (\N{CJK UNIFIED IDEOGRAPH-76F8}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 38306 (\N{CJK UNIFIED IDEOGRAPH-95A2}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12498 (\N{KATAKANA LETTER HI}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12540 (\N{KATAKANA-HIRAGANA PROLONGED SOUND MARK}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12488 (\N{KATAKANA LETTER TO}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12510 (\N{KATAKANA LETTER MA}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12483 (\N{KATAKANA LETTER SMALL TU}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12503 (\N{KATAKANA LETTER PU}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 65288 (\N{FULLWIDTH LEFT PARENTHESIS}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 37329 (\N{CJK UNIFIED IDEOGRAPH-91D1}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 20385 (\N{CJK UNIFIED IDEOGRAPH-4FA1}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 26684 (\N{CJK UNIFIED IDEOGRAPH-683C}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12539 (\N{KATAKANA MIDDLE DOT}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12489 (\N{KATAKANA LETTER DO}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 12523 (\N{KATAKANA LETTER RU}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 20870 (\N{CJK UNIFIED IDEOGRAPH-5186}) missing from font(s) DejaVu Sans.
  plt.show()
/Users/snowpool/aw10s/auto_deel/correlation_heatmap.py:23: UserWarning: Glyph 65289 (\N{FULLWIDTH RIGHT PARENTHESIS}) missing from font(s) DejaVu Sans.
  plt.show()

となるが表示されるグラフは文字化けをしている

表示されている 文字化けの原因 は、matplotlib(および seaborn)が 日本語フォント(特にCJK漢字やカタカナ)をサポートしていないフォントを使っているため

macOSの場合、ヒラギノ角ゴ ProN や AppleGothic などを使うと安定するらしい

import matplotlib.font_manager as fm
import platform

# 日本語フォント設定(macOS想定)
if platform.system() == 'Darwin':  # macOS
    plt.rcParams['font.family'] = 'Hiragino Sans'
elif platform.system() == 'Windows':
    plt.rcParams['font.family'] = 'Meiryo'
else:  # Linux(必要ならIPAフォントなど)
    plt.rcParams['font.family'] = 'IPAexGothic'


Import文の後に追加すると解決した

次に
金価格・CPI・原油価格・ドル円 を、日付をX軸にして色分けした折れ線グラフで可視化
economic_indicators_time_series.py:
経済指標の時系列データであることを折れ線グラフで表示するスクリプトの作成

 vim economic_indicators_time_series.py

内容は

import pandas as pd
import matplotlib.pyplot as plt
import platform

# ✅ 日本語フォント設定(macOSなどで文字化け防止)
if platform.system() == 'Darwin':
    plt.rcParams['font.family'] = 'Hiragino Sans'
elif platform.system() == 'Windows':
    plt.rcParams['font.family'] = 'Meiryo'
else:
    plt.rcParams['font.family'] = 'IPAexGothic'

# 📥 CSVファイル読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

# 📊 折れ線グラフを描画
plt.figure(figsize=(14, 6))

plt.plot(df["Date"], df["gold_price"], label="金価格", linewidth=2)
plt.plot(df["Date"], df["cpi"], label="CPI", linewidth=2)
plt.plot(df["Date"], df["oil"], label="WTI原油", linewidth=2)
plt.plot(df["Date"], df["usd_jpy"], label="ドル円", linewidth=2)

plt.title("金価格・CPI・WTI原油・ドル円の推移")
plt.xlabel("日付")
plt.ylabel("値")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

これで表示できるけどわかりにくい

株のチャートみたいに 金価格の推移とWTI価格の推移 ドル円レートの推移 CPIの推移が一度にわかるチャートを表示したい

pip install plotly

でインストール

import pandas as pd
from plotly.subplots import make_subplots
import plotly.graph_objects as go

# データ読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

# サブプロット作成(4行1列)
fig = make_subplots(
    rows=4, cols=1, shared_xaxes=True,
    subplot_titles=("① 金価格", "② WTI原油価格", "③ ドル円レート", "④ CPI(消費者物価指数)"),
    vertical_spacing=0.02
)

# 金価格
fig.add_trace(go.Scatter(x=df["Date"], y=df["gold_price"], name="金価格", line=dict(color='gold')), row=1, col=1)
# 原油価格
fig.add_trace(go.Scatter(x=df["Date"], y=df["oil"], name="WTI原油", line=dict(color='green')), row=2, col=1)
# ドル円
fig.add_trace(go.Scatter(x=df["Date"], y=df["usd_jpy"], name="ドル円", line=dict(color='red')), row=3, col=1)
# CPI
fig.add_trace(go.Scatter(x=df["Date"], y=df["cpi"], name="CPI", line=dict(color='blue')), row=4, col=1)

# レイアウト
fig.update_layout(
    height=800,
    title="金・原油・ドル円・CPIの推移(マルチチャート)",
    showlegend=False,
    xaxis4=dict(rangeslider=dict(visible=True)),  # ✅ スクロール可能
    template="plotly_white"
)

fig.show()


表示はできたけど、いまいちわかりにくい

マウスオーバーした時に一番上にマウスオーバーした日時の全ての値を表示するようにしたい

hovermode="x unified",  # ✅ ここでマウスオーバー時に全値を表示

を追記

しかしこれだと個々の値にしかならない

なので重ねて表示する

import pandas as pd
import plotly.graph_objects as go

# データ読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

# 折れ線グラフを1つの図に重ねて表示
fig = go.Figure()

fig.add_trace(go.Scatter(x=df["Date"], y=df["gold_price"], name="金価格", line=dict(color='gold')))
fig.add_trace(go.Scatter(x=df["Date"], y=df["oil"], name="WTI原油", line=dict(color='green')))
fig.add_trace(go.Scatter(x=df["Date"], y=df["usd_jpy"], name="ドル円", line=dict(color='red')))
fig.add_trace(go.Scatter(x=df["Date"], y=df["cpi"], name="CPI", line=dict(color='blue')))

# レイアウト設定
fig.update_layout(
    title="金価格・WTI原油・ドル円・CPIの重ね表示チャート",
    xaxis_title="日付",
    yaxis_title="値",
    hovermode="x unified",  # ✅ 一括マウスオーバー
    template="plotly_white",
    height=600,
    xaxis=dict(rangeslider=dict(visible=True))  # ✅ スクロール可能
)

fig.show()

これだと全て数値は出るけどグラフが読みにくい

すべて同じグラフに描いても、スケールが違っていて視認しづらい
金価格:2000〜3000(単位:ドル/トロイオンス)
CPI:100〜300
ドル円:100〜150
原油:30〜80

金価格の値が圧倒的に大きく、他の指標が 下に張り付いて見えにくい

解決策:二次Y軸(dual y-axis)または正規化

2軸グラフでスケールの異なる指標を分離表示

Plotlyで金価格とその他を別Y軸で描画する

import pandas as pd
import plotly.graph_objects as go

df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

fig = go.Figure()

# 金価格(左Y軸)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["gold_price"],
    name="金価格", line=dict(color='gold'),
    yaxis="y1"
))

# その他(右Y軸)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["cpi"],
    name="CPI", line=dict(color='blue'),
    yaxis="y2"
))

fig.add_trace(go.Scatter(
    x=df["Date"], y=df["usd_jpy"],
    name="ドル円", line=dict(color='red'),
    yaxis="y2"
))

fig.add_trace(go.Scatter(
    x=df["Date"], y=df["oil"],
    name="WTI原油", line=dict(color='green'),
    yaxis="y2"
))

# レイアウト設定
fig.update_layout(
    title="金価格(左軸) vs CPI・WTI・ドル円(右軸)",
    xaxis=dict(title="日付", rangeslider=dict(visible=True)),
    yaxis=dict(title="金価格", side="left"),
    yaxis2=dict(title="他指標", overlaying="y", side="right"),
    hovermode="x unified",
    height=600,
    template="plotly_white"
)

fig.show()

これで
📈 金価格は左Y軸
📉 CPI・ドル円・WTIは右Y軸
🖱 マウスオーバーで全ての値を同時に表示

ただしこれだとCPIが飛び出ているのでわかりにくい

CPIはグラフに線としては描かず、マウスオーバー時の数値表示だけにしたい

指標 グラフ表示 マウスオーバー表示
金価格 ✅ 線あり ✅ 値を表示
WTI原油 ✅ 線あり ✅ 値を表示
ドル円 ✅ 線あり ✅ 値を表示
CPI ❌ 線なし ✅ 値のみ表示

CPIは透明な線として追加(表示されないがホバー時は値が出る)
Plotlyでは line=dict(width=0) や opacity=0 を使うことで実現

コードを

import pandas as pd
import plotly.graph_objects as go

# データ読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

fig = go.Figure()

# 金価格(左軸)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["gold_price"],
    name="金価格", line=dict(color='gold'),
    yaxis="y1"
))

# WTI原油(右軸)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["oil"],
    name="WTI原油", line=dict(color='green'),
    yaxis="y2"
))

# ドル円(右軸)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["usd_jpy"],
    name="ドル円", line=dict(color='red'),
    yaxis="y2"
))

# ✅ CPIを透明線で追加(線は非表示、値だけ表示)
fig.add_trace(go.Scatter(
    x=df["Date"], y=df["cpi"],
    name="CPI(表示なし)",
    line=dict(color='rgba(0,0,0,0)'),  # 完全に透明
    yaxis="y2",
    hoverinfo="x+y+name",  # ホバーは有効
    showlegend=False       # 凡例も非表示
))

# レイアウト設定
fig.update_layout(
    title="金価格・WTI・ドル円(CPIは非表示・値のみ)",
    xaxis=dict(title="日付", rangeslider=dict(visible=True)),
    yaxis=dict(title="金価格", side="left"),
    yaxis2=dict(title="WTI・ドル円", overlaying="y", side="right"),
    hovermode="x unified",
    height=600,
    template="plotly_white"
)

fig.show()

として保存

📈 金・WTI・ドル円は見やすく線で表示
🖱 CPIは線は出ないが、マウスオーバーで数値が見える

だいぶわかりやすくなった

次は
正規化して同軸で比較(相対変化に注目)を試す

pip install plotly scikit-learn

でインストール

normalized_economic_indicators_comparison.py

がファイル名

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
import plotly.graph_objects as go

# データ読み込み
df = pd.read_csv("merged_commodity_data.csv", parse_dates=["Date"])
df.sort_values("Date", inplace=True)

# 正規化する対象列
columns_to_normalize = ["gold_price", "oil", "usd_jpy", "cpi"]

# 正規化処理
scaler = MinMaxScaler()
df_normalized = df.copy()
df_normalized[columns_to_normalize] = scaler.fit_transform(df[columns_to_normalize])

# グラフ作成(正規化された値で重ね描き)
fig = go.Figure()

fig.add_trace(go.Scatter(x=df["Date"], y=df_normalized["gold_price"], name="金価格", line=dict(color='gold')))
fig.add_trace(go.Scatter(x=df["Date"], y=df_normalized["oil"], name="WTI原油", line=dict(color='green')))
fig.add_trace(go.Scatter(x=df["Date"], y=df_normalized["usd_jpy"], name="ドル円", line=dict(color='red')))
fig.add_trace(go.Scatter(x=df["Date"], y=df_normalized["cpi"], name="CPI", line=dict(color='blue')))

fig.update_layout(
    title="正規化された金価格・WTI・ドル円・CPIの相対変動比較",
    xaxis_title="日付",
    yaxis_title="正規化値(0〜1)",
    hovermode="x unified",
    xaxis=dict(rangeslider=dict(visible=True)),
    template="plotly_white",
    height=600
)

fig.show()

として実行

これでだいぶ見やすくなった

外付けSSDへのバックアップ

外付けSSDへのバックアップ

mv: fastcopy: read() failed: /Users/snowpool/Desktop/スクリーンショット 2025-05-11 6.26.05.png: Need authenticator

となるため
ファイルを調べたら iCloud に保存されている
これが原因だった

最初に外付けSSDが認識しなかったため

df -h /Volumes/KINGSTON 

としたが認識していない

このため

diskutil list

で調べた

 diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:             Apple_APFS_ISC Container disk1         524.3 MB   disk0s1
   2:                 Apple_APFS Container disk3         245.1 GB   disk0s2
   3:        Apple_APFS_Recovery Container disk2         5.4 GB     disk0s3

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +245.1 GB   disk3
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            16.1 GB    disk3s1
   2:              APFS Snapshot com.apple.os.update-... 16.1 GB    disk3s1s1
   3:                APFS Volume Preboot                 13.9 GB    disk3s2
   4:                APFS Volume Recovery                2.1 GB     disk3s3
   5:                APFS Volume Data                    208.1 GB   disk3s5
   6:                APFS Volume VM                      2.1 GB     disk3s6

/dev/disk4 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +3.4 GB     disk4
   1:                        EFI NO NAME                 209.7 MB   disk4s1
   2:                  Apple_HFS QGIS-LTR.app            3.1 GB     disk4s2

/dev/disk5 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *1.0 TB     disk5
   1:               Windows_NTFS KINGSTON                1.0 TB     disk5s1

どうやらマウントできているらしい

/dev/disk5 (external, physical):
   #:                       TYPE NAME     SIZE       IDENTIFIER
   0:     FDisk_partition_scheme         *1.0 TB     disk5
   1:               Windows_NTFS KINGSTON 1.0 TB     disk5s1

がその部分

このあとは認識したので

mkdir /Volumes/KINGSTON/M1Mac_bak/download_bak
mv ~/Desktop/* /Volumes/KINGSTON/M1Mac_bak/desctok_bak

でバックアップフォルダを作成

あとは

 mv ~/Downloads/* /Volumes/KINGSTON/M1Mac_bak/download_bak

でバックアップしておく

yfinanceで金価格の取得

yfinanceで金価格の取得

mkdir yfianace 
vim gold.py

内容を

import yfinance as yf
import datetime

# 金先物のティッカー
ticker = "GC=F"

# 非常に古い日付から現在まで取得
start_date = "1900-01-01"  # yfinanceが対応している限界に挑戦
end_date = datetime.datetime.today().strftime('%Y-%m-%d')

# データの取得(日足)
gold_data = yf.download(ticker, start=start_date, end=end_date, interval="1d")

# 結果の表示
print(gold_data.head())  # 最初の5件
print(gold_data.tail())  # 最新の5件
print(f"\n最古のデータ: {gold_data.index[0]}")
print(f"最新のデータ: {gold_data.index[-1]}")

として保存

これを実行

/Users/snowpool/aw10s/yfinance/gold.py:12: FutureWarning: YF.download() has changed argument auto_adjust default to True
  gold_data = yf.download(ticker, start=start_date, end=end_date, interval="1d")
[*********************100%***********************]  1 of 1 completed
Price            Close        High         Low        Open Volume
Ticker            GC=F        GC=F        GC=F        GC=F   GC=F
Date                                                             
2000-08-30  273.899994  273.899994  273.899994  273.899994      0
2000-08-31  278.299988  278.299988  274.799988  274.799988      0
2000-09-01  277.000000  277.000000  277.000000  277.000000      0
2000-09-05  275.799988  275.799988  275.799988  275.799988      2
2000-09-06  274.200012  274.200012  274.200012  274.200012      0
Price             Close         High          Low         Open  Volume
Ticker             GC=F         GC=F         GC=F         GC=F    GC=F
Date                                                                  
2025-07-21  3401.899902  3411.699951  3350.300049  3350.300049      53
2025-07-22  3439.199951  3441.000000  3395.600098  3411.000000      39
2025-07-23  3394.100098  3433.899902  3388.100098  3430.300049      63
2025-07-24  3371.000000  3371.000000  3367.000000  3367.000000      63
2025-07-25  3332.300049  3376.600098  3328.899902  3372.100098  156194

最古のデータ: 2000-08-30 00:00:00
最新のデータ: 2025-07-25 00:00:00

これを他で使えるようにcsvに保存する

import yfinance as yf
import datetime

# 金先物のティッカー
ticker = "GC=F"

# 非常に古い日付から現在まで取得
start_date = "1900-01-01"
end_date = datetime.datetime.today().strftime('%Y-%m-%d')

# データの取得(日足)
gold_data = yf.download(ticker, start=start_date, end=end_date, interval="1d")

# 結果の表示(最初と最後の数件)
print("=== 最初の5行 ===")
print(gold_data.head())
print("\n=== 最後の5行 ===")
print(gold_data.tail())

# 最古と最新のデータ日付
print(f"\n最古のデータ: {gold_data.index[0].date()}")
print(f"最新のデータ: {gold_data.index[-1].date()}")

# CSVに保存
csv_file = "gold_price_gc_f.csv"
gold_data.to_csv(csv_file)
print(f"\n✅ CSVファイルとして保存完了: {csv_file}")

実行すると

 python gold_csv.py 
/Users/snowpool/aw10s/yfinance/gold_csv.py:12: FutureWarning: YF.download() has changed argument auto_adjust default to True
  gold_data = yf.download(ticker, start=start_date, end=end_date, interval="1d")
[*********************100%***********************]  1 of 1 completed
=== 最初の5行 ===
Price            Close        High         Low        Open Volume
Ticker            GC=F        GC=F        GC=F        GC=F   GC=F
Date                                                             
2000-08-30  273.899994  273.899994  273.899994  273.899994      0
2000-08-31  278.299988  278.299988  274.799988  274.799988      0
2000-09-01  277.000000  277.000000  277.000000  277.000000      0
2000-09-05  275.799988  275.799988  275.799988  275.799988      2
2000-09-06  274.200012  274.200012  274.200012  274.200012      0

=== 最後の5行 ===
Price             Close         High          Low         Open  Volume
Ticker             GC=F         GC=F         GC=F         GC=F    GC=F
Date                                                                  
2025-07-21  3401.899902  3411.699951  3350.300049  3350.300049      53
2025-07-22  3439.199951  3441.000000  3395.600098  3411.000000      39
2025-07-23  3394.100098  3433.899902  3388.100098  3430.300049      63
2025-07-24  3371.000000  3371.000000  3367.000000  3367.000000      63
2025-07-25  3328.899902  3376.600098  3328.100098  3372.100098  157705

最古のデータ: 2000-08-30
最新のデータ: 2025-07-25

✅ CSVファイルとして保存完了: gold_price_gc_f.csv

となってcsvが保存される

次にSqlite へ登録する

しかし

import sqlite3
import pandas as pd

# CSV読み込み
df = pd.read_csv("gold_price_gc_f.csv", parse_dates=["Date"])

# SQLiteに保存
conn = sqlite3.connect("commodity_data.db")
df.to_sql("gold_price_daily", conn, if_exists="replace", index=False)
conn.close()
print("✅ SQLiteに保存完了: gold_price_daily テーブル")

だとエラーになる


Traceback (most recent call last):
  File "/Users/snowpool/aw10s/yfinance/add_sqldb.py", line 5, in <module>
    df = pd.read_csv("gold_price_gc_f.csv", parse_dates=["Date"])
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1026, in read_csv
    return _read(filepath_or_buffer, kwds)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 620, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1620, in __init__
    self._engine = self._make_engine(f, self.engine)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/readers.py", line 1898, in _make_engine
    return mapping[engine](f, **self.options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/c_parser_wrapper.py", line 161, in __init__
    self._validate_parse_dates_presence(self.names)  # type: ignore[has-type]
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/io/parsers/base_parser.py", line 243, in _validate_parse_dates_presence
    raise ValueError(
ValueError: Missing column provided to 'parse_dates': 'Date'

これは
行目にティッカー情報の行が含まれており、本来のヘッダーが1行目 になっていないため、pandas.read_csv()がうまく処理できていないのが原因

このため
2行目スキップして1行目をヘッダーとして読み込むように変更

import sqlite3
import pandas as pd

# 2行目(ティッカー行)をスキップし、1行目をヘッダーとして使用
df = pd.read_csv("gold_price_gc_f.csv", skiprows=[1], parse_dates=["Price"])
df.rename(columns={"Price": "Date"}, inplace=True)  # Date列として扱う

# SQLiteに保存
conn = sqlite3.connect("commodity_data.db")
df.to_sql("gold_price_daily", conn, if_exists="replace", index=False)
conn.close()

print("✅ SQLiteに保存完了: gold_price_daily テーブル")

これを実行すると

 python add_sqldb.py
/Users/snowpool/aw10s/yfinance/add_sqldb.py:5: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  df = pd.read_csv("gold_price_gc_f.csv", skiprows=[1], parse_dates=["Price"])
✅ SQLiteに保存完了: gold_price_daily テーブル

となる

これにより

* Price 列 → Date に名前変更(DateTime型として扱える)
* SQLite テーブル名:gold_price_daily
* 後続のクエリや可視化処理が簡単になります
となる

保存後に確認したいのなら

# 保存したDBの中身を確認(任意)
conn = sqlite3.connect("commodity_data.db")
df_check = pd.read_sql("SELECT * FROM gold_price_daily LIMIT 5", conn)
print(df_check)
conn.close()

を追加すると良い

WTI原油、ドル円の過去レートの取得

WTI原油、ドル円の過去レートの取得

yfinance 経由で取得できる WTI原油(CL=F)やドル円(JPY=X) のデータは、Yahoo Finance に基づき、以下のようにかなり長期間に渡って利用可能

✅ 取得可能な過去データの期間(概算)
資産 シンボル 開始可能な年 備考
WTI原油先物 CL=F 1983年頃〜現在 日足・週足・月足データあり
ドル円(USD/JPY) JPY=X 1971年頃〜現在 固定相場制移行後のデータあり

GPTで

 pip install yfinance pandas matplotlib sqlite3

で必要ならライブラリインストール
とあったが

ERROR: Could not find a version that satisfies the requirement sqlite3 (from versions: none)
ERROR: No matching distribution found for sqlite3

となる

sqlite3 は Pythonに標準で内蔵されているライブラリ なので、pip install sqlite3 は不要

Python で最古の日付を確認する

 vim earliest_rate.py

内容を

import yfinance as yf

# 1銘柄ずつ最大データ期間を確認
wti = yf.download("CL=F", period="max")
usdjpy = yf.download("JPY=X", period="max")

print("WTI最古の日付:", wti.index.min())
print("ドル円最古の日付:", usdjpy.index.min())

しかし
これだと

[*********************100%***********************]  1 of 1 completed

1 Failed download:
['CL=F']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
[*********************100%***********************]  1 of 1 completed

1 Failed download:
['JPY=X']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
WTI最古の日付: NaT
ドル円最古の日付: NaT

となって
ahoo Finance の yfinance ライブラリが アクセス制限(レートリミット) に引っかかる

なので期間を限定する

import yfinance as yf

def get_earliest_date(symbol):
    try:
        df = yf.download(symbol, start="1900-01-01", end="1975-01-01", interval="1mo", progress=False)
        if df.empty:
            df = yf.download(symbol, start="1970-01-01", end="1990-01-01", interval="1mo", progress=False)
        return df.index.min()
    except Exception as e:
        print(f"{symbol} の取得でエラー: {e}")
        return None

# 実行
wti_start = get_earliest_date("CL=F")
jpy_start = get_earliest_date("JPY=X")

print("WTI原油の最古日:", wti_start)
print("ドル円の最古日:", jpy_start)

としたが

1 Failed download:
['CL=F']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')

1 Failed download:
['CL=F']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')

1 Failed download:
['JPY=X']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')

1 Failed download:
['JPY=X']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
WTI原油の最古日: NaT
ドル円の最古日: NaT

となる

これだと変わらないので
Csvをダウンロードしようとしたが
現在CSVダウンロードはできない

WTI原油先物(CL=F)」ではなく、W&T Offshore, Inc.(ティッカー: WTI) という個別株の履歴ページがるので注意

項目 正しいWTI原油先物 間違いやすいW&T Offshore株
正式名称 WTI Crude Oil Futures W&T Offshore, Inc.
シンボル CL=F WTI
内容 原油先物価格(NYMEX) エネルギー会社の株価
利用目的 原油価格の分析 企業株の投資分析

Yahoo Finance の WTI原油先物(CL=F) に関する正しいデータであり、取得可能な最古の日付は 2000年8月23日

試しに
yfinance api で一番古いデータから3カ月分だけ取得する

import yfinance as yf
import pandas as pd
import sqlite3

# === データ取得範囲 ===
start_date = pd.Timestamp("2000-08-23")
end_date = start_date + pd.Timedelta(days=90)

# === データ取得 ===
df = yf.download("CL=F", start=start_date, end=end_date, progress=False)

# 日付インデックスをリセットして通常の列に
df.reset_index(inplace=True)

# === SQLiteに保存 ===
db_path = "commodities.db"
table_name = "wti_first_3months"

# 不要なNaN行削除
df = df.dropna(subset=["Date"])

with sqlite3.connect(db_path) as conn:
    df.to_sql(table_name, conn, if_exists="replace", index=False)

print(f"{len(df)} 件のWTI原油データを {db_path} の {table_name} に保存しました。")

を実行すると

1 Failed download:
['CL=F']: YFRateLimitError('Too Many Requests. Rate limited. Try after a while.')
Traceback (most recent call last):
  File "/Users/snowpool/aw10s/wti/earliest_rate.py", line 20, in <module>
    df = df.dropna(subset=["Date"])
         ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages/pandas/core/frame.py", line 6670, in dropna
    raise KeyError(np.array(subset)[check].tolist())
KeyError: ['Date']

これを元に修正する

import yfinance as yf
import pandas as pd
import sqlite3

# === データ取得範囲 ===
start_date = pd.Timestamp("2000-08-23")
end_date = start_date + pd.Timedelta(days=90)

# === データ取得 ===
try:
    df = yf.download("CL=F", start=start_date, end=end_date, progress=False)

    if df.empty:
        print("⚠ データ取得に失敗しました(アクセス制限などの可能性あり)")
    else:
        df.reset_index(inplace=True)

        # 安全に 'Date' カラムの存在確認
        if "Date" in df.columns:
            df = df.dropna(subset=["Date"])
        else:
            print("⚠ 'Date' カラムが見つかりません。保存せず終了します。")
            exit()

        # === SQLiteに保存 ===
        db_path = "commodities.db"
        table_name = "wti_first_3months"

        with sqlite3.connect(db_path) as conn:
            df.to_sql(table_name, conn, if_exists="replace", index=False)

        print(f"✅ {len(df)} 件のWTI原油データを {db_path} の {table_name} に保存しました。")

except Exception as e:
    print(f"❌ 予期せぬエラー: {e}")

データが古すぎて取れない可能性がある

調べた結果、

https://web-dev.hatenablog.com/entry/python/yfinance/error/rate-limit
yfinance エラー対応方法「Too Many Requests. Rate limited.」
にあるように

pip install --upgrade yfinance

を実行しバージョンをアップすると解決した

実行時のログは

Installing collected packages: curl_cffi, yfinance
  Attempting uninstall: yfinance
    Found existing installation: yfinance 0.2.52
    Uninstalling yfinance-0.2.52:
      Successfully uninstalled yfinance-0.2.52
Successfully installed curl_cffi-0.12.0 yfinance-0.2.65

どうやら 0.2.52だとエラーになるが
0.2.65だと解決しているらしい

試しに

import yfinance as yf

# リアルタイムのWTI価格を取得(1分間隔の最新データ)
wti = yf.Ticker("CL=F")
data = wti.history(period="1d", interval="1m").tail(1)  # 最新の1分データ
price = data['Close'].iloc[-1]  # 最新の終値
print(f"Current WTI Price: ${price}")

を実行

python wti.py  
Current WTI Price: $65.51000213623047

となって最新のWTI価格を取得できる

経済指標カレンダーの作成とsqlite へ取り込み

経済指標カレンダーの作成とsqlite へ取り込み

メルマガから

■■■7月21日(月)■■■
・日本は祝日で休場
・日本の参議院選挙明け
・週明け
・米国の主要企業の決算発表(本格化)
07:45 NZ)第2四半期消費者物価指数
23:00 ★米)景気先行指数

■■■7月22日(火)■■■
・米国の主要企業の決算発表(本格化)
07:45 NZ)貿易収支
10:30 豪)RBA議事録公表(7月8日開催分)
18:15 ★米)ベイリーBOE総裁の発言   
21:30 ★米)パウエルFRB議長の発言(ブラックアウト期間中で金融政策に関する発言はない予定)
23:00 ★米)リッチモンド連銀製造業指数
26:00 ★米)ボウマンFRB副議長の発言(ブラックアウト期間中で金融政策に関する発言はない予定)
-     ★米)注目度の高い経済指標の発表はない

■■■7月23日(水)■■■
・米国の主要企業の決算発表(本格化)→テスラ、アルファベット、その他
10:30 日)内田日銀副総裁の発言(あいさつ)
未定 日)40年利付国債入札
未定 日)内田日銀副総裁の発言(記者会見)
20:00 ★米)MBA住宅ローン申請指数
23:00 ★米)中古住宅販売件数
23:30 ★米)週間原油在庫
26:00 ★米)20年債入札
米株引後 ★米)テスラ決算
米株引後 ★米)アルファベット決算

■■■7月24日(木)■■■
・米国の主要企業の決算発表(本格化)     
12:05 豪)ブロックRBA総裁の発言   
16:15 仏)製造業PMI【速報値】
16:15 仏)非製造業PMI【速報値】
16:30 独)製造業PMI【速報値】
16:30 独)非製造業PMI【速報値】
17:00 欧)製造業PMI【速報値】
17:00 欧)非製造業PMI【速報値】
17:30 英)製造業PMI【速報値】
17:30 英)非製造業PMI【速報値】
20:00 ト)TCMB政策金利&声明発表
21:15 欧)ECB政策金利&声明発表
21:30 加)小売売上高&【除自動車】
21:45 欧)ラガルドECB総裁の記者会見
21:30 ★米)新規失業保険申請件数     
21:30 ★米)シカゴ連銀全米活動指数
22:45 ★米)製造業PMI【速報値】
22:45 ★米)非製造業PMI【速報値】
23:00 ★米)新築住宅販売件数
23:30 ★米)週間天然ガス貯蔵量
24:00 ★米)カンザスシティ連銀製造業活動指数

■■■7月25日(金)■■■
・週末
・五十日(25日)
・米国の主要企業の決算発表(本格化)
08:30 日)東京都区部消費者物価指数&【除生鮮】
15:00 英)小売売上高&【除自動車】
17:00 独)IFO景況指数
21:30 ★米)耐久財受注&【除輸送用機器】

の部分をコピペして
chatGPTで

これらをcsvファイルにして

とするとcsvが作成できる

これを既に作成ずみのDBへ追加する

✅ ポイント
引数 内容
if_exists=’append’ 既存テーブルがあれば追記(削除せず)
index=False DataFrameの行番号をDBに書き込まないようにする

とすればOKらしい

✅ ステップ概要
1. SQLiteテーブルに一意制約(UNIQUE)を追加
2. to_sql() ではなく 手動でUPSERT処理 を行う(INSERT OR IGNORE)

SQLiteに CSV を追加する際に重複をチェックし、すでに登録済みのレコードはスキップ(UPSERT) する処理を組み込む

✅ 特徴
処理内容 説明
CREATE TABLE IF NOT EXISTS 初回だけテーブルを作成
UNIQUE(date, time, country, event) 主な識別要素による重複防止
ON CONFLICT IGNORE 重複レコードがある場合は無視してスキップ
INSERT OR IGNORE 既存レコードと重複するものは挿入されない

これらを元に

vim add_calendarDB.py

内容を

import pandas as pd
import sqlite3

# 新しいCSVを読み込み
csv_path = "economic_events_20250721_25.csv"
df_new = pd.read_csv(csv_path)

# SQLiteに接続
conn = sqlite3.connect("economic_events.db")
cursor = conn.cursor()

# ① テーブルがまだ存在しない場合は一意制約付きで作成
cursor.execute("""
CREATE TABLE IF NOT EXISTS events (
    date TEXT,
    time TEXT,
    country TEXT,
    event TEXT,
    importance TEXT,
    type TEXT,
    UNIQUE(date, time, country, event) ON CONFLICT IGNORE
)
""")

# ② 各レコードを1件ずつINSERT OR IGNOREで追加
for _, row in df_new.iterrows():
    cursor.execute("""
        INSERT OR IGNORE INTO events (date, time, country, event, importance, type)
        VALUES (?, ?, ?, ?, ?, ?)
    """, (
        row["date"],
        row["time"],
        row["country"],
        row["event"],
        row["importance"],
        row["type"]
    ))

# コミット & 終了
conn.commit()

# レコード数を確認
cursor.execute("SELECT COUNT(*) FROM events")
print(f"現在のeventsテーブルの件数: {cursor.fetchone()[0]}")

conn.close()

として保存

実行すると

python add_calendarDB.py 
現在のeventsテーブルの件数: 90

となる

これで再度、今日のイベント情報を取得してみる

 python today_events.py                       
         date   time country               event importance  type
0  2025-07-25  08:30       日  東京都区部消費者物価指数&【除生鮮】       None  経済指標
1  2025-07-25  15:00       英        小売売上高&【除自動車】       None  経済指標
2  2025-07-25  17:00       独             IFO景況指数       None  経済指標
3  2025-07-25  21:30       米      耐久財受注&【除輸送用機器】          ★  経済指標

問題なく実行できた

次に金の価格などの過去データだが
これは investing.com へ無料登録すれば過去データの取得が可能
一気にダウンロードしようとしたけど
20年ぐらいが限界なので分けて取得する

gmailから予定の抽出とDB格納

経済指標カレンダーがgmailで購読しているメルマガに掲載されているので、そこから抽出したい。 この経済指標カレンダーを自動売買に組み込みたい

🧩 全体構成
① Gmail APIでメールを取得
* google-api-python-client でGmail APIを使って、メルマガ(特定の送信者や件名)を定期的に取得
② 経済指標カレンダー部分の抽出
* HTML構造をパースして、経済指標情報(日付・時間・国・指標名・前回・予想・結果など)を抽出
* BeautifulSoup や正規表現を併用
③ データベース or CSVに保存(SQLiteなど)
* 抽出したデータを SQLite に保存
* 過去データの参照やトリガー管理が容易
④ 自動売買スクリプトに連携
* 経済指標発表前後のトリガー条件をPythonで定義
* 例: 「米国雇用統計の5分前にポジションをクローズする」など

実験的にメルマガの内容をテキストファイルにまとめた これから抽出してほしい
として
Gmail.txtで実験したらできた

まずはメルマガから抽出する実験をする
ダメなら
同じようにGPTでcsvファイルを作成する
これでも対処はできる

cp ~/Downloads/economic_events_20250714.* .

で作成した
Csv、JSONファイルを移動

とりあえず経済指標はGPTで抽出する

date,time,country,event,importance,type
2025-07-15,11:00,中,第2四半期GDP,,経済指標
2025-07-15,11:00,中,鉱工業生産,,経済指標
2025-07-15,11:00,中,小売売上高,,経済指標
2025-07-15,11:00,中,固定資産投資,,経済指標
2025-07-15,18:00,独,ZEW景況感調査,,経済指標
2025-07-15,21:30,加,消費者物価指数,,経済指標
2025-07-15,29:00,英,ベイリーBOE総裁の発言,,発言
2025-07-15,20時頃,米,JPモルガン・チェース決算,★,決算
2025-07-15,21:30,米,消費者物価指数&【コア】,★,経済指標
2025-07-15,21:30,米,NY連銀製造業景気指数,★,経済指標
2025-07-15,22:15,米,ボウマンFRB副議長の発言(投票権あり),★,発言
2025-07-15,23時頃,米,シティグループ決算,★,決算
2025-07-15,25:45,米,バーFRB理事の発言(投票権あり),★,発言
2025-07-15,26:00,米,バーキン:リッチモンド連銀総裁の発言(投票権なし),★,発言
2025-07-15,27:45,米,コリンズ:ボストン連銀総裁の発言(投票権あり),★,発言
2025-07-16,15:00,英,消費者物価指数&【コア】,,経済指標
2025-07-16,15:00,英,小売物価指数&【コア】,,経済指標
2025-07-16,21:15,加,住宅着工件数,,経済指標
2025-07-16,08:45,米,ローガン:ダラス連銀総裁の発言(投票権なし),★,発言
2025-07-16,20:00,米,MBA住宅ローン申請指数,★,経済指標
2025-07-16,21:00,米,バーキン:リッチモンド連銀総裁の発言(投票権なし),★,発言
2025-07-16,21時頃,米,ゴールドマン・サックス決算,★,決算
2025-07-16,21時頃,米,モルガン・スタンレー決算,★,決算
2025-07-16,21:30,米,生産者物価指数&【コア】,★,経済指標
2025-07-16,22:15,米,鉱工業生産/設備稼働率,★,経済指標
2025-07-16,22:15,米,ハマック:クリーブランド連銀総裁の発言(投票権なし),★,発言
2025-07-16,23:00,米,バーFRB理事の発言(投票権あり),★,発言
2025-07-16,23:30,米,週間原油在庫,★,経済指標
2025-07-16,27:00,米,地区連銀経済報告(ベージュブック),★,経済指標
2025-07-17,10:30,豪,失業率&新規雇用者数,,経済指標
2025-07-17,15:00,英,失業率&失業保険申請件数,,経済指標
2025-07-17,06:30,米,ウィリアムズ:NY連銀総裁の発言(投票権あり),★,発言
2025-07-17,21:30,米,新規失業保険申請件数,★,経済指標
2025-07-17,21:30,米,小売売上高&【除自動車】,★,経済指標
2025-07-17,21:30,米,フィラデルフィア連銀景況指数,★,経済指標
2025-07-17,21:30,米,輸入物価指数,★,経済指標
2025-07-17,23:00,米,企業在庫,★,経済指標
2025-07-17,23:00,米,NAHB住宅市場指数,★,経済指標
2025-07-17,23:00,米,クーグラーFRB理事の発言(投票権あり),★,発言
2025-07-17,23:30,米,週間天然ガス貯蔵量,★,経済指標
2025-07-17,25:45,米,デイリー:サンフランシスコ連銀総裁の発言(投票権なし),★,発言
2025-07-17,26:30,米,クックFRB理事の発言(投票権あり),★,発言
2025-07-17,29:00,米,対米証券投資【ネット長期フロー】&【ネットフロー合計】,★,経済指標
2025-07-17,米株引後,米,ネットフリックス決算,★,決算
2025-07-18,08:30,日,全国消費者物価指数&【除生鮮】,,経済指標
2025-07-18,07:30,米,ウォラーFRB理事の発言(投票権あり),★,発言
2025-07-18,21:30,米,住宅着工件数/建設許可件数,★,経済指標
2025-07-18,23:00,米,ミシガン大学消費者信頼感指数【速報値】,★,経済指標

という内容で

economic_events_20250714.csv	

を作成

これをsqliteに入れてDBにする

 vim calendar_csv_in_sql.py

でファイルを作成

import pandas as pd
import sqlite3

# CSVファイルの読み込み
csv_path = "economic_events_20250714.csv"  # ファイルパスは必要に応じて変更
df = pd.read_csv(csv_path)

# SQLiteデータベースに接続(なければ作成)
conn = sqlite3.connect("economic_events.db")  # 出力ファイル名も変更可能

# データをeventsテーブルに保存(既存なら上書き)
df.to_sql("events", conn, if_exists="replace", index=False)

# テーブル構成確認(任意)
cursor = conn.cursor()
cursor.execute("PRAGMA table_info(events)")
columns = cursor.fetchall()
for col in columns:
    print(f"{col[1]} ({col[2]})")

# 接続を閉じる
conn.close()

で保存

実行すると

date (TEXT)
time (TEXT)
country (TEXT)
event (TEXT)
importance (TEXT)
type (TEXT)

となる

次に経済指標で
DBの中身で今日の経済指標一覧を表示

しかし、これだと先週のデータのため表示されないので
今週のものを試す

経済指標をcsvへ保存

経済指標をcsvへ保存

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

# フォント設定(任意)
plt.rcParams['font.family'] = 'Times New Roman'

# --- FRED APIキー設定 ---
# 環境変数から取得(事前に設定しておくか、以下のように直接記述しても可)
# os.environ['FRED_API_KEY'] = 'あなたのAPIキー'
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 = get_fred_data(name, start=start)
        data1 = df.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 = get_fred_data(name[i], start=start)
            data1 = df.reset_index()
            axes[i].plot(data1['date'], data1['value'])
            axes[i].set_xlabel('date')
            axes[i].set_ylabel(name[i])
    plt.show()

# --- CSV保存関数 ---
def save_fred_data_to_csv(series_name, start="1980-01-01", end=""):
    df = get_fred_data(series_name, start=start, end=end)

    # 保存ディレクトリ作成
    save_dir = "./fred_data"
    os.makedirs(save_dir, exist_ok=True)

    # 日付範囲取得(YYYY)
    start_date = df.index.min().strftime("%Y")
    end_date = df.index.max().strftime("%Y")

    # ファイル名作成
    filename = f"{series_name}_{start_date}_{end_date}.csv"
    filepath = os.path.join(save_dir, filename)

    # CSV保存
    df.reset_index().to_csv(filepath, index=False, encoding="utf-8-sig")
    print(f"保存完了: {filepath}")

# --- 実行例(UNRATE) ---
if __name__ == "__main__":
    # データ取得とグラフ表示
    MakeGraphFromFred("UNRATE", start="1980-01-01")

    # CSV保存
    save_fred_data_to_csv("UNRATE", start="1980-01-01")

として保存

これを実行するとグラフが表示され

 python unrate_csv.py 
FRED APIキーが環境変数に設定されている:True
保存完了: ./fred_data/UNRATE_1980_2025.csv

となって
fred_data の中に失業率のcsvファイルが作成される

他に取得できるものを探す

✅ よく使われるFREDの経済指標一覧(コード付き)
分類 指標名 シリーズID(コード) 内容
✅ 雇用関連 失業率 UNRATE 米国の失業率(月次)
非農業部門雇用者数 PAYEMS 米国の雇用者数(非農業)
労働参加率 CIVPART 労働人口比率
✅ 物価・インフレ 消費者物価指数 CPIAUCSL インフレの代表的指標(都市部)
コアCPI(食料・エネルギー除く) CPILFESL より安定したインフレ指標
PCEデフレーター PCEPI FRBが重視する物価指標
コアPCE PCEPILFE 食料とエネルギー除いたPCE
✅ 金融・金利 FFレート(政策金利) FEDFUNDS FOMCが決定する金利
米国10年国債利回り GS10 長期金利の指標
2年国債利回り GS2 短期金利
金利差(10年−2年) 自作可能 景気後退の予兆(逆イールド)
✅ 経済成長 実質GDP(四半期) GDPC1 インフレ調整済みGDP
名目GDP GDP 実額ベースのGDP
景気先行指数 USSLIND 将来の景気動向予測に使用
✅ 消費・支出 小売売上高 RSAFS 米国小売業の売上(月次)
個人消費支出 PCE GDPの約7割を占める項目
✅ 住宅関連 住宅着工件数 HOUST 新築住宅の開始件数
住宅価格指数(FHFA) USSTHPI 米国住宅価格の推移
建設支出 TTLCONS 総建設支出(月次)
✅ 信用・金融 家計債務残高 TOTALSL 個人の借入総額
クレジットカード貸出残高 REVOLSL リボ払い・カード債務
✅ その他 マネーサプライM2 M2SL 通貨供給量
ビットコイン価格(Coinbase) CBBTCUSD 仮想通貨指標(参考値)

✅ FXで重要とされる経済指標【総合ランキング】
ランク 経済指標 内容 市場への影響
⭐️1位 米国雇用統計(Nonfarm Payrolls: NFP) 毎月第一金曜、米国の雇用者増減 ドル、株、金利全てに影響
⭐️2位 消費者物価指数(CPI) 物価上昇率。インフレ判断基準 利上げ/利下げの判断材料
⭐️3位 FOMC政策金利(FEDFUNDS) 米国金利の発表(8回/年) ドルと世界中の金利に影響
⭐️4位 GDP成長率 経済成長の総合評価 景気の健全性判断
⭐️5位 小売売上高 個人消費の動向 GDPと景気の先行指標
⭐️6位 ISM製造業指数 景況感(PMI) 50を境に好不況判断
⭐️7位 PCEデフレーター FRBが重視するインフレ指標 CPIより重視される場合あり
⭐️8位 新規失業保険申請件数 週間ベースの雇用動向 NFPの先行指標
⭐️9位 貿易収支 輸出入のバランス 通貨需給に直接影響
⭐️10位 住宅着工件数/中古住宅販売 住宅市場の健全性 米経済の構造に深く関与

✅ FREDで取得できる代表的なFX関連指標とID
指標カテゴリ 指標名 シリーズID 内容
雇用 非農業部門雇用者数 PAYEMS 米国雇用統計(NFP)
雇用 失業率 UNRATE NFPと並ぶ重要指標
雇用 初回失業保険申請件数 ICSA 毎週発表、先行性あり
物価 CPI CPIAUCSL インフレ判断基準
物価 コアCPI CPILFESL 食品・エネルギー除く
物価 PCEデフレーター PCEPI FRBの注目指標
金利 FFレート(政策金利) FEDFUNDS FOMC発表後更新
金利 2年国債利回り GS2 市場予想の反映が早い
金利 10年国債利回り GS10 長期金利の代表格
金利 利回りスプレッド (GS10 – GS2) 景気後退の兆候(逆イールド)
景況感 ISM製造業指数 NAPM または外部API PMIとして注目
景気 実質GDP GDPC1 経済成長を確認
貿易 経常収支 NETEXP 通貨需給に影響
消費 小売売上高 RSAFS 景気動向の先行指標
住宅 新築住宅着工件数 HOUST 金利の影響を受けやすい

✅ 補足:為替相場への影響の仕組み(簡易図解)

コピーする編集する
CPI上昇 → インフレ懸念 → 利上げ期待↑ → 金利上昇 → 通貨価値↑ → 通貨買い(USD/JPY↑)
GDP減速 → 景気不安 → 利下げ期待↑ → 金利低下 → 通貨価値↓ → 通貨売り(USD/JPY↓)

✅ 使い方の例(Python × FRED)

# 雇用統計データ(NFP)取得してCSV保存
save_fred_data_to_csv("PAYEMS", start="2010-01-01")

# CPIデータ取得
save_fred_data_to_csv("CPIAUCSL", start="2010-01-01")

# 政策金利データ取得
save_fred_data_to_csv("FEDFUNDS", start="2010-01-01")

🔧 応用アイデア
* 経済指標発表カレンダーと自動連動
* 発表前後のUSD/JPYの値動きを自動分析
* SQLiteやNeo4jに格納して分析基盤を構築

ご希望あれば、指標発表日とFXチャートを自動で重ねる可視化スクリプトや、Neo4jでの因果関係分析のテンプレートも提供可能です!

これらを取得するように

import os
import pandas as pd
from full_fred.fred import Fred
from datetime import datetime

# --- FRED APIキー設定(環境変数が必要) ---
fred = Fred()
assert fred.env_api_key_found(), "FRED_API_KEYが環境変数に設定されていません。"

# --- データ取得関数 ---
def get_fred_data(series_id, start="1980-01-01", end=""):
    df = fred.get_series_df(series_id)[["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[start:end]
    else:
        df = df.loc[start:]
    return df

# --- CSV保存関数 ---
def save_fred_data_to_csv(series_id, label, start="1980-01-01", end=""):
    df = get_fred_data(series_id, start=start, end=end)

    # 保存ディレクトリ作成
    save_dir = "./fred_data_fx"
    os.makedirs(save_dir, exist_ok=True)

    # 実際の取得範囲の年月
    start_date = df.index.min().strftime("%Y")
    end_date = df.index.max().strftime("%Y")

    # ファイル名(シリーズID_年範囲.csv)
    filename = f"{series_id}_{start_date}_{end_date}.csv"
    filepath = os.path.join(save_dir, filename)

    # CSVとして保存
    df.reset_index().to_csv(filepath, index=False, encoding="utf-8-sig")
    print(f"✅ {label} を保存しました → {filepath}")

# --- 重要指標リスト(シリーズIDと名前) ---
indicators = [
    ("PAYEMS", "非農業部門雇用者数 (NFP)"),
    ("UNRATE", "失業率"),
    ("ICSA", "新規失業保険申請件数"),
    ("CPIAUCSL", "消費者物価指数 (CPI)"),
    ("CPILFESL", "コアCPI"),
    ("PCEPI", "PCEデフレーター"),
    ("FEDFUNDS", "FFレート(政策金利)"),
    ("GS2", "2年国債利回り"),
    ("GS10", "10年国債利回り"),
    ("GDPC1", "実質GDP"),
    ("RSAFS", "小売売上高"),
    ("HOUST", "住宅着工件数"),
    ("NETEXP", "経常収支"),
]

# --- 一括実行 ---
if __name__ == "__main__":
    for series_id, label in indicators:
        try:
            save_fred_data_to_csv(series_id, label, start="1980-01-01")
        except Exception as e:
            print(f"⚠️ {label} ({series_id}) の保存に失敗しました: {e}")

として実行する

 python economic_index.py 
✅ 非農業部門雇用者数 (NFP) を保存しました → ./fred_data_fx/PAYEMS_1980_2025.csv
✅ 失業率 を保存しました → ./fred_data_fx/UNRATE_1980_2025.csv
✅ 新規失業保険申請件数 を保存しました → ./fred_data_fx/ICSA_1980_2025.csv
✅ 消費者物価指数 (CPI) を保存しました → ./fred_data_fx/CPIAUCSL_1980_2025.csv
✅ コアCPI を保存しました → ./fred_data_fx/CPILFESL_1980_2025.csv
✅ PCEデフレーター を保存しました → ./fred_data_fx/PCEPI_1980_2025.csv
✅ FFレート(政策金利) を保存しました → ./fred_data_fx/FEDFUNDS_1980_2025.csv
✅ 2年国債利回り を保存しました → ./fred_data_fx/GS2_1980_2025.csv
✅ 10年国債利回り を保存しました → ./fred_data_fx/GS10_1980_2025.csv
✅ 実質GDP を保存しました → ./fred_data_fx/GDPC1_1980_2025.csv
✅ 小売売上高 を保存しました → ./fred_data_fx/RSAFS_1992_2025.csv
✅ 住宅着工件数 を保存しました → ./fred_data_fx/HOUST_1980_2025.csv
✅ 経常収支 を保存しました → ./fred_data_fx/NETEXP_1980_2025.csv

とした
これで経済指標がある程度は保存できている

追加で
✅ よく使われるFREDの経済指標一覧(コード付き)
分類 指標名 シリーズID(コード) 内容
✅ 雇用関連 失業率 UNRATE 米国の失業率(月次)
非農業部門雇用者数 PAYEMS 米国の雇用者数(非農業)
労働参加率 CIVPART 労働人口比率
✅ 物価・インフレ 消費者物価指数 CPIAUCSL インフレの代表的指標(都市部)
コアCPI(食料・エネルギー除く) CPILFESL より安定したインフレ指標
PCEデフレーター PCEPI FRBが重視する物価指標
コアPCE PCEPILFE 食料とエネルギー除いたPCE
✅ 金融・金利 FFレート(政策金利) FEDFUNDS FOMCが決定する金利
米国10年国債利回り GS10 長期金利の指標
2年国債利回り GS2 短期金利
金利差(10年−2年) 自作可能 景気後退の予兆(逆イールド)
✅ 経済成長 実質GDP(四半期) GDPC1 インフレ調整済みGDP
名目GDP GDP 実額ベースのGDP
景気先行指数 USSLIND 将来の景気動向予測に使用
✅ 消費・支出 小売売上高 RSAFS 米国小売業の売上(月次)
個人消費支出 PCE GDPの約7割を占める項目
✅ 住宅関連 住宅着工件数 HOUST 新築住宅の開始件数
住宅価格指数(FHFA) USSTHPI 米国住宅価格の推移
建設支出 TTLCONS 総建設支出(月次)
✅ 信用・金融 家計債務残高 TOTALSL 個人の借入総額
クレジットカード貸出残高 REVOLSL リボ払い・カード債務
✅ その他 マネーサプライM2 M2SL 通貨供給量
ビットコイン価格(Coinbase) CBBTCUSD 仮想通貨指標(参考値)

も取得したい

import os
import pandas as pd
from full_fred.fred import Fred
from datetime import datetime

# --- FRED APIキー確認 ---
fred = Fred()
assert fred.env_api_key_found(), "❌ FRED_API_KEYが環境変数に設定されていません。"

# --- データ取得関数 ---
def get_fred_data(series_id, start="1980-01-01", end=""):
    df = fred.get_series_df(series_id)[["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[start:end]
    else:
        df = df.loc[start:]
    return df

# --- CSV保存関数 ---
def save_fred_data_to_csv(series_id, label, start="1980-01-01", end=""):
    df = get_fred_data(series_id, start=start, end=end)
    save_dir = "./fred_data_all"
    os.makedirs(save_dir, exist_ok=True)
    start_date = df.index.min().strftime("%Y")
    end_date = df.index.max().strftime("%Y")
    filename = f"{series_id}_{start_date}_{end_date}.csv"
    filepath = os.path.join(save_dir, filename)
    df.reset_index().to_csv(filepath, index=False, encoding="utf-8-sig")
    print(f"✅ {label} を保存しました → {filepath}")

# --- 保存対象の指標一覧(シリーズIDとラベル) ---
indicators = [
    # ✅ 雇用関連
    ("UNRATE", "失業率"),
    ("PAYEMS", "非農業部門雇用者数"),
    ("CIVPART", "労働参加率"),

    # ✅ 物価・インフレ
    ("CPIAUCSL", "消費者物価指数 (CPI)"),
    ("CPILFESL", "コアCPI"),
    ("PCEPI", "PCEデフレーター"),
    ("PCEPILFE", "コアPCE"),

    # ✅ 金融・金利
    ("FEDFUNDS", "政策金利(FFレート)"),
    ("GS10", "10年国債利回り"),
    ("GS2", "2年国債利回り"),

    # ✅ 経済成長
    ("GDPC1", "実質GDP"),
    ("GDP", "名目GDP"),
    ("USSLIND", "景気先行指数"),

    # ✅ 消費・支出
    ("RSAFS", "小売売上高"),
    ("PCE", "個人消費支出"),

    # ✅ 住宅関連
    ("HOUST", "住宅着工件数"),
    ("USSTHPI", "住宅価格指数(FHFA)"),
    ("TTLCONS", "建設支出"),

    # ✅ 信用・金融
    ("TOTALSL", "家計債務残高"),
    ("REVOLSL", "クレジットカード貸出残高"),

    # ✅ その他
    ("M2SL", "マネーサプライM2"),
    ("CBBTCUSD", "ビットコイン価格(Coinbase)"),
]

# --- 一括取得・保存 ---
if __name__ == "__main__":
    for series_id, label in indicators:
        try:
            save_fred_data_to_csv(series_id, label, start="1980-01-01")
        except Exception as e:
            print(f"⚠️ {label} ({series_id}) の保存に失敗しました: {e}")

とすることで取得可能

次は商品関連の取得

Wtiの価格を1980から取得する

Wtiの価格を1980から取得する

pip install pandas_datareader

でインストール

Collecting pandas_datareader
  Downloading pandas_datareader-0.10.0-py3-none-any.whl.metadata (2.9 kB)
Requirement already satisfied: lxml in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas_datareader) (5.4.0)
Requirement already satisfied: pandas>=0.23 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas_datareader) (2.2.3)
Requirement already satisfied: requests>=2.19.0 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas_datareader) (2.32.3)
Requirement already satisfied: numpy>=1.23.2 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas>=0.23->pandas_datareader) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas>=0.23->pandas_datareader) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas>=0.23->pandas_datareader) (2024.2)
Requirement already satisfied: tzdata>=2022.7 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from pandas>=0.23->pandas_datareader) (2025.1)
Requirement already satisfied: six>=1.5 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas>=0.23->pandas_datareader) (1.17.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from requests>=2.19.0->pandas_datareader) (3.4.1)
Requirement already satisfied: idna<4,>=2.5 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from requests>=2.19.0->pandas_datareader) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from requests>=2.19.0->pandas_datareader) (2.3.0)
Requirement already satisfied: certifi>=2017.4.17 in /Users/snowpool/.pyenv/versions/3.11.0/lib/python3.11/site-packages (from requests>=2.19.0->pandas_datareader) (2024.12.14)
Downloading pandas_datareader-0.10.0-py3-none-any.whl (109 kB)
Installing collected packages: pandas_datareader
Successfully installed pandas_datareader-0.10.0

でインストール

import pandas_datareader.data as web
import pandas as pd
from datetime import datetime

# 開始・終了日
start = datetime(1980, 1, 1)
end = datetime.today()

# FREDからWTI価格データを取得
wti_df = web.DataReader('DCOILWTICO', 'fred', start, end)

# 欠損値を除去(必要に応じて)
wti_df.dropna(inplace=True)

# CSVに保存
wti_df.to_csv("wti_price_1980_to_present.csv")

print("✅ WTI原油価格データを保存しました:wti_price_1980_to_present.csv")

で実行

 python wti_csv.py            
✅ WTI原油価格データを保存しました:wti_price_1980_to_present.csv

となって
Csvファイルで取得ができた

金の価格や銀の価格も取得できるか試す

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に保存する