최근 차트 분석에 대한 정보를 접하고 공부를 하고 있다.
TradingView (트레이딩뷰) 라는 좋은 플랫폼이 있지만, 아직은 그것을 제대로 활용할 수 있는 단계는 아닌 듯 하여 전략만 참고하고 있다.
그 중에 백테스팅 이라는 기능을 통해 특정 매수/매도 전략을 시뮬레이션 할 수 있는 기능이 있는데, 파이썬에서 해볼 수 없을까 하여 알아보던 차에 backtrader (https://github.com/mementum/backtrader) 를 알게 되었다.
그래서 내가 가진 주가 정보를 바탕으로 특정 모델을 만들어 백테스팅을 해보기로 하였다.
아래는 카카오(035720) 의 과거 3년치 주가 정보를 바탕으로, 볼린저 밴드(Bollinger Bands) 를 백테스팅 해본 예시이다.
백테스팅 기본 설정은 아래와 같이 진행하였다.
- 자본 : 1,000,000원
- 거래 수수료 : 0원 (거래하는 HTS 수수료 정책에 따라 반영이 필요한 부분)
백테스팅 결과
순 이익은 [106,800원] 으로 투자 대비 수익율은 [10.68%] 입니다.
그래프가 이상하다. 약 3년전에 무슨일이 있었던 거지?
네이버증권에서 본 카카오의 주가는 아래와 같은 흐름인데, 뭔가 잘못된 것 같다.
그러고보니, 카카오가 액면 분할을 한 시점이 있었다.
2021.04.15 액면분할을 하였고, 그 정보가 내가 보유한 주가 정보에 반영이 안되어있던 것이다.
그래서 위 정보 백테스팅에 반영하여 진행해보기로 했다.
아래와 같이 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%] 입니다.
그래프가 잘 나온다.
주가 흐름이 보정되니 수익률 또한 변동이 생기는 것을 볼 수 있다.
이제 액면 분할/합병 정보를 데이터화 하고, 조금 더 다양한 모델을 만들어 백테스팅을 해봐야겠다.
최종 목표는 백테스팅을 통해 자동매매를 하여 수익화를 하는 것이다.
'Python' 카테고리의 다른 글
암호화폐 등락률 정보를 디스코드로 전달받기 (feat. Crypto Bubbles) (1) | 2024.06.02 |
---|---|
맥북 M1 Max LangChain 설치하기 (1) | 2024.01.21 |
OpenAI API 사용하기 - 코드 첨부 (0) | 2023.03.12 |
TensorFlow / PyTorch GPU 사용하여 병렬처리 하기 (0) | 2023.02.26 |
[Selenium] 크롬 디버그 모드로 크롤링 하기 (0) | 2022.02.01 |