이상치를 제거 하려면 어떻게 해야 할까요?
알고리즘 트레이딩을 하다보면 사람의 눈으로는 바로 인식할 수 있는 비정상적인 형태를 컴퓨터 언어로 정량적으로 인식할 수 있는 방법을 연구하고 구현해야 합니다.
예를 들면 아래와 같은 차트에서 상단의 3개 포인트와 최저점은 비교적 이상치라고 볼 수 있는데요.
시계열 데이터를 구하고자 하거나 편차값, Medium, Regression 기울기값 등을 구하려고 할 때 4개 이상치를 제거하고 나머지 데이터를 기준으로 만드는 것이 더 합리적인 상황이 있을 수 있습니다.
보통 통계치로써 유의미한 확률로 인정하는 부분이 정규 분포표 기준으로 보았을 때 p-value가 95% 이상을 유의미하다고 판단하고 있습니다.
p-value는 아래를 참고해보시기 바랍니다.
angeloyeo.github.io/2020/03/29/p_value.html#p-value%EC%9D%98-%EC%9D%98%EB%AF%B8
p-value의 의미 - 공돌이의 수학정리노트
angeloyeo.github.io
그렇다면 위 데이터 전체에서 정규 분포표 기준으로 -2.5% 와 +2.5% 합산하여 5%의 이상치를 제거하고좌 할 때에는 여러가지 방법이 있겠지만 저는 Python의 statistics 라이브러리의 z-score를 이용해 보기로 하였습니다.
우선 'close_points_1w_past_point'는 지난 일주일(1w) 동안의 시가(Open price)와 종가(close price)를 호출하여 데이터를 담은 리스트입니다.
price_df = pd.DataFrame({'price': close_points_1w_past_point})
price_df['z_score'] = stats.zscore(price_df['price'])
price_df_new = price_df[price_df['z_score'].between(-1.96, 1.96)] # 95% 외 이상치
price_df_new_list = price_df_new['price'].to_list()
다만 여기서 중요한 것은 종가만을 넣지 않고 시가와 같이 넣어야 하는 부분이었습니다. 그 이유는 해당 봉의 시가는 바로 이전 봉의 종가 근처에서 나오기 때문입니다.
우리가 보는 분봉, 시간봉, 주봉, 일봉 등은 모두 사실은 연속적인 데이터 입니다. 다만 우리가 인식을 하기 위해 시간이란 기준을 적용하여 연속적으로 발생하는 이벤트를 쪼갠 것 뿐입니다.
예를 들면 1시간 기준으로 시간봉을 본다고 하면 해당 시간봉은 매 시가 0분0초 부터 그 거래량(volume)을 0 부터 다시 계산하게 됩니다. 다시 말하면 해당 거래소에서 거래하는 모든 유저들이 매시간 0초에 모두 똑같은 거래량 '0' 을 본다는 의미가 됩니다.
아무튼 거래량과 시간 단위에 대한 좋은 소재가 있다면 나중에 글을 써보겠습니다.
다시 원주제로 돌아와서, 위의 이상치를 제거하게 되면 아래와 같은 구간의 데이터를 기준으로 분석을 다시 시작하게 됩니다.
결과적으로 위 구간 안에서 보다 상식적인 데이터를 가지고 현재 price의 가 적정 범위 안에 있는 여부 정도는 알 수 있게 됩니다.
'알고리즘' 카테고리의 다른 글
선형 회귀 알고리즘 import 모듈 (0) | 2021.01.15 |
---|