FXの過去データをダウンロードする① (HistData.com)

Python

FXの過去データ(ヒストリカルデータ)をHistData.comから無料でダウンロードする方法を解説します。

HistData.comについて

HistData.comはFXヒストリカルデータを提供するサイトです。登録不要で無料です。有料オプションでFTP/SFTPでダウンロードするサービスもあります。

HistData.com – Free Forex Historical Data
  • 通貨ペア: 66種類 (先物、商品指数等を含む)
    EUR/USD, EUR/CHF, EUR/GBP, EUR/JPY, EUR/AUD, USD/CAD, USD/CHF, USD/JPY, USD/MXN, GBP/CHF, GBP/JPY, GBP/USD, AUD/JPY, AUD/USD, CHF/JPY, NZD/JPY, NZD/USD, XAU/USD, EUR/CAD, AUD/CAD, CAD/JPY, EUR/NZD, GRX/EUR, NZD/CAD, SGD/JPY, USD/HKD, USD/NOK, USD/TRY, XAU/AUD, AUD/CHF, AUX/AUD, EUR/HUF, EUR/PLN, FRX/EUR, HKX/HKD, NZD/CHF, SPX/USD, USD/HUF, USD/PLN, USD/ZAR, XAU/CHF, ZAR/JPY, BCO/USD, ETX/EUR, EUR/CZK, EUR/SEK, GBP/AUD, GBP/NZD, JPX/JPY, UDX/USD, USD/CZK, USD/SEK, WTI/USD, XAU/EUR, AUD/NZD, CAD/CHF, EUR/DKK, EUR/NOK, EUR/TRY, GBP/CAD, NSX/USD, UKX/GBP, USD/DKK, USD/SGD, XAG/USD, XAU/GBP,
  • 時間足: 1分・Tick
  • 期間: 2000年~ (通貨ペアにより異なる)
  • 更新頻度: 月3回程度
  • データのタイムゾーン: 東部標準時 (EST)で夏時間の調整は行われていません。つまり、ニューヨークのローカルタイムそのままの値で、冬季はUTC-5 (アメリカ東部標準時 EST)、夏季はUTC-4 (アメリカ東部夏時間 EDT)となります。
  • 2023年8月現在一部のデータはダウンロードできません。具体的には XAU/AUD, XAU/CHF, XAU/EUR, XAU/GBP については2019年以降、ETX/EURについては2020年以降のデータはダウンロードできないようです。(ダウンロードページでトークンが空になっている)

Pythonを使った一括ダウンロード

HistData.comの無料サービスではwebからデータをダウンロードすることになりますが、ファイルを1つずつ手動でダウンロードしていくのは大変です。一般的な一括ダウンロードツールではうまくダウンロードできません。

まず、Pythonのhistdataというモジュールを使って、一括ダウンロードする方法を紹介します。

histdataはpipでインストールできます。

pip install histdata

Pythonでは次のコードで簡単にダウンロードできます。

from histdata import download_hist_data as dl
from histdata.api import Platform as P, TimeFrame as TF

# 2020年1月のUSD/JPYのTICKデータをCSV形式でダウンロードする
dl(year='2020', month='1', pair='usdjpy', platform=P.GENERIC_ASCII, time_frame=TF.TICK_DATA)

# 2015年(1年分)のUSD/JPY 1分足データをCSV形式でダウンロードする
dl(year='2015', month=None, pair='usdjpy', platform=P.GENERIC_ASCII, time_frame=TF.ONE_MINUTE)

yearで年、monthで月、pairで通貨ペアを指定します。昨年以前の1分足データをダウンロードする際にはmonthにはNoneを指定します。

platformでダウンロードするデータの形式を指定します。

  • platform=P.GENERIC_ASCII GENERIC ASCII (CSV) (1分足・TICK)
  • platform=P.EXCEL Excel (1分足)
  • platform=P.META_TRADER MetaTrader 4 / MetaTrader 5 (1分足)
  • platform=P.NINJA_TRADER NinJaTrader (1分足・1秒足)
  • platform=P.META_STOCK MetaStock (1分足)

time_frameで時間足を指定します。

  • time_frame=TF.ONE_MINUTE 1分足
  • time_frame=TF.TICK_DATA TICK (platform=P.GENERIC_ASCII としたときのみ有効)
  • time_frame=TF.TICK_DATA_BID 1秒足 (BID) (platform=P.NINJA_TRADER としたときのみ有効)
  • time_frame=TF.TICK_DATA_ASK 1秒足 (ASK) (platform=P.NINJA_TRADER としたときのみ有効)
  • time_frame=TF.TICK_DATA_LAST 1秒足 (LAST) (platform=P.NINJA_TRADER としたときのみ有効)

ダウンロードしたデータはZIP形式で圧縮されています。この中に、CSV形式のデータファイルと、データギャップが記されたテキストファイルが含まれています。

GENERIC ASCII (CSV)形式で1分足データをダウンロードした場合、ファイル内容は次のようになります。

20210103 174100;0.979650;0.979700;0.979590;0.979600;0
20210103 174200;0.979680;0.979690;0.979590;0.979600;0
20210103 174300;0.979610;0.979720;0.979610;0.979660;0
20210103 174400;0.979660;0.979660;0.979580;0.979590;0
20210103 174500;0.979590;0.979680;0.979580;0.979680;0

それぞれの列の意味は次のようになります。

日時;始値(BID);高値(BID);安値(BID);終値(BID);出来高(通常は0)

GENERIC ASCII (CSV)形式でTICKデータをダウンロードした場合、ファイル内容は次のようになります。

20200202 170001871,108.416000,108.487000,0
20200202 170001972,108.405000,108.487000,0
20200202 170002107,108.406000,108.486000,0
20200202 170002158,108.406000,108.495000,0
20200202 170002283,108.389000,108.494000,0

それぞれの列の意味は次のようになります。

日時(ミリ秒単位),BID,ASK,出来高(通常は0)

同梱されているテキストファイル(拡張子TXT)には、データギャップの情報が含まれています。ただし、データの欠損の他にも、単にその間取引がなかっただけだったり、取引停止時間帯という場合もあるので注意が必要です。

hidtdataモジュール以外の方法でダウンロードする

前述のとおり、一般的な一括ダウンロードツールを使ってもhidstdata.com からはダウンロードできません。http://www.histdata.com/download-free-forex-data/ から目的のデータのダウンロードページに移動し、ダウンロードページのHTMLソースを見ると次のようになっています。

<!--  https://www.histdata.com/download-free-forex-historical-data/?/ascii/1-minute-bar-quotes/eurusd/2022 より -->
<form id="file_down" name="file_down" target="nullDisplay" method="POST" action="/get.php">
	<input type="hidden" name="tk" id="tk" value="bb2df34e5bf31dcb1f87993de15be15b" />
	<input type="hidden" name="date" id="date" value="2022" />
	<input type="hidden" name="datemonth" id="datemonth" value="2022" />
	<input type="hidden" name="platform" id="platform" value="ASCII" />
	<input type="hidden" name="timeframe" id="timeframe" value="M1" />
	<input type="hidden" name="fxpair" id="fxpair" value="EURUSD" />
</form>

ダウンロードするためには、データごとに固有のトークンを含むPOSTメソッドを送信する必要があります。POSTメソッドで送信が必要なキーと値は次の通りです。

キー値の説明値の例
tkデータごとに固有のトークン (ファイルのMD5ハッシュ値がトークンとして使われている)bb2df34e5bf31dcb1f87993de15be15b
date年(yyyy)2022
datemonth年月(yyyymm) または 年(yyyy)月単位のデータ(1分足・1秒足・Tick)の場合 202201, 年単位のデータ(1分足)の場合 2022
platformデータの形式ASCII (CSV), XLSX (Excel), MT (MetaTrader), MS (MetaStock), NT (NinJaTrader) のいずれか
timeframe時間足M1 (1分足), T (Tick; ASCIIのみ), T_LAST (1秒足; NinJaTraderのみ), T_BID (1秒足; NinJaTraderのみ), T_ASK (1秒足; NinJaTraderのみ)
fxpairデータの種類(大文字)EURUSD

トークンを得るためにはダウンロードページをパースして、id 属性が tk となっている input 要素の値を抽出する必要がありますが、value="([0-9a-f]{32})" のような適当な正規表現を用いた抽出でも多くの場合は十分です。また、HTTP referer もチェックされるため、referer にはダウンロードページのURI (例: https://www.histdata.com/download-free-forex-historical-data/?/ascii/1-minute-bar-quotes/eurusd/2022)をセットする必要があります。

以下は、bash上でwgetを用いてデータを取得する例です。GNU版grep または pcre2grep も用いてます。

downloadpage='https://www.histdata.com/download-free-forex-historical-data/?/ascii/1-minute-bar-quotes/eurusd/2000'

# トークンを取得する
tk=$(wget ${downloadpage} -O - | grep -Pom 1 '(?<=value=")[0-9a-f]{32}(?=")')
# BSD 系 OS などで gnu grep がない場合は pcre2grep を用いる
# tk=$(wget ${downloadpage} -O - | pcre2grep -o1 -m1 'value="([0-9a-f]{32})"')

echo ${tk}
# 216a804365eccace285d20afed7acefe

# データをダウンロードする
wget --post-data="tk=${tk}&date=2000&datemonth=2000&platform=ASCII&timeframe=M1&fxpair=EURUSD" https://www.histdata.com/get.php --referer=${downloadpage} --content-disposition

# ダウンロードされたファイルのMD5ハッシュ値はトークンと一致する
md5sum HISTDATA_COM_ASCII_EURUSD_M12000.zip
# 216a804365eccace285d20afed7acefe  HISTDATA_COM_ASCII_EURUSD_M12000.zip

ファイルのMD5ハッシュ値はトークンと一致するはずです。つまり、ファイルのMD5値とダウンロードページに埋め込まれたトークンが異なっている場合には、ダウンロード時にファイルが破損したか、ダウンロード後にサーバー上のファイルが更新されたことを意味します。hidstdata.com のダウンロードサーバーはLast-Modified レスポンスヘッダーを返さないため、トークンの比較はファイル更新の確認に有用です。

DukascopyからFXの過去データをダウンロードする方法を別記事に書きました。

本サイトの内容は、投資の勧誘を目的としたものではなく、本サイト内の情報に基づいて行った取引の損失について、本サイトは一切の責を負いかねます。当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。免責事項もご覧ください。

Pythonテクニカル分析

コメント

タイトルとURLをコピーしました