はじめに
目的
前回は、GMOコインから過去の取引データを取得しました。
今回は、ミリ秒のデータを1分足のOHLCデータ (open, high, low, close) に集計したいと思います。
前提
前回のコードにて、ダウンロードしたCSVを集計対象とします。
集計コード
実行すると、1分足で集計されたOHLCデータがone_min.csvが出力されます。
from logging import getLogger,INFO,StreamHandler,FileHandler
import datetime
import traceback
import pandas as pd
import numpy as np
logger = getLogger(__name__)
logger.setLevel(INFO)
fh = FileHandler('one_min.csv')
logger.addHandler(fh)
            
if __name__ == '__main__':
    try:
        # ダウンロードしたCSVファイルの開始日 - 終了日を指定
        start_datetime = datetime.datetime.strptime("2021-04-01 00:00:00", "%Y-%m-%d %H:%M:%S")
        end_datetime = datetime.datetime.strptime("2021-05-01 00:00:00", "%Y-%m-%d %H:%M:%S")
        
        while start_datetime != end_datetime:
            print("converting :", start_datetime)
            year = str(start_datetime.year)
            month = str(start_datetime.strftime('%m'))
            day = str(start_datetime.strftime('%d'))
            filename = year + month + day + '_BTC_JPY.csv'
            
            # 元データ読み込み
            df = pd.read_csv(filename, names=('symbol', 'side', 'volume', 'price', 'timestamp'), skiprows=1)
            volume_values = df.volume.values
            price_values = df.price.values
            timestamp_values = df.timestamp.values
            
            ohlc = { 'open': '', 'high': '', 'low': '', 'close': '', 'volume': '' }
            current_min = -1
            for i in range(0, len(df)):
                price = float(price_values[i])
                volume = float(volume_values[i])
                trade_datetime = datetime.datetime.strptime(timestamp_values[i], "%Y-%m-%d %H:%M:%S.%f")
                
                if trade_datetime.minute == current_min:
                    ohlc['high'] = max(ohlc['high'], price)
                    ohlc['low'] = min(ohlc['low'], price)
                    ohlc['close'] = price
                    ohlc['volume'] += volume
                else:
                    # CSV 出力
                    if current_min != -1:
                        logger.info("{},{},{},{},{},{}".format(trade_datetime.strftime('%Y-%m-%d %H:%M:00'), ohlc['open'], ohlc['high'], ohlc['low'], ohlc['close'], ohlc['volume']))
                    
                    current_min = trade_datetime.minute
                    ohlc['open'] = price # 始値
                    ohlc['high'] = price # 高値
                    ohlc['low'] = price # 安値
                    ohlc['close'] = price # 終値
                    ohlc['volume'] = volume # 取引量
            
            # 1日加算
            start_datetime = start_datetime + datetime.timedelta(days=1)
    except KeyboardInterrupt:
        print("Stop with Keyboard Interrupt.")
    except Exception as e:
        print(traceback.format_exc())
    finally:
        print("All stopped.")