Sysmetic trading

[AFML] 데이터의 구조(달러바 vs 볼륨바)

quantoasis 2022. 12. 16. 11:07
반응형

 

이번 포스팅에서는 시간바, 볼륨바, 달러바의 통계적 특성을 알아보도록 하겠습니다.

 

AFML에서 2장에서 중요하게 다루는 것은 시계열 데이터를 이벤트 드리븐 형태로 표현하는 것입니다.

 

시간바(timebar)는 아래와 같은 이유 때문에  머신러닝 학습에 좋지 않은 편향을 보일 수 있기 때문입니다.

(1) 거래량이 적을때는 오버샘플링, 거래량이 클 때는 오버샘플링

(2) 계열상관, 이분산성, 수익률의 비정규성을 보임

 

 

우선 1분 단위 삼성전자 데이터로 미리 만들어 놓은  달러바(dollarbar) 볼륨바(volumebar)를 import시켰습니다.

 

dollarbar_20220926.csv
4.18MB
volumebar_20220926.csv
4.24MB

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

columns =['date','time','open','high','low','close','volume','amount']
dollar = pd.read_csv('dollarbar_20220926.csv', 
                 sep=',', names=columns,
                 parse_dates = True, header=None)
volume = pd.read_csv('volumebar_20220926.csv', 
                 sep=',', names=columns,
                 parse_dates = True, header=None)

 

rawdata를 분석하기 쉬운 형식으로 변환하는 전처리를 해주어야 하는데,

 

특히 date가 object형식이고, time이 int형식이기 때문에 이 두 컬럼을 합쳐 datetime이라는 형식으로 변경해야 합니다.

 

 

 

컬럼 내의 데이터를 조건에 따라 바꿔주기 위해 lambda함수를 사용했습니다. date 열과 time열을  datetime이라는 하나의 열로 합치는데 매우 유용하게 쓰였습니다.

 

#time이 3자리인경우 앞에 0을 붙여줌. ex) 900 -> 0900
dollar['time'] =dollar['time'].apply(lambda x: '0'+str(x) if len(str(x))==3 else x)

#time가운데에 :을 붙여줌 ex) 0900 -> 09:00
dollar['time'] =dollar['time'].apply(lambda x: str(x)[:2]+':'+str(x)[-2:])

#date와 datetime의 컬럼을 붙여주면서 뒤에 초를 붙여줌 -> 2018-05-04 09:00:00
cols = ['date', 'time']
dollar['datetime'] =dollar[cols].apply(lambda row: ' '.join(row.values.astype(str))+':00', axis=1)

 

이후 쓸모없어진 date와 time 컬럼을 drop함수를 통해 삭제해주고, 새로 생성된 datetime열을 인덱스로 잡아주었습니다.

 

dollar = dollar.drop(['date','time'],axis=1)
dollar.index =pd.to_datetime(dollar['datetime'])
dollar.index

 

 

생성된 데이터를 주(week)마다 샘플링하여 도식화하면 아래와 같은 그림이 나옵니다. 

 

#resample을 이용하여 1주마다의 데이터 개수 카운트
db_ = dollar['close'].resample('W').count()
vb_ = volume['close'].resample('W').count()

count_df = pd.concat([vb_, db_], axis=1)
count_df.columns = ['volume', 'dollar']
count_df.loc[:, ['volume', 'dollar']].plot(kind = 'bar', figsize=[25, 5])

 

달러바와 볼륨바 사이에 미세한 차이가 있는데요, 눈으로 보기에도 달러바가 균일한 분포를 보입니다.

 

실제 수치로 확인했을때는 달러바가 자기상관계수가 더 낮았고요, 변동성도 낮았습니다.

 

#자기상관
dollar_autocor=count_df['dollar'].autocorr()
volume_autocor=count_df['volume'].autocorr()

print('자기상관 : ',dollar_autocor,volume_autocor)

#변동성
dollar_vol = dollar['close'].resample('W').mean().pct_change().var()
volume_vol = volume['close'].resample('W').mean().pct_change().var()

print('변동성 : ' ,dollar_vol,volume_vol)

 

다음은 얼마나 정규분포에 가까운지를  테스트하는 jarque bera test를 해봤는데요, 

 

jarque bera test는 '데이터의 분포가 정규분포다'를 귀무가설로 두고 진행하는 통계적 방법입니다.

 

따라서, JB값이 크면 (p벨류가 0.05보다 낮으면) 해당 분포는 귀무가설을 기각, 대립 가설을 채택하여 데이터 분포가 정규분포가 아니다 라는 것을 확인할 수 있죠.

 

테스트 결과 달러바, 볼륨바 모두 정규분포는 아닌 것으로 판단됩니다(수익률 분포의 특성이죠). 그러나 볼륨바 보다는 달러바가 좀 더 정규분포에 가까운 것으로 보입니다.

 

from scipy import stats

print('dollar :' ,stats.jarque_bera(dollar['close'].pct_change().dropna())[0],'/ volume :',stats.jarque_bera(volume['close'].pct_change().dropna())[0])

 

통계적으로 안정적인 수익률 분포일수록 당연히 시스템트레이딩이나 머신러닝에 적용하기 좋을 것입니다. 

 

이번 포스팅에서 결론은 다음과 같습니다.

 

달러바는 (볼륨바 보다) 안정적인 빈도수를 보이며, 정규분포에 가깝고, 계열상관도 낮다.

 

읽어주셔서 감사합니다.

 

 

 

 

 

 

Reference.

 

GitHub - boyboi86/AFML: All the answers for exercises from Advances in Financial Machine Learning by Dr Marco Lopez de Parodo.

All the answers for exercises from Advances in Financial Machine Learning by Dr Marco Lopez de Parodo. - GitHub - boyboi86/AFML: All the answers for exercises from Advances in Financial Machine Lea...

github.com

 

반응형