FXの過去データをダウンロードする③ (Dukascopyその2)

テクニカル分析

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": [[取引終了曜日, 時, 分, 取引開始曜日, 時, 分, タイムゾーン], ...]
"DAILY": [[取引終了時, 分, 取引開始時, 分, タイムゾーン], ...]

データの場所

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は以下の例のようになります。

なお、サーバー上のファイルは後日(場合によっては数ヶ月~数年後)何らかの理由で修正されることがあります。ファイルのタイムスタンプ(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
VolumeTickデータのレコード
4バイト整数 4バイト整数 4バイト整数 4バイト整数 4バイト整数 4バイト浮動小数点数
時刻 (秒) Open Close Low High Volume
OHLCデータのレコード

時刻はファイルの開始時刻から経過時間です。時刻の単位は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でダウンロードと読み込むを行う方法を別記事にまとめました。

FXの過去データをダウンロードする④ (Dukascopyその3)
今回はPythonを用いて、DukascopyからFXの過去データ(ヒストリカルデータ)をダウンロードし、読み込んでみます。他の方法については過去の記事も参照してください。 PythonでTickデータをダウンロードして読み込む Dukas...

[広告]FX取引高世界NO1!
【DMM FX】入金

[広告] スプレッドで選ぶならここ!
ゴールデンウェイジャパン(FXTF MT4)

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

テクニカル分析

コメント

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