暗号資産取引履歴csvとUSD/JPY価格データを突き合わせるためにデータ整理したときの方法を備忘録として残しておきます。
実施環境
- Windows10
- Python 3.9.6
- GMOクリック証券のヒストリカルデータを使用
手順概要
1.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