ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬] Historical Correlation(상관관계 추이) 계산하기
    기타/가상화폐 2021. 11. 25. 11:10
    반응형

    상관관계는 어느 특정 시점에서 계산하는 것이 일반적이지만

    가끔 상관관계가 시간의 변화에 따라 어떻게 달라졌는지 보고 싶을 때가 있다.

    그럴 때는 아래와 같이 계산할 수 있다.

    두 데이터에서 일정 시간이 지난 뒤부터 데이터가 변할 때마다 새롭게 상관관계를 계산하는 것이다. 

    1. 최근 n일의 상관관계를 보고 싶은 경우 

    일반적으로 최근 n일의 상관관계가 시간이 흐름에 따라서 어떻게 변했는지를 보는 것이 유용할 것이다. 

    데이터가 길어질수록 새로운 데이터가 미치는 영향력이 점점 줄어들기 때문에, 최근의 변화를 반영하기 어렵다. 

    그리고 상관관계는 수치 자체보다 과거에 비해 증가했냐 감소했냐, 즉 추세가 더 중요하기 때문이다. 

     

    또, 데이터의 길이는 상황이나 목적에 따라 달라지기 때문에 

    n을 직접 설정하기보단, 데이터의 길이에 맞게 달라지도록 짜 봤다.

    cut = 5라면 n값은 전체 기간의 1/5이 된다. 

    def historical_corr(a:pd.Series,b:pd.Series,cut=5) -> pd.Series :
        # 시작점 맞추기 
        if a.index[0] <= b.index[0]: #a가 먼저 시작  
            a = a[b.index[0]:]
        else: #b가 먼저 시작 
            b = b[a.index[0]:]
    
        i = 0 
        rolling = len(a)//cut
        data = []
        while i+rolling+1 != len(a):
            data.append(a[i:i+rolling].corr(b[i:i+rolling:]))
            i += 1 
        return pd.Series(data,index=a.index[rolling+1:])

    2. 시작점을 고정하는 경우 

    예를 들어서 두 종목의 1년치 일봉 종가 데이터가 있다면 

    일정 시간(코드에서는 전체 기간의 1/10)이 지난 시점부터 매일매일 상관관계를 계산한다. 

    첫날부터 1/10지점까지 계산한 것이 첫 상관관계 데이터가 될 것이다. 

    첫날부터 1/10지점의 다음날까지 계산한 것이 두 번째 데이터가 된다. 

    이 방법으로 마지막 데이터까지 상관관계를 구해서 시리즈에 저장한 뒤 리턴한다.

    def historical_corr(a,b) -> pd.Series :
        # 시작점 맞추기 
        if a.index[0] <= b.index[0]: #a가 먼저 시작  
            a = a[b.index[0]:]
        else: #b가 먼저 시작 
            b = b[a.index[0]:]
        # 어느정도 지난 시점부터 상관관계 계산 
        i = len(a)//10
        data = []
        while i != len(a):
            data.append(a[:i].corr(b[:i]))
            i += 1 
        return pd.Series(data,index=a.index[len(a)//10:])

     

     

    반응형

    댓글

Designed by Tistory.