FXのヒストリカルデータをPythonで取得

過去データをPythonでがさっと取得できるところのご紹介です。

いろいろ探したのですが、「日足しかない」「直近データしかない」など微妙なサイトが多くてなかなかいい塩梅のところが出てきませんでしたが、「HistData.com」というところが専用のPythonライブラリも用意してくれていて一番楽ちんにデータ取得できました。

https://www.histdata.com/

まず、PIPインストールしましょう。

pip3 install histdata

次はPythonコーディング。

まず、ZIPファイルをガサッと取得する部分です。ちなみに、去年までのデータは年間でまとめられているらしく、去年までのデータと今年のデータの取得方法がちょっと違います(根本は一緒)。

import pandas as pd

# HistData.Com専用ライブラリ
from histdata     import download_hist_data as dl
from histdata.api import Platform as P, TimeFrame as TF

#解凍用
import shutil 

pair = 'eurjpy'
y_first = 2018
y_last  = 2022

# ダウンロードしたファイル名を格納
fnlist = []
fn = ''

#--- メモ ---------------------------#
#   - 去年までのデータは年間でまとめられていらしい

#--- 去年までのデータ(「month=None」で取得) -------#
for y in range(y_first, y_last):
    print(y)
    try:
        #ZIPファイルのダウンロード
        fn = dl(
                    year=y
                  , month=None
                  , pair=pair
                  , platform=P.GENERIC_ASCII
                  , time_frame=TF.ONE_MINUTE
        )
        fnlist.append(fn)

        #解凍
        shutil.unpack_archive(fn, 'dir_out')
    except:
        print('error!')

#--- 今年の分を月ごとに取得
y = y_last
for m in range(1,13):
    print(y, m)
    try:
        fn = dl(
                    year=y
                  , month=m
                  , pair=pair
                  , platform=P.GENERIC_ASCII
                  , time_frame=TF.ONE_MINUTE
        )
        fnlist.append(fn)

        shutil.unpack_archive(fn, 'dir_out')
    except:
        print('error!')

次に形の成形。データのちょっとした注意点は以下の通りです。

  • 日時は「EST WITHOUT Day Light Savings」らしい
  • Tickか1分しかない(5分足とかない)

詳しくは以下のサイトをご参照。

これを踏まえて以下のようにコーディングしました。

#--- メモ ---------------------------#
#   - 日時は「EST WITHOUT Day Light Savings」らしい
#   - Tickか1分しかない(5分足とかない)

# ひな型(こいつに足していく)
data = pd.DataFrame([['', 0,0,0,0,0]])[:0]

for fn in fnlist :
    # 解凍後のファイル名に微修正
    fn = 'dir_out/' + fn[2:]
    fn = fn[:-4] + '.csv'
    print(fn)
    tmp_data = pd.read_csv(fn, header=None, delimiter=';')
    data = pd.concat([data, tmp_data])

# 成形        
data.columns = ['date', 'Open', 'High', 'Low', 'Close', 'dmy']
data = data.drop(columns=['dmy'])

data['date'] = pd.to_datetime(data.date)
data.date = data.date.dt.tz_localize('EST') #サマータイムなしのESTらしい

data = data.set_index('date')

# 扱いやすいよう、タイムゾーンをUTCにしておく
data = data.tz_convert('utc')

タイムゾーンが少々厄介でしたが、以下のサイトが非常にわかりやすく助かりました。

https://note.nkmk.me/python-pandas-tz-convert-tz-localize/
https://note.nkmk.me/python-datetime-pytz-timezone/

以上です。ご覧いただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA