見出し画像

【中級編】WTI原油先物の時系列データを取得するPythonコード|イザナミ豆知識

Python使える環境の方向けです。

Pythonを使ってイザナミで使える原油先物データを取得する方法です。
原油先物価格を利用した戦略作成にご利用ください。


使い方

引数に出力先CSVファイルのフルパス指定します

python WTI原油先物取得.py WTI原油先物,csv

コード

WTI原油先物取得.py

# Yahoo FinanceからWTI原油先物のデータを取得します。
# 更新の必要があれば全期間DLして更新する
# 1銘柄故にそんない時間掛からないので

import os
import sys
from datetime import datetime

import pandas as pd
import yfinance as yf

# ファイルの存在確認
def file_exists(filepath):
    return os.path.exists(filepath)

# メイン処理
def main():

    try:

        # 引数の数を確認
        if len(sys.argv) < 2:
            print("Usage: python WTI原油先物取得.py <出力csv フルパス>")
            sys.exit(1)

        argument = sys.argv[1]
        print(f"Received argument: {argument}")

        current_date = datetime.today().strftime('%Y-%m-%d')
        updateFlag = True
        if file_exists(argument):
            print("File exists")

            # CSVファイルを読み込む
            read_data = pd.read_csv(argument)
            # 最新の日付を取得する
            latest_date = pd.to_datetime(read_data['Date']).max().strftime('%Y-%m-%d')

            # yfから最新日だけデータを取得して、日付を取得する
            data = yf.download("CL=F", start=latest_date, end=current_date)
            dl_latest_date = pd.to_datetime(data.index).max().strftime('%Y-%m-%d')

            # 最新日が同じなら更新不要
            if latest_date == dl_latest_date:
                print("更新は不要です")
                updateFlag = False

        else:
            print("File does not exist")

        if updateFlag == True:
            print("更新を開始します.")

            # yfからデータを取得します。startとendで取得する期間を指定します。
            data = yf.download("CL=F", start="2000-01-01", end=current_date)

            # 日付の形式を '2020/01/02' の形に変更します。
            data.index = pd.to_datetime(data.index).strftime('%Y/%m/%d')

            # データバグってる日があるので、暫定処理でLOW/HIGHを修正する
            data.loc[data['Low'] > data[['Open', 'High', 'Close']].min(axis=1), 'Low'] = data[['Open', 'High', 'Close']].min(axis=1)
            data.loc[data['High'] < data[['Open', 'Low', 'Close']].max(axis=1), 'High'] = data[['Open', 'Low', 'Close']].max(axis=1)

            # まさかのマイナス価格に備え、data内の全ての数値が0.01以下の場合、0.01に設定します。
            data[data <= 0.01] = 0.01
            # あとなぜか価格は動いてるのにVolumeが0の日があるので、それも1に設定します。
            data['Volume'] = data['Volume'].apply(lambda x: max(x, 1))

            # データをCSVファイルとして保存します。エンコーディングはshift-jisを指定します。
            csv_filename = argument # "WTI原油先物.csv"
            data.to_csv(csv_filename, encoding='shift-jis', index=True)

            print("更新が完了しました.")


    except yf.YahooFinanceError as yfe:
        print(f"Yahoo Financeからのデータ取得中にエラーが発生しました: {yfe}")
    except pd.errors.EmptyDataError:
        print("エラー: CSVファイルが空です。")
    except pd.errors.ParserError:
        print("エラー: CSVファイルの解析中にエラーが発生しました。")
    except Exception as e:
        print(f"予期しないエラーが発生しました: {e}")


# メイン処理呼び出し
if __name__ == "__main__":
    main()

必要なライブラリ

pandas / yfinance

pip install pandas
pip install yfinance

解説

yfinanceライブラリを使ってWTI原油先物データを取得しています。
少し高値と安値がおかしい日があるので修正するようにしているのと
先物価格がマイナスになっていた時期があるもののイザナミでは現状0
01未満の株価は扱えないので0.01に変換する処理が入っています。

作成したCSVをインポートして使う方法

銘柄として読み込んで利用します。相場情報機能で扱うときに便利です。

※この画面は先行版を利用してます
フォーマットの指定
終値と出来高の間に ---(未使用)が入るようにしてください

作成したCSVを環境データで利用する方法

環境データとして読み込んで使う時、前日比や移動平均を使いたい場合はユーザー定義をご利用ください。

環境データ指定例です

お問合せ先

有限会社 ツクヨミ
URL https://www.izanami.jp
Mail support@izanami.jp
🔎イザナミnote内検索

いいなと思ったら応援しよう!