안정적인 우상향 추세를 어떻게 수치로 나타낼 수 있을지 고민하다가 상관계수와 결정계수를 이용해 보기로 했다.
전체 시계열 데이터 중에서 매일 동안 과거 일정 기간을 정한 후에 이 기간 동안의 값을 계산하기 위해서는 연산값이 많아서 속도가 꽤나 지연되는 현상이 있었다. Numpy, Scipy, Custom func with Numba 등 여러 가지를 활용해 봤지만 그냥 Pandas의 내장 함수를 이용하는 것이 속도 측면에서 가장 좋은 성과를 보였다.
우선 0부터 행의 개수만큼 1씩 증가하는 straight_line(직선)을 하나 만들고 이것과 종가('close')와의 상관관계를 rolling.corr() 함수를 사용해서 구한 뒤에 이 값을 다시 결정계수로 바꿔주면 된다.
tf = 120
df['straight_line'] = np.arange(0, len(df))
df['corr'] = df['close'].rolling(window=tf).corr(df['straight_line'])
df['r2'] = df['corr'] ** 2
삼성전자(005930)을 가지고 straight_line과의 상관관계를 120일 동안 구한 값들을 그래프로 나타낸 것이다. 상관관계가 1에 가까운 높은 값을 유지하면서 한동안 일정하게 유지되는 구간들이 있다. 이를테면 2016년부터 2017년 말까지는 큰 흔들림 없이 우상향 하는 흐름을 보여주는데 이 시점에는 상관관계가 1에 가깝게 높은 위치에 머무르게 된다.
꾸준히 상승세를 유지하고 있는 두 종목(선광, 대성홀딩스)에 적용해 봤다.
상장 이후 고점을 찍고 한동안 지속적으로 하락하기만 했던 박셀바이오의 경우 한동안 straight_line과 상관관계가 매우 낮게 유지되었다.
마지막으로 셀트리온에 적용한 결과. 꾸준히 상승해 온 것 같지만 절치부심이 많았다. 결과론이지만 대상승을 보여준 2017년 하반기에 대략 상관관계가 0.8을 넘는 구간에서만 투자했더라도 큰 수익을 봤을지도?
'시스템트레이딩' 카테고리의 다른 글
과거 연속 하한가의 기록 (feat. 내계좌) (0) | 2023.04.27 |
---|---|
ETF의 체결오차(슬리피지)는 얼마나 될까? (0) | 2023.04.24 |
KRX 수정주가 조회 및 계산방법 (0) | 2023.03.25 |
해외선물 전략들의 근황 (0) | 2023.03.05 |
KRX 종목코드로 우선주, 스팩, 외국기업 구분하기 (0) | 2023.02.23 |