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