USD / JPY 分足データマージ&整理ツール作成

暗号資産取引履歴csvとUSD/JPY価格データを突き合わせるためにデータ整理したときの方法を備忘録として残しておきます。

実施環境

  • Windows10
  • Python 3.9.6
  • GMOクリック証券のヒストリカルデータを使用

手順概要

1.Pythonインストール

Pythonをダウンロード、インストールする

2.GMOクリック証券のヒストリカルデータダウンロード

GMOクリック証券のヒストリカルデータ (過去データ)をダウンロードする

「FXネオ」⇒「ツール」⇒「ヒストリカルデータ」の順にクリックします。

各月毎に「DL」をクリックしてダウンロードします。

ダウンロードした「USDJPY_202101.zip」 ~「USDJPY_202101.zip」 を解凍し、解凍した日付毎のCSVファイルを任意のワークフォルダ(例:C:\Work\FX_1min_Rate\GMO_FXNeo\USDJPY_2021)にコピーします。

3.Pythonコード作成

以下のPythonコードを作成し、ファイル保存します。

保存先の例:C:\Work\FX_1min_Rate\usdjpy-sgt.py

usdjpy-sgt.py
# coding: UTF-8
import pdb
import pandas as pd
import os
from datetime import datetime as dt
import numpy as np
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN
import platform

# 元データのパス
path = "./GMO_FXNeo/USDJPY_2021"

# 除くフォルダ名(Mac用)
#not_folders = [".DS_Store", ".ipynb_checkpoints"]

# 保存するCSVのパスとファイル名
new_file = "./usdjpy_JST_SGT.csv"

class convert:
    def __init__(self):
        self.df = pd.DataFrame()

    def csv_marge(self, file_path):
        if file_path.endswith('.csv'):
            print(file_path)
            df_temp = pd.read_csv(file_path, encoding="shift_jis")
            df_temp = df_temp.rename(
                columns={
                    '日時': 'date_JST',
                    '始値(BID)': 'open_bid',
                    '高値(BID)': 'high_bid',
                    '安値(BID)': 'low_bid',
                    '終値(BID)': 'close_bid',
                    '始値(ASK)': 'open_ask',
                    '高値(ASK)': 'high_ask',
                    '安値(ASK)': 'low_ask',
                    '終値(ASK)': 'close_ask',
                }
            )
            self.df = pd.concat([self.df, df_temp])

    def search_file(self, file_path):
        for filename in os.listdir(file_path):
            if filename not in not_folders:
                self.csv_marge(file_path + "/" + filename)

ins_conv = convert()

for filename in os.listdir(path):
    file_path = path + "/" + filename

    if os.path.isfile(file_path) == True:
        ins_conv.csv_marge(file_path)

    if os.path.isdir(file_path) == True and filename not in not_folders:
        ins_conv.search_file(file_path)


ins_conv.df = ins_conv.df.sort_values('date_JST')
#行数を確認
print(len(ins_conv.df))
#カラム数を確認
print(len(ins_conv.df.columns))
#次元の確認
print(ins_conv.df.shape)
#カラム数=9(GMOの場合)
if ins_conv.df.shape[1] == 9:
    print("日付の型を「文字列」から「Timestamp」に変換する")
    print(pd.to_datetime(ins_conv.df['date_JST'], format='%Y/%m/%d %H:%M:%S'))
    # 変換結果を新しい列(date_SGT)に追加
    ins_conv.df.insert(1,'date_SGT',pd.to_datetime(ins_conv.df['date_JST'], format='%Y/%m/%d %H:%M:%S'))
    ins_conv.df['date_JST'].update(pd.to_datetime(ins_conv.df['date_JST']).dt.strftime('%m/%d/%Y %H:%M'))
    print("取引履歴csvの日付フォーマットに合わせるため、シンガポール時間にして整形する")
    ins_conv.df['date_SGT'] = ins_conv.df['date_SGT'] - pd.to_timedelta(1,unit='h')
    print(pd.to_datetime(ins_conv.df['date_SGT']).dt.strftime('%m/%d/%Y %H:%M'))
    ins_conv.df['date_SGT'] = pd.to_datetime(ins_conv.df['date_SGT']).dt.strftime('%m/%d/%Y %H:%M')
    # 始値(BID)と始値(ASK)の中間値を新しい列(open_rate)に追加
    ins_conv.df.insert(2,'open_rate',(ins_conv.df['open_bid'] + ins_conv.df['open_ask']) / 2)
    # 終値(BID)と終値(ASK)の中間値を新しい列(close_rate)に追加
    ins_conv.df.insert(3,'close_rate',(ins_conv.df['close_bid'] + ins_conv.df['close_ask']) / 2)
    # 始値と終値の中間値を新しい列(TTM)に追加
    ins_conv.df.insert(2,'TTM',(ins_conv.df['open_rate'] + ins_conv.df['close_rate']) / 2)
    #小数点以下3桁以降は四捨五入する
    ins_conv.df['TTM']=ins_conv.df['TTM'].map(lambda x: float(Decimal(str(x)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)))
    ins_conv.df['open_rate']=ins_conv.df['open_rate'].map(lambda x: float(Decimal(str(x)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)))
    ins_conv.df['close_rate']=ins_conv.df['close_rate'].map(lambda x: float(Decimal(str(x)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)))

ins_conv.df.to_csv(new_file, index=False)

4.Pythonコード実行

作成したPythonコード(usdjpy-sgt.py)をダブルクリックして実行する。
※コマンドプロンプトから実行した例は以下の通り。サンプルは1月と7月(24日まで)のデータのみ。

C:\Work\FX_1min_Rate>usdjpy-sgt.py
./GMO_FXNeo/USDJPY_2021/USDJPY_20210104.csv
./GMO_FXNeo/USDJPY_2021/USDJPY_20210105.csv
./GMO_FXNeo/USDJPY_2021/USDJPY_20210106.csv
:
./GMO_FXNeo/USDJPY_2021/USDJPY_20210721.csv
./GMO_FXNeo/USDJPY_2021/USDJPY_20210722.csv
./GMO_FXNeo/USDJPY_2021/USDJPY_20210723.csv
51660
9
(51660, 9)
日付の型を「文字列」から「Timestamp」に変換する
0      2021-01-04 07:00:00
1      2021-01-04 07:01:00
               ...
1438   2021-07-24 05:58:00
1439   2021-07-24 05:59:00
Name: date_JST, Length: 51660, dtype: datetime64[ns]
取引履歴csvの日付フォーマットに合わせるため、シンガポール時間にして整形する
0       01/04/2021 06:00
1       01/04/2021 06:01
              ...
1438    07/24/2021 04:58
1439    07/24/2021 04:59
Name: date_SGT, Length: 51660, dtype: object

C:\Work\FX_1min_Rate>

出力されたCSVファイルを確認します。

出力先例:C:\Work\FX_1min_Rate\usdjpy_JST_SGT.csv

参考サイト

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