FXの過去データ(ヒストリカルデータ)をDukascopyから無料でダウンロードする方法を解説します。前回はスクリプトを使ってダウンロードしましたが、今回はダウンロードと変換プログラムを自力で作る場合の参考情報を書きます。
メタデータを得る
まず、データの名前、提供期間、価格の単位などのデータに関する情報(メタデータ)を知る必要があります。メタデータは JSONP (JSONに関数呼び出しコードを付加) で提供されています。ダウンロード時には refererを設定する必要があります。例えば wgetの場合、次のようにします。
wget 'https://freeserv.dukascopy.com/2.0/index.php?path=common%2Finstruments' --referer=https://freeserv.dukascopy.com/ -O instruments.json
得られたJSONPの一部を整形した例です。
(略)
"USD\/JPY": {
"title": "USD\/JPY",
"special": false,
"name": "USD\/JPY",
"description": "US Dollar vs Japanese Yen",
"historical_filename": "USDJPY",
"pipValue": 0.01,
"base_currency": "USD",
"quote_currency": "JPY",
"commodities_per_contract": "1",
"tag_list": [
"CFD_INSTRUMENTS",
"GLOBAL_ACCOUNTS"
],
"history_start_tick": "1174953612380",
"history_start_10sec": "1329075780000",
"history_start_60sec": "1174953600000",
"history_start_60min": "1052067600000",
"history_start_day": "0",
"unit": null,
"market_closed": {
"WEEKLY": [
[
5,
14,
0,
7,
13,
59,
"America\/Los_Angeles"
]
]
}
},
(略)
JSONP (JSON) の整形は jq を使ったり、Visual Studio CodeでShift+Alt+Fを押すなどで行えます。
jq -R 'capture("\\((?<x>.*)\\)[^)]*$").x | fromjson' < instruments.json
データを取得する際に重要な項目は以下の通りです。
historical_filename |
ダウンロード時URIに用いるシンボル名になります。 |
pipValue |
pipの単位を示します。上の例では、1 pip = 0.01 JPY (=1銭) であることを示します |
base_currency, quote_currency |
base_currencyの価格をquote_currencyで示すという意味になります。 |
history_start_* |
最も古い取得可能なデータの日時をミリ秒単位のUnix time で示します。しかし、間違った値が入っているものが多く、特に history_start_day は以前は正しい値が入っていましたが、2023年8月時点では0が入っています。 |
market_closed |
取引停止時間帯を示します。曜日はISO 8601形式(1が月曜、7が日曜)です。"WEEKLY": [[取引終了曜日, 時, 分, 取引開始曜日, 時, 分, タイムゾーン], ...] |
データの場所
Dukascopyのデータは以下のURIに置かれています。
期間/ファイル | URI | |
Tick | 1時間 | http://datafeed.dukascopy.com/datafeed/シンボル/年/月/日/時h_ticks.bi5 |
1分足 | 1日 | http://datafeed.dukascopy.com/datafeed/シンボル/年/月/日/価格タイプ_candles_min_1.bi5 |
1時間足 | 1ヵ月 | http://datafeed.dukascopy.com/datafeed/シンボル/年/月/価格タイプ_candles_hour_1.bi5 |
1日足 | 1年 | http://datafeed.dukascopy.com/datafeed/シンボル/年/価格タイプ_candles_day_1.bi5 |
- シンボル: メタデータの
historical_filename
を用います。例EURUSD, USDJPY, BTCUSD
- 年: 4桁の数字
- 月: 2桁の数字 (00~11) 00が1月、01が2月、…
- 日: 2桁の数字 (01~31)
- 時: 2桁の数字 (00~23)
- 価格タイプ: BID または ASK
実際のURIは以下の例のようになります。
http://datafeed.dukascopy.com/datafeed/EURUSD/2022/03/04/20h_ticks.bi5
http://datafeed.dukascopy.com/datafeed/USDJPY/2022/03/04/BID_candles_min_1.bi5
http://datafeed.dukascopy.com/datafeed/EURJPY/2022/03/BID_candles_hour_1.bi5
http://datafeed.dukascopy.com/datafeed/BTCUSD/2022/ASK_candles_day_1.bi5
なお、サーバー上のファイルは後日(場合によっては数ヶ月~数年後)何らかの理由で修正されることがあります。ファイルのタイムスタンプ(Last-Modified)を保存しておくと、将来更新されたファイルのみをダウンロードする際に便利です。
データの構造
データはlzmaで圧縮されているので展開する必要があります。
lzma -kd -S .bi5 BID_candles_hour_1.bi5
Tickデータは1レコード20バイト、それ以外のOHLCデータは1レコード24バイトの固定長データになっています。バイトオーダーはビッグエンディアンです。
4バイト整数 | 4バイト整数 | 4バイト整数 | 4バイト浮動小数点数 | 4バイト浮動小数点数 |
時刻 (ミリ秒) | ASK | BID | ASK Volume | BID Volume |
4バイト整数 | 4バイト整数 | 4バイト整数 | 4バイト整数 | 4バイト整数 | 4バイト浮動小数点数 |
時刻 (秒) | Open | Close | Low | High | Volume |
時刻はファイルの開始時刻から経過時間です。時刻の単位はTickデータではミリ秒、OHLCデータでは秒です。つまり、01h_ticks.bi5 (1:00:00開始のTickデータ)で時刻の値が67367だった場合には、時刻は 1:01:07.367 となります。
価格の単位は 0.1 pipsです。つまり(pipValue / 10)
倍することで本来の数字になります。例えば、NZDUSD で ASKの生の値が71375だった場合、NZDUSD のpipValueは0.0001なので、NZD (base_currency)の価格をUSD (quote_currency) で表すと 71375 * (0.0001 / 10) = 0.71375 USD になります。
Volume は100万単位です。
Pythonでダウンロードと読み込むを行う方法を別記事にまとめました。
コメント