python(パイソン)とyfinance

import yfinance as yf
import pandas as pd
import os

# データ取得のパラメータ設定
symbol = 'JPY=X'  # USD/JPYのシンボル
interval = '1m'  # 1分足
period = '5d'  # 過去5日分

# データを取得
df = yf.download(tickers=symbol, interval=interval, period=period)

# データをCSVファイルに保存する前に、最後の数行を表示
print("取得したデータの最後の数行:")
print(df.tail())

# デスクトップのパスを取得
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

# CSVファイルの保存場所を指定
file_path = os.path.join(desktop_path, 'usd_jpy_1min_5days.csv')

# データをCSVファイルに保存
df.to_csv(file_path)

print(f"データが{file_path}に保存されました。")

yfinanceから 1分足のデータを.csvファイルでダウンロードする。5日が上限の模様。

import pandas as pd
import matplotlib.pyplot as plt
import os

# デスクトップのパスを取得
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

# CSVファイルを読み込む
file_path = os.path.join(desktop_path, 'usd_jpy_1min_5days.csv')
df = pd.read_csv(file_path)

# タイムスタンプをDatetime型に変換
df['Datetime'] = pd.to_datetime(df['Datetime'], utc=True)

# タイムゾーンをUTCからJSTに変換
df['Datetime'] = df['Datetime'].dt.tz_convert('Asia/Tokyo')

# 土日を除外
df = df[~df['Datetime'].dt.weekday.isin([5, 6])]

# 日付ごとにデータをグループ化
df['Date'] = df['Datetime'].dt.date
grouped = df.groupby('Date')

# グラフを作成
plt.figure(figsize=(10, 5))

for date, group in grouped:
    # 各日付の7:00から19:00のデータをフィルタリング
    df_filtered = group[(group['Datetime'].dt.time >= pd.to_datetime('07:00').time()) & 
                        (group['Datetime'].dt.time <= pd.to_datetime('19:00').time())]
    
    # 時間部分のみを秒数として取得
    times = df_filtered['Datetime'].dt.hour * 3600 + df_filtered['Datetime'].dt.minute * 60 + df_filtered['Datetime'].dt.second
    
    # 各日のグラフをプロット
    plt.plot(times, df_filtered['Close'], label=str(date))

# X軸のラベル設定(7:00, 8:00, 9:00, 10:00, 11:00, 12:00, 13:00, 14:00, 15:00, 16:00, 17:00, 18:00, 19:00)
x_labels = ['07:00', '08:00', '09:00', '010:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00']
x_ticks = [7*3600, 8*3600, 9*3600, 10*3600, 11*3600, 12*3600, 13*3600, 14*3600, 15*3600, 16*3600, 17*3600, 18*3600, 19*3600]
plt.xticks(x_ticks, x_labels)

# Y軸の範囲を143-147に設定
plt.ylim(143, 147)

# 軸ラベルとタイトル
plt.xlabel('TIME')
plt.ylabel('PRICE (JPY/USD)')
plt.title('USD/JPY 1M')

# グリッドを表示
plt.grid(True)

# 凡例を表示
plt.legend()

# グラフを表示
plt.show()

同時刻のグラフの変化を描いてみる。上記は、日本時間のみのグラフ。ここまで確認済み。以下は未確認。複数のCSVファイルを統合して描く場合。後日、確認予定。

import pandas as pd
import matplotlib.pyplot as plt
import os
from glob import glob

# デスクトップのパスを取得
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

# CSVファイルをすべて読み込む
csv_files = glob(os.path.join(desktop_path, '*.csv'))  # デスクトップ上のすべてのCSVファイルを取得
df_list = [pd.read_csv(file) for file in csv_files]  # 各CSVファイルをデータフレームとして読み込む

# データフレームを結合し、重複を削除
df = pd.concat(df_list).drop_duplicates()

# タイムスタンプをDatetime型に変換
df['Datetime'] = pd.to_datetime(df['Datetime'], utc=True)

# タイムゾーンをUTCからJSTに変換
df['Datetime'] = df['Datetime'].dt.tz_convert('Asia/Tokyo')

# 土日を除外
df = df[~df['Datetime'].dt.weekday.isin([5, 6])]

# 日付ごとにデータをグループ化
df['Date'] = df['Datetime'].dt.date
grouped = df.groupby('Date')

# グラフを作成
plt.figure(figsize=(10, 5))

for date, group in grouped:
    # 各日付の7:00から19:00のデータをフィルタリング
    df_filtered = group[(group['Datetime'].dt.time >= pd.to_datetime('07:00').time()) & 
                        (group['Datetime'].dt.time <= pd.to_datetime('19:00').time())]
    
    # 時間部分のみを秒数として取得
    times = df_filtered['Datetime'].dt.hour * 3600 + df_filtered['Datetime'].dt.minute * 60 + df_filtered['Datetime'].dt.second
    
    # 各日のグラフをプロット
    plt.plot(times, df_filtered['Close'], label=str(date))

# X軸のラベル設定(7:00, 9:00, 11:00, 13:00, 15:00, 17:00, 19:00)
x_labels = ['07:00', '09:00', '11:00', '13:00', '15:00', '17:00', '19:00']
x_ticks = [7*3600, 9*3600, 11*3600, 13*3600, 15*3600, 17*3600, 19*3600]
plt.xticks(x_ticks, x_labels)

# Y軸の範囲を143-147に設定
plt.ylim(143, 147)

# 軸ラベルとタイトル
plt.xlabel('TIME')
plt.ylabel('PRICE (JPY/USD)')
plt.title('USD/JPY 1M')

# グリッドを表示
plt.grid(True)

# 凡例を表示
plt.legend()

# グラフを表示
plt.show()