본문 바로가기
Python

주가 정보 액면 분할 적용하기 - 카카오(035720) 백테스팅

by Playdev 2024. 1. 27.
728x90

 

최근 차트 분석에 대한 정보를 접하고 공부를 하고 있다.

 

TradingView (트레이딩뷰) 라는 좋은 플랫폼이 있지만, 아직은 그것을 제대로 활용할 수 있는 단계는 아닌 듯 하여 전략만 참고하고 있다.

그 중에 백테스팅 이라는 기능을 통해 특정 매수/매도 전략을 시뮬레이션 할 수 있는 기능이 있는데, 파이썬에서 해볼 수 없을까 하여 알아보던 차에 backtrader (https://github.com/mementum/backtrader) 를 알게 되었다.

 

GitHub - mementum/backtrader: Python Backtesting library for trading strategies

Python Backtesting library for trading strategies. Contribute to mementum/backtrader development by creating an account on GitHub.

github.com

 



그래서 내가 가진 주가 정보를 바탕으로 특정 모델을 만들어 백테스팅을 해보기로 하였다.

아래는 카카오(035720) 의 과거 3년치 주가 정보를 바탕으로, 볼린저 밴드(Bollinger Bands) 를 백테스팅 해본 예시이다.

 

백테스팅 기본 설정은 아래와 같이 진행하였다.

- 자본 : 1,000,000원

- 거래 수수료 : 0원 (거래하는 HTS 수수료 정책에 따라 반영이 필요한 부분)

 

액면분할 적용 전

백테스팅 결과

순 이익은 [106,800원] 으로 투자 대비 수익율은 [10.68%] 입니다.

 

 

그래프가 이상하다. 약 3년전에 무슨일이 있었던 거지?

네이버증권에서 본 카카오의 주가는 아래와 같은 흐름인데, 뭔가 잘못된 것 같다.

 

네이버에서 확인한 카카오 3년치 주가 차트

 

그러고보니, 카카오가 액면 분할을 한 시점이 있었다.

2021.04.15 액면분할을 하였고, 그 정보가 내가 보유한 주가 정보에 반영이 안되어있던 것이다.

KRX 에서 확인한 카카오 액면분할 정보
네이버에서 확인한 카카오의 당시 가격 변경

 

그래서 위 정보 백테스팅에 반영하여 진행해보기로 했다.

 

아래와 같이 python 코드를 약간 수정해보았다.

액면 분할이 여러번 존재할 수 있으므로 list 형태로 정의 하고, 해당 정보가 DataFrame 에 반영되도록 하였다.

또한 액면 분할, 거래 정지 등으로 인하여 거래가 불가능 한 경우도 같이 반영하였다.

(아래 예시에서는 액면 분할 정보를 하드 코딩 했지만, 별도 분할/합병에 대한 데이터를 별도로 관리할 예정이다.)

df = pd.DataFrame(stocks)
df['date'] = pd.to_datetime(df['date'])

# 액면분할 반영
split_info = [
    {'date': '2021-04-15', 'ratio': 5},
]
for split in split_info:
    split_date = pd.to_datetime(split['date'])
    split_ratio = split['ratio']
    df.loc[df['date'] < split_date, 'high_price'] *= (1 / split_ratio)
    df.loc[df['date'] < split_date, 'low_price'] *= (1 / split_ratio)
    df.loc[df['date'] < split_date, 'closing_price'] *= (1 / split_ratio)
    df.loc[df['date'] < split_date, 'opening_price'] *= (1 / split_ratio)
    df.loc[df['date'] < split_date, 'trade_volume'] *= split_ratio

# 거래 정지 등으로 인한 가격 정보가 없는 경우 제외
df = df[(df['opening_price'] != 0) & (df['high_price'] != 0) & (df['low_price'] != 0)]
    
data = CustomPandasData(dataname=df.set_index('date'))

 

위 코드를 바탕으로 df 에 담긴 정보가 잘 반영된 것을 확인 할 수 있다.

액면분할 적용 후 가격 및 거래량 정보

 

백테스팅을 다시 돌려보자.

액면분할 적용 후

 

백테스팅 결과

순 이익은 [45,350원] 으로 투자 대비 수익율은 [4.53%] 입니다.

 

그래프가 잘 나온다.

주가 흐름이 보정되니 수익률 또한 변동이 생기는 것을 볼 수 있다.

 

이제 액면 분할/합병 정보를 데이터화 하고, 조금 더 다양한 모델을 만들어 백테스팅을 해봐야겠다.

최종 목표는 백테스팅을 통해 자동매매를 하여 수익화를 하는 것이다.

728x90