【Pyhon】yfinanceでドル円の1日足データを取得してハマった話
最近、Pythonのyfinanceライブラリを使ってドル円(USD/JPY)の為替データをダウンロードし、ローソク足チャートを描画してみました。interval=”1d”(1日足)を指定してデータを取得し、チャートを表示してみたところ…
あれ?何かおかしいです。ローソク足がすべてほぼ同じ位置に揃っており、チャートが1本の線のようになってしまいました。最初はコードにミスがあるのかと思い、何度も見直しましたが問題はありませんでした。データの取得方法に問題があるのかと思い、他のオプションを試してみても同じ結果です。正直、かなり時間を費やしてしまいました。
ちなみに、その時のソースコードはこちら。
import mplfinance as mpf import yfinance as yf # ドル円のティッカーシンボル ticker = "JPY=X" # データをダウンロード df = yf.download(ticker, start="2024-08-01", end="2025-01-01", interval="1d") # 項目行を見直し # data = data.iloc[1:].reset_index(drop=True) df.columns = df.columns.droplevel(1) # 'Ticker' レベルを削除 df.columns.name = None print(df) df = df.reset_index() df.set_index('Date', inplace = True) # チャートのデザイン(スタイル)を設定 my_style = mpf.make_mpf_style( base_mpf_style='yahoo', # 既存のスタイル('yahoo', 'classic', 'default'などから選択) marketcolors=mpf.make_marketcolors( up='red', down='darkblue', edge='inherit', wick='black', volume='inherit' ), facecolor='white', # 背景色 gridcolor='lightgray', # グリッド線の色 gridstyle='--' # グリッド線のスタイル ) mpf.plot(df.tail(200), type='candle', style=my_style, mav=(5, 25), # 移動平均線(5日と25日) figratio=(10,4), title='JPY=X')
原因はClose=Openだった
データを詳しく確認してみたところ、すべての行でClose(終値)とOpen(始値)の値が一致していることがわかりました。これが原因で、ローソク足が1本の線のように見えていたのです。
なぜこうなったのか?
考察してみた結果、yfinanceが提供している1日足のデータは、実際の終値と始値が正しく反映されていない可能性が高いです。
yfinanceはYahoo FinanceのAPIを通じてデータを取得していますが、為替(FX)のような24時間取引される資産の場合、1日足のデータがうまく処理されていないのかもしれません。
特に為替市場には株式市場のような「取引開始・終了」の時間がないため、1日の終値と翌日の始値が同じになるケースが生じているのではないかと考えられます。
解決策:1時間足(1h)でデータを取得してみた
試しにinterval=”1h”(1時間足)でデータを取得してみたところ、今度は正しいローソク足チャートが描画できました。どうやら、1時間ごとのデータなら始値と終値がきちんと反映されているようです。
import mplfinance as mpf import yfinance as yf # ドル円のティッカーシンボル ticker = "JPY=X" # データをダウンロード df = yf.download(ticker, start="2024-08-01", end="2025-01-01", interval="1h") #1d->1h # 項目行を見直し df.columns = df.columns.droplevel(1) # 'Ticker' レベルを削除 df.columns.name = None print(df) df = df.reset_index() df['Date'] = df['Datetime'] #1h足の場合はこれが必要 df = df.drop('Datetime', axis=1) #1h足の場合はこれが必要(2) df.set_index('Date', inplace = True) # チャートのデザイン(スタイル)を設定 my_style = mpf.make_mpf_style( base_mpf_style='yahoo', # 既存のスタイル('yahoo', 'classic', 'default'などから選択) marketcolors=mpf.make_marketcolors( up='red', down='darkblue', edge='inherit', wick='black', volume='inherit' ), facecolor='white', # 背景色 gridcolor='lightgray', # グリッド線の色 gridstyle='--' # グリッド線のスタイル ) mpf.plot(df.tail(200), type='candle', style=my_style, mav=(5, 25), # 移動平均線(5日と25日) figratio=(10,4), title='JPY=X')
ご覧の通りローソク足チャートを描くことができました。
残念ながら、yfinanceのinterval=”1d”で信頼できる1日足のチャートを作成するのは難しいようです。もし正確な1日足のデータが必要な場合は、他のAPIやデータソースを利用することを検討した方が良いかもしれません。
スポンサーリンク