10년전, 중앙대 스쿠버 동아리에서 처음 훈련을 할 때부터 매년 방문했던 잠실다이빙 풀장이 갑자기 운영 종료를 한다고 한다.
대학교 때도, 직장인이 되고나서도, 강사 활동을 하면서도 꾸준히 갔던 곳이 이제 문 닫는다니 아쉽다.
리모델링 한 올림픽 수영장이 더 좋긴했지만, 추억이 많은 곳이라 아쉬운 건 어쩔 수 없다.
스쿠버 강사 활동을 올해는 안 할 예정이지만 앞으로 어디로 가야할 지 고민이다.
다이빙 훈련 끝나고 잠실에서 먹던 삼겹살이 좋았는데..
수익률 극대화를 위해 백테스팅 수익률 결과를 일자별로 체크하는 중 이상한 매매 내역을 파악했다.
24-12-03의 매매일자가 22회로 매우 많다.
데이터 수집 초기 단계에 해당 데이터를 백테스팅 했을 때의 기억으로는 이런 매매가 아니었는데, 업데이트 과정에서 side-effect로 이상치가 발생했음을 파악했다.
상세히 디버깅한 결과, 백테스팅 內 당일 데이터의 validation logic에 이상치가 있어 데이터를 중복으로 쌓았고,
이로 인해 결과에 영향을 줌을 파악했다.
1) 기존 로직을 수정
# Before
if (
last_updated_date is None # 값이 없는 경우
or last_updated_date.date() < date.date() # 날짜가 기준 날짜 이전인 경우
or last_updated_date.time() != time(15, 30) # 시간이 15:30이 아닌 경우
):
print(f"* update {date} - {code}")
SaveData.update_stock_five_minute_ohlcv(code, date)
# After
if (
last_updated_date is None # 값이 없는 경우
or last_updated_date.date() < date.date() # 날짜가 기준 날짜 이전인 경우
or (last_updated_date.date() == date.date() and last_updated_date.time() != time(15, 30)) # 시간이 15:30이 아닌 경우
):
print(f"* update {date} - {code}")
SaveData.update_stock_five_minute_ohlcv(code, date)
이전 로직에는 최종 수정 일자와 현재 일자의 차이를 구분하지 않고, 시간으로만 비교하는 로직이 추가되어 있어 특정 주식의 데이터가 계속 반복적으로 쌓이는 문제가 발생했다.
2) Validation logic 추가
one_day_dataframe = GetData.get_one_day_ohlcv_data(code, date)
if one_day_dataframe.shape[0] > FULL_ONE_DAY_DATA_SIZE:
SaveData.clean_stock_data(date, code)
one_day_dataframe = GetData.get_one_day_ohlcv_data(code, date)
결과
Before | After | |
Working Days | 31 | 32 |
Total Trades | 68 | 57 |
Winning Trades | 29 | 24 |
Win Rate | 42.65% | 42.11% |
Total Profit | 38.56% | 48.20% |
실제 투자에 영향을 주는 PR은 아니지만, 백테스팅 로직/데이터 정합성에 문제를 조기에 파악한 것은 큰 소득이다.
'Quant' 카테고리의 다른 글
Backtesting Debugging (3) (0) | 2025.02.15 |
---|---|
Backtesting Debugging (2) (0) | 2025.02.15 |
Refactoring: 백테스팅 속도 개선 (0) | 2025.02.11 |
BackTesting : 디버깅 🐛 (2) | 2025.02.05 |
BackTesting : 매매 내역 분석 (0) | 2025.02.03 |