FXの過去データ(ヒストリカルデータ)をHistData.comから無料でダウンロードする方法を解説します。
HistData.comについて
HistData.comはFXヒストリカルデータを提供するサイトです。登録不要で無料です。有料オプションでFTP/SFTPでダウンロードするサービスもあります。
- 通貨ペア: 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の過去データをダウンロードする方法を別記事に書きました。
コメント