2.6(목) ~ 2.11(월) 스쿠버 다이빙 투어를 하고 온다고 개발을 못 했다.
작년 실리콘 밸리 출장 이후, 회사에서 파견도 끌려가고 개인 사정으로 뒤숭숭해서 여행을 안 가다가
오랜만에 동아리 투어가 생겨 합류했다.
날씨랑 시야가 안 좋아서 기대했던 것만큼 다이빙이 만족스럽지는 않았지만
선배들이랑 재밌게 놀면서 푹 쉬다온 걸로 만족한다.
백테스팅 시, 특정 로직에서 160초 이상 소요되는 문제가 발생했다. (Bottle neck 현상 발생)
1日 1回 사용하는 기능이지만, (백데이터 기반으로 매매 종목 선별)
백테스팅 일자가 40일이 넘어갈 경우 전략 테스트 시, 단일 전략 검증 시 106분 이상 소요되는 문제가 발생한다.
import timeit
total_trade_count, total_winning_trade, total_profit, mdd = 0, 0, 1, 0
total_portfolio = []
timestamp_list = GetData.get_daily_timestamp_list(date)
buy_signal_theme_in_list, sell_signal_theme_out_list = SignalManager.generate_theme_signal(date, timestamp_list)
##########
execution_time = timeit.timeit(
lambda: SignalManager.generate_theme_signal(date, timestamp_list), number=1
)
print(f"SignalManager time: {execution_time:.6f} seconds")
############)
# SignalManager time: 164.230320 seconds
# :(
timeit 모듈을 활용해 함수 처리 시간 측정
추후 Parameter optimization 및 전략 강화 시 백테스팅을 더 자주 사용할 예정이기에,
데이터 분석 전 해당 기능을 리팩토링 하고 넘어가고자 한다. (안 그러면 백테스팅 10개만 돌려도 하루가 넘게 걸리니까..)
속도를 개선하는 방법을 2가지로 분류해서 고려해봤다.
1. JIT 라이브러리 활용
- jit, njit 라이브러리를 활용하여 JIT compile 활용 시, 속도를 대폭 개선할 수 있다
- 많이 사용되는 라이브러리 활용 시, 개발이 편리하다.
2. 코드 리팩토링
- 비효율 코드 제거
- 파이썬 스러운 코드 활용
+) 가독성 향상
1번 방법이 속도 개선 자체에는 효율적일 수 있지만,
코드 퀄리티 향상을 병행하고자 리팩토링을 우선 진행 후 차도를 보고 1번 방법을 적용하고자 한다.
파이썬스러운 코드
- for loop를 조회하는 대신에 Vectorization 활용
그 외에 코드 가독성을 향상하는 작업을 병행했다.
결과
Func | Before | After |
get_daily_timestamp_list | 0.036350 | 0.012688 |
get_top_theme | 164.737945 | 14.230320 |
get_data | 0.493410 | 0.014735 |
모든 함수의 처리 속도가 향상 했지만, 특히 get_top_theme의 속도 개선은 10배 이상 단축했다.
추후 필요 시, JIT Compile 라이브러리 활용을 검토할 예정이다. 당장은 이 정도 속도로 충분한다.
'Quant' 카테고리의 다른 글
Backtesting Debugging (2) (0) | 2025.02.15 |
---|---|
Backtesting Debugging (1) (0) | 2025.02.13 |
BackTesting : 디버깅 🐛 (2) | 2025.02.05 |
BackTesting : 매매 내역 분석 (0) | 2025.02.03 |
Parameter Optimization (0) | 2025.02.03 |