본문 바로가기

Quant

Backtesting Debugging (1)

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은 아니지만, 백테스팅 로직/데이터 정합성에 문제를 조기에 파악한 것은 큰 소득이다.

 

728x90

'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