モーリーのメモ

アプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。

モーリーのメモ

FXのヒストリカルデータを無料で手に入れてHSTからCSVに変換する!:Python

【 今回やること! 】

  • FXの1分足のヒストリカルデータ(為替の過去の値動きのデータ)をCSV形式で入手します。
    • Google Colaboratory』を使用します。
    • ヒストリカルデータをダウンロード→解凍→CSVに変換するプログラムを実行します。
    • Google ドライブ』から、csvファイルをダウンロードします。
 
 ヒストリカルデータは、FXDDから入手します。ZIP圧縮されたHSTファイルをダウンロード出来ます。無料で登録も必要ありません。
 
 HSTファイルはMT4(MetaTrader4)で利用できますが、扱いやすいようにCSVに変換します。
 『ダウンロード→解凍→CSVに変換』する処理は『Google Colaboratory』で行います。
 
 Google Colaboratory』は、サーバー上でPythonのプログラムを実行できる環境です。
 Googleアカウントがあれば(Gmail等使っていれば)、無料ですぐに利用出来ます。
 手元のPCの性能が低くても、サーバー側で処理されるので高速です。
 
 ただし、制約があります。
 
 『Google Colaboratory』を使うと、利用者には実行環境が割り当てられます。利用者は『ノートブック』というエディタを通じて実行環境を操作しますが、この『ノートブック』がアクティブでない状態が90分間続くと実行環境がリセットされます。また、使い続けていても12時間経つとリセットされます。
 
 リセットされると、実行環境に追加したファイルがすべて削除されます。
 なので、使用するデータや成果物は『Google ドライブ』に置くようにします。
 
 Google ドライブ』に置いたデータは消えません。自分のPCにダウンロードすることも出来ます。
 
 前置きが長くなりましたが、作業はサクッと出来ます。
 それでは作業を開始します!

使用環境

 私が使用している環境です。

Google Colaboratory』を利用開始する

 『Google Colaboratory』のサイトに行って『ノートブック』を作成します。
 『ノートブック』はブラウザ上で、文書とプログラムの作成、実行、実行結果の表示ができるファイルです。『ノートブック』の内容は、実行環境がリセットされても残ります。

  1. 下記のサイト『Colaboratory へようこそ 』を開きます。
    colab.research.google.com
  2. 『ログイン』ボタンをクリックします。
    f:id:mmorley:20191004100241p:plain
  3. Googleアカウントのログイン画面が表示されるのでログインします。
  4. 『ファイル』→『Python 3 の新しいノートブック』をクリックします
    f:id:mmorley:20191004095227p:plain
     
    『Colaboratory へようこそ 』のページは閉じて構いません。

Google ドライブ』をマウントする

 『Google Colaboratory』から『Google ドライブ』のファイルにアクセスできるようにします。
 『Google ドライブ』のマウントは、実行環境がリセットされると解除されます。

  1. 下図の赤枠の部分をクリックします。
    f:id:mmorley:20191004112725p:plain
  2. 『ファイル』をクリックします。
    f:id:mmorley:20191004113014p:plain
  3. 少し待つと、下図のように表示されるので、『ドライブをマウント』をクリックします。
    f:id:mmorley:20191005090634p:plain
  4. 『セル(と呼びます)』が追加されるので『▶(セルを実行)』をクリックします。
    青いメッセージ無視して押せます。
    f:id:mmorley:20191005091720p:plain
  5. 長いURLをクリックします。
    f:id:mmorley:20191005092216p:plain
  6. Googleアカウントのログイン画面が表示されるのでログインします。
  7. 『許可』をクリックします。
    f:id:mmorley:20191005092817p:plain
  8. 下図の赤枠の部分をクリックします。
    認証コードがコピーされます。
    f:id:mmorley:20191005093226p:plain
  9. ノートブックに戻り、認証コードを貼り付けて『Enter』キーを押します。
    f:id:mmorley:20191005093610p:plain
    成功すると、『Mounted at /content/drive』と表示されます。
    f:id:mmorley:20191005093854p:plain

ヒストリカルデータをダウンロード→解凍→CSVに変換する

プログラムコードを貼り付ける

  1. 『セル』の枠の下部中央にマウスカーソルを持っていくと、下図のように表示されるので、『コード』をクリックして『セル』を追加します。(上側にも追加できます。)
    f:id:mmorley:20191005095745p:plain
    『セル』には、プログラムコードの編集・実行を行う『コードセル』と、文書を書く『テキストセル』があります。
  2. 下記のコードをコピーして、『セル』にを貼り付けます。
     『USD/JPY』と『EUR/JPY』の通貨ペアのCSVファイルを入手するプログラムです。通貨ペアの変更方法は後述します。
     CSVファイルは『Google ドライブ』の『hst_(日付、例:hst_20191009)』フォルダに保存します。

    %%time 
    # ↑セルの処理時間を計算 %%timeはセルの最初に単独で書く
    
    import os # ディレクトリ作成、パス結合、ファイル削除
    import datetime # 日付取得
    import requests # ダウンロード処理
    import zipfile # zip解凍
    import numpy as np # 数値データ高速処理
    import pandas as pd # データ構造化
    
    # 取得・作成したデータを保存するディレクトリのパス(Google Drive)
    hst_dir = '/content/drive/My Drive/hst_' + datetime.datetime.today().strftime('%Y%m%d')
    if not os.path.exists(hst_dir): # ディレクトリが無い場合
      os.mkdir(hst_dir) # ディレクトリを作成
    
    # 取得する通貨ペアを指定
    list = ['USDJPY', 'EURJPY']
    for item in list:
      print(item)
      zip_url = 'http://tools.fxdd.com/tools/M1Data/' + item + '.zip' # ダウンロード元url
      zip_file = os.path.join(hst_dir, item + '.zip') # 保存先ファイル名
      req = requests.get(zip_url)
      with open(zip_file, 'wb') as f:
        f.write(req.content)
      print(' :ダウンロード完了')
      
      # zipファイルを解凍する
      with zipfile.ZipFile(zip_file, 'r') as f: # 読み込みモードで開く
        f.extractall(hst_dir) # zip展開 
        print(' :zip解凍完了')
        
      # hstファイルをcsvファイルに保存する
      with open(os.path.join(hst_dir, item + '.hst'), 'rb') as f:
        # hstのヘッダ(148byte)からバージョン(先頭の4byte)を取得
        # dtype='i4':符号あり32ビット整数型
        ver = np.frombuffer(buffer=f.read(148)[:4], dtype='i4') 
        if ver == 400: # バージョンが400の場合
          # 1行のデータの並びを定義
          dtype = [
            ('DateTime', 'u4'),  # 'u4':符号なし32ビット整数型
            ('Open', 'f8'),      # 'f8':符号あり64ビット整数型
            ('Low', 'f8'),       #
            ('High', 'f8'),      #
            ('Close', 'f8'),     #
            ('Volume', 'f8')     #
          ]
        elif ver == 401: # バージョンが401の場合
          # 1行のデータの並びを定義
          dtype = [
            ('DateTime', 'u8'),  # 'u8':符号なし32ビット整数型
            ('Open', 'f8'),      # 'f8':符号あり64ビット整数型
            ('Low', 'f8'),       #
            ('High', 'f8'),      #
            ('Close', 'f8'),     #
            ('Volume', 'f8')     #
            ('Spread', 'i4'),    # 'i4':符号あり32ビット整数型
            ('RealVolume', 'i8') #
          ]
        # バイナリデータをPandasのデータフレームに変換する
        df = pd.DataFrame(np.frombuffer(buffer=f.read(), dtype=dtype))
        # DateTime列を日付データに変換してインデックスに設定して、変換前の列を削除する
        df = df.set_index(pd.to_datetime(df['DateTime'], unit='s')).drop('DateTime', axis=1) 
    
        display(df.head(2)) # データの先頭2行を書き出す
        display(df.tail(2)) # データの末尾2行を書き出す
        
        #csvファイルに保存
        df.to_csv(os.path.join(hst_dir, item + '.csv'))
        print(' :csvに変換完了')
        
      # ファイルを削除
      os.remove(zip_file) # zipファイル削除
      os.remove(os.path.join(hst_dir, item + '.hst')) # hstファイル削除
      print(' :zip、hst削除完了')
    

プログラムを実行する

  1. プログラムコードを貼り付けた『セル』の『▶(セルを実行)』をクリックします。
    実行中は『▶』が『■(実行を中断)』に変わってグルグルします。
    プログラムが終わると『▶』に戻ります。エラーで中断すると『▶』ボタンが赤くなります。
    f:id:mmorley:20191009112231p:plain
    プログラムの実行時間は1分20秒前後です。
    『セル』の下に実行状況が出力されます。
    f:id:mmorley:20191009220647p:plain
    通貨ペアごとに、ヒストリカルデータの先頭と末尾を2行ずつ表示します。
    最後の『Wall time』が実行時間です。

Google ドライブ』からCSVファイルを入手する

 プログラムが無事実行完了すると、CSVファイルが『Google ドライブ』に保存されています。

  1. Google ドライブ』のサイトを開きます。
    drive.google.com
  2. 『マイドライブ』の『hst_(日付、例:hst_20191009)』フォルダを開きます。
    f:id:mmorley:20191010114524p:plain
  3. CSVファイルを右クリック→『ダウンロード』をクリックします。
    f:id:mmorley:20191010132825p:plain
  4. 『エラーを無視してダウンロード』をクリックします。
    f:id:mmorley:20191010134331p:plain
    CSVファイルがダウンロードされます。

ヒストリカルデータの入手元サイト

 ヒストリカルデータは下記のサイトで公開されているデータです。

 下記の通貨ペアのデータがあります。
    f:id:mmorley:20191010133305p:plain

入手する通貨ペアの変更方法

  1. プログラムコードの下記の部分(17行目)のlistの通貨ペアを変更します。
    ※通貨名の間にスラッシュを入れないでください。
    ※通貨ペア名ごとに『’(シングルコーテーション)』で囲みます。
    ※通貨ペア名の間は『,(カンマ)』で区切ります。

    # 取得する通貨ペアを指定
    list = ['USDJPY', 'EURJPY']
    

    入手できる通貨ペアは、入手元のサイトのリストにあるものです。
    listに書いてるのはダウンロードのURLのzipの前の部分です。
    変更例

    • 1つだけ入手する場合

      # 取得する通貨ペアを指定
      list = ['AUDJPY']
      

    • 入手する通貨を増やす場合
      4つにした場合、実行時間は3分かかりました。

      # 取得する通貨ペアを指定
      list = ['USDJPY', 'EURJPY', 'EURUSD', 'GBPJPY']
      

プログラム実行時にエラーが起きる場合

 下記のことを確認または実行してください。

  • 通貨ペアの文字が間違っていないか確認してください。
  • Google ドライブ』のマウント出来ているか確認してください。
    再度『Google ドライブ』のマウントを実行します。
    マウント済みの場合は『Drive already mounted~』と表示されます。
  • 入手元のサイトを開いて、直接ダウンロードできるか試してください。
    何が原因だったかわかりませんが、そもそもサイトからダウンロード出来ないケースがありました。
  • Google Colaboratory』のセッションを作り直します。
    1. 『ランタイム』→『セッションの管理』をクリックします。
      f:id:mmorley:20191010141445p:plain
    2. 終了をクリックします。
      f:id:mmorley:20191010141626p:plain
    3. ドライブのマウントからやり直してください。

作成したノートブックを開く

 作成したノートブックは、『Google ドライブ』の『マイドライブ』の『Colab Notebooks』フォルダ内にあります。
 下記の作業をしておくと、スムーズに『ノートブック』を開くことができます。

  1. 『歯車マーク』→『設定』をクリックします。
    f:id:mmorley:20191010142820p:plain
  2. 『アプリの管理』の『デフォルトで使用』にチェックを入れます。
    f:id:mmorley:20191010143215p:plain
  3. 『完了』をクリックします。
 
 今回は、以上です。