[Pandas] 내 맘대로 증가율 계산

반응형
    반응형

    pct_change의 업그레이드 판입니다. 특정 기간동안의 증가율을 계산하고 싶거나 수치가 필요할 때 rolling apply이 유용합니다.
    pct_change는 바로 위아래의 값만 퍼센트(백분율)로 나와서 내 맘대로 못하는 단점이 있는데 상황이 여러가지가 있고 백분율이 아닌 수치로 바꿀려면 다시 계산을 해야하는 번거로움이 있습니다. 그리고 위 아래의 증가율만 따지기 때문에 며칠 후의 것들의 증가율을 하려고 한다면 필터를 적용한 후 pct_change를 써야하는 번거로움이 있는데요.
    이런 불편함을 확실히 없앨 수 있는 방법으로 rolling apply를 써보는 게 어떨까 싶습니다. 일단 apply는 lambda 기법으로 간단한 함수를 만드는 방법이므로 당연히 커스텀마이징이 가능합니다.다시말하면, 퍼센트나 수치 모두 나오게 할 수 있다는 얘기가 됩니다.

    pct_change를 rolling.apply로 구현

    요즘 금값이 치솟고 있으니 금값으로 한번 해보겠습니다.

    GOLD

    pct_change는 100을 곱하지 않은 상태 그대로 apply을 이용해 식을 써넣으면 됩니다. 위 아래이므로 windows=2 가 되겠습니다. 비교를 해보겠습니다.

    GOLD['Diff'] = GOLD['Close'].rolling(window=2).apply(lambda x: ((x.iloc[1]-x.iloc[0])/x.iloc[0]))  
    GOLD['pct'] = GOLD['Close'].pct_change()

    동일한 수치가 나오는 것을 알 수 있습니다.
    참고로 window =2 라는 뜻이 두개의 값을 묶는 상태에서 계산한다는 것입니다. window를 진행하면 [9995,10065]로 2개로 묶으면 인덱스가 0,1만 나타나고 그 인덱스에 맞춰서 계산해달라고 apply로 요청하면 됩니다.
    백분율이 아니라 수치로도 할 수 있습니다.

    GOLD['Diff_num'] = GOLD['Close'].rolling(window=2).apply(lambda x: x.iloc[1]-x.iloc[0])

    데이터프레임을 불러보면 다음과 같이 증가량이 잘 나온 것을 볼 수 있습니다.

    3일(매수일포함) 지난 후의 증가율 구현(커스텀마이징)

    주식전략을 구현해보면 문제가 되는게 어느게 잘 되는지 알 수가 없게 됩니다. 그래서 여러가지를 실험해봐야 하는데 계산된 파생변수를 어느정도는 만들어놓는게 중요합니다.
    만약 매수일 포함 영업일 3일에 한번씩 매수 매도를 한다고 하면 3일 후의 증가율만 필요할겁니다. 물론 3일씩 데이터프레임을 가져오는 것도 괜찮은데 join을 다시 해야하는 불편함이 있으니 한번에 하는 방법을 생각해보았습니다. 한번에 하려면 다음과 같이 합니다. 이 역시도 rolling apply로 진행할 수 있습니다.

    GOLD['Diff_3'] = GOLD['Close'].rolling(window=3).apply(lambda x: (x.iloc[2]-x.iloc[0]))

    실제로 불러보면 다음과 같이 3일에 한번씩 계산한 수치가 나옵니다.

    마치며

    다른 방법도 많지만 rolling apply를 이용한 증가율 계산을 해보았습니다. pct_change는 백분율로만 나와서 불편함이 있었지만 rolling apply를 이용하므로 수치를 바로 구할 수 있었습니다.

    함께 보면 좋은 글
    [Pandas] 간단하게 수익률 구하기(pct_change)
    Pandas에서 이동평균선 구하기
    [Pandas]Rolling Statistics



    댓글

    Designed by JB FACTORY

    ....