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

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

【Python】(訂正版)yfinanceでドル円の1時間足データを日足データに加工する方法

   

前回、yfinanceでドル円の1時間足データをダウンロードし、それを日足データに加工する方法について書きました。

出来たことは出来たのですが、時間ごとのデータから1日単位にまとめるロジックで、DataFrameの機能を十分に発揮させずやや力技でやってしまったみたいなので訂正版として作り直しました。前回紹介したDataFrameで時系列データを1日単位に処理する方法がベースになります。

以下がソースコードです。Forループの処理のやり方が大きく変わっていることがわかると思います。余計な演算がなくなり変数もだいぶ減っています。

import yfinance as yf
import pandas as pd
import mplfinance as mpf

# ドル円のティッカーシンボル
ticker = "JPY=X"
# 1hデータをダウンロード
df = yf.download(ticker, start="2023-01-01", end="2025-01-01", interval="1h")

df.columns = df.columns.droplevel(1)  # 'Ticker' レベルを削除
df.columns.name = None
df = df.reset_index()
df = df.drop('Adj Close', axis=1) # Adj Close列を削除
df = df.drop('Volume', axis=1) # Volume列を削除

# Date列の日付部分だけ取得
df['Day'] = df['Datetime'].dt.date

# 空のDataFrameを作る(1日足用)
df2 = pd.DataFrame(columns=["Date", "Close", "High", "Low", "Open"])

# 日付ごとにグループ化してインデックスを取得
i=0
for day, group in df.groupby('Day'):
    st = group.index.min()
    en = group.index.max()
    # print(f"日付: {day}, 開始インデックス: {st}, 終了インデックス: {en}")
    dt = df.loc[st, 'Datetime']
    op = df.loc[st, 'Open']
    cl = df.loc[en, 'Close']
    hi = df.loc[st:en, 'High'].max()
    lo = df.loc[st:en, 'Low'].min()
    df2.loc[i] = [dt, cl, hi, lo, op] #DataFrameに追加
    i+=1

# Date列をインデックスに割り当てる
df2.set_index('Date', inplace = True) 

print(df2)


# グラフのスタイル設定
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='--' # グリッド線のスタイル
)

# 末尾100行分をローソク足チャート表示
mpf.plot(df2.tail(100),
            type='candle', 
            style=my_style,
            mav=(5, 25), # 移動平均線(5日と25日)
            figratio=(8,5),
            title='USDJPY')
 

 

出力結果は前回と同じです。

 

 

スポンサーリンク

 - Python