非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【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やデータソースを利用することを検討した方が良いかもしれません。

 

スポンサーリンク

 - Python