FXの過去データ(ヒストリカルデータ)をDukascopyから無料でダウンロードする方法を解説します。今回はBirt’s PHP Scriptを使ってまとめてダウンロードしてみます。ダウンロードと変換プログラムを自力で作る場合の参考情報については別記事に書きました。
Dukascopyについて
Dukascopyはパソコンやモバイル上で外国通貨取引や、貴金属取引、バイナリー、ネットバンキングなどのサービスを提供しているスイスのオンライン銀行です。FX、コモディティ、CFDの過去データを無料で提供しています。webからのダウンロードにはアカウントの作成が必要ですが、Birt’s PHP Scriptなどのスクリプトを使用して、データを直接ダウンロードする場合にはアカウントは不要です。
- 通貨ペア: 約60種類 (他にコモディティ、指数、世界各国の株式市場の主要銘柄、仮想通貨等も提供)
- 時間足: Tick・秒・分・時・日・週・月
- 期間: データの種類により異なる(主要通貨ペアのTickデータは2003年5月~現在)
- 更新頻度: データの種類により異なる(Tickデータは約1時間ごとに更新)
- タイムゾーン: GMT (webからのダウンロードの場合は変更可)
Birt’s PHP Scriptで一括ダウンロードする
大量のファイルを1つずつ手動でダウンロードしていくのは大変です。PHPを使える環境では、Birt’s PHP Scriptを使うことで、Tickデータを一括ダウンロードし、csv形式に変換することができます。
Birt’s PHP Script はもともとBirt氏により開発・公開されたものでしたが、2017年ごろに公開が終了しました。再配布可能なライセンス(GPL3)であったことから、現在でも別のユーザーにより改良・公開が行われています。
Git を使える場合は以下のようにしてファイル一式を入手できます。
git clone https://github.com/FX31337/Birt-Dukascopy.git
また、Gitを使えない場合は、”Code” をクリックして、”Download Zip” を選択することで、ファイル一式をダウンロードできます。
ファイル名 | 説明 |
LICENSE, COPYING | ライセンスファイル |
download.php | ファイルをダウンロードするプログラム |
process.php | ダウンロードされたバイナリファイルをcsvに変換するプログラム |
process.bat | process.php を実行するためのバッチファイル (Windows) |
process.sh | process.php を実行するためのシェルスクリプト (Linux・macなど) |
functions.php, symbols.php | download.php と process.php の実行に必要なコード |
Birt’s PHP Script を使うには以下のものが必要になります。また、適切にパスを通しておく必要があります。
PHP | cURL と mbstring モジュールが必要です。php -m の結果に curl とmbstring が含まれていればOKです。 |
cURL | download.php を実行する際に必要になります。 |
xz または lzma コマンド (Linux・macなど) | Linux・macなどでprocess.php を実行する際に必要になります。 |
7-Zip (Windows) | Windowsでprocess.php を実行する際に必要になるのは7-Zip Extra配布ファイルに含まれる 7za.exe ですが、通常版の 7-Zip に含まれる 7z.exe でも動作します。7z.exe を使う場合、functions.php で 7za と書かれている場所(126行と128行の2箇所)を 7z に変更する必要があります。 |
次に、download.php を編集します。以下の部分で、ダウンロードするデータのシンボルを設定します。利用可能なシンボルの一覧は symbols.php
を参照してください。
// 変更前
$download = [
'ESPIDXEUR',
'DEUIDXEUR',
'AUDUSD',
'CHFJPY',
'EURCHF',
'EURGBP',
'EURJPY',
'EURUSD',
'GBPCHF',
'GBPJPY',
'GBPUSD',
'USDCAD',
'USDCHF',
'USDJPY',
'XAUUSD',
];
例えば、USDJPY のみ必要な場合は以下のように変更します。//
から始まる行はコメントで、無視されます。
// 変更後
$download = [
// 'ESPIDXEUR',
// 'DEUIDXEUR',
// 'AUDUSD',
// 'CHFJPY',
// 'EURCHF',
// 'EURGBP',
// 'EURJPY',
// 'EURUSD',
// 'GBPCHF',
// 'GBPJPY',
// 'GBPUSD',
// 'USDCAD',
// 'USDCHF',
'USDJPY',
// 'XAUUSD',
];
デフォルトでは、ダウンロード可能なすべての期間のデータがダウンロードされます。例えばUSDJPY の場合は 2003年5月4日から現在までのデータがダウンロードされるので、ダウンロードに相当な時間を要します。
期間を変更する場合、次のようにしてdownload.php を編集します。期間の終了日時は、1時間後の時刻で指定します(例: 2014年7月8日12UTC以前のデータを取得する場合は'2014-07-08 13:00:00'
とする)。
// 期間の開始日時を変更する
// 変更前
while (1970 < $currentDateTime->format('Y'))
// 変更後 (2014年7月7日12UTC以降のデータを取得する場合)
$endDateTime = new DateTime('2014-07-07 12:00:00', new DateTimeZone('UTC'));
while ($endDateTime < $currentDateTime)
// 期間の終了日時を変更する
// 変更前
$currentDateTime = new DateTime('now', new DateTimeZone('UTC'));
// 変更後 (2014年7月8日12UTC以前のデータを取得する場合)
$currentDateTime = new DateTime('2014-07-08 13:00:00', new DateTimeZone('UTC'));
また、現在はダウンロードファイルの置かれているURIが変更されているので、次のように download.php を編集します。以前のURIでもまだアクセスできるので、編集は必須ではありませんが、変更するほうがより速くなります。
// 変更前
$dukascopyUrl = 'http://www.dukascopy.com/datafeed/' . $relativePath;
// 変更後
$dukascopyUrl = 'http://datafeed.dukascopy.com/datafeed/' . $relativePath;
これで、データをダウンロードできます!ダウンロードには相当な時間がかかります。2回目の実行からは、追加されたファイルのみダウンロードされるので、比較的短時間で済みます。
php -f download.php
# [20xx-xx-xx 12:48:17] Downloading USDJPY...
# [20xx-xx-xx 12:48:17] http://datafeed.dukascopy.com/datafeed/USDJPY/20xx/xx/xx/10h_ticks.bi5 downloaded xxxxx bytes
# [20xx-xx-xx 12:48:18] http://datafeed.dukascopy.com/datafeed/USDJPY/20xx/xx/xx/09h_ticks.bi5 downloaded xxxxx bytes
# [20xx-xx-xx 12:48:19] http://datafeed.dukascopy.com/datafeed/USDJPY/20xx/xx/xx/08h_ticks.bi5 downloaded xxxxx bytes
# (以下略)
ダウンロードしたデータは、lzma で圧縮されたバイナリファイル(拡張子 bi5)で、<通貨名>/<年(4桁)>/<月(2桁)>/<日(2桁)>/<時(2桁)>_h_ticks.bi5
という名前になります (例: EURUSD/2008/00/01/19h_ticks.bi5
)。注意点として、月は0から始まります。つまり1月が00、2月が01のようになります。
process.php
を使うことで csv ファイルに変換できます。2020年1月から12月までのUSDJPYのデータをcsvファイルに変換する例です。2021-01 は 「2021年1月1日0:00」を意味します。
php -f process.php USDJPY 2020-01 2021-01 USDJPY2020.csv
process.php
が出力する csv ファイルの内容は次のようになっています。
2020.01.01 22:00:00.219,108.73,108.786,0.75,0.75 2020.01.01 22:00:00.433,108.73,108.79,0.75,0.75 2020.01.01 22:00:23.533,108.729,108.79,0.75,0.75 2020.01.01 22:00:28.663,108.728,108.79,1.31,0.75 2020.01.01 22:00:41.516,108.728,108.791,0.56,0.75 2020.01.01 22:00:46.671,108.728,108.79,0.56,0.75 2020.01.01 22:01:02.159,108.728,108.786,0.56,0.75
それぞれの列の意味は次のようになります。
日時,BID,ASK,BID Volume,ASK Volume
日時はミリ秒単位、Volumeは100万単位です。
他のスクリプト
10年前はDukascopy のデータをダウンロードするスクリプトとしては Birt’s PHP Scriptくらいしか選択肢がなかったのですが、近年は他にも様々な便利なダウンロードスクリプトがあります。いくつか紹介します。
node.jsを使った高機能なダウンロードツール。データをCSVとJSON形式で出力できます。Tickデータ以外にも、分足~月足データをダウンロード・生成することができます。
ダウンロードツールがPythonとPHPでそれぞれ用意されています。HST・FXT形式とCSVを相互変換するスクリプトもあります。
Dukascopyのサーバーから各種データ(マーケットデータ、過去データ、Order bookなど)をJForex APIを用いて取得し、REST/WebSocket で提供します。
ダウンロードと変換プログラムを自力で作る場合の参考情報については別記事に書きました。
HistData.com からダウンロードする方法も別記事に書きました。。
コメント