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価格を取得できる

コメントを残す

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