본문 바로가기
Python, API

백테스트의 속도개선

by 오늘밤날다 2022. 11. 16.

 

일전에 포스팅한 내용대로 백테스트 프로그램의 개선 작업을 거의 완료했다.

 

2022.11.13 - [Python, API] - DataFrame의 Loop속도 비교 (iloc, iat, iterrows, itertuples)

 

 

 

[AS-IS]

  1. Df.iat 함수를 사용해서 Loop를 생성한다
  2. 가격, 거래시간, 포지션 정보 등을 DataFrame의 현재 및 직전 행을 Df.iat로 인덱싱하여 정보를 가져온다.
  3. 계산된 결과를 현재 행의 DataFrame에 Df.iat 함수를 사용하여 업데이트한다.

 

 

 

 

[To-Be]

  1. Df.itertuples로 Loop를 생성한다.
  2. Df.itertuples 실행으로 출력되는 DataFrame 현재 행의 Namedtuples을 Dictionary형태로 변환하고 CurrentDict라는 변수로 정의한다.
  3. 가격, 거래시간, 포지션 정보 등을 DataFrame의 현재행은 CurrentDict를 사용하고 이전행은 PreciousDict로 정의된 변수를 사용한다. 계산된 결과는 CurrentDict 변수에 다시 저장한다.
  4. 계산이 완료된 CurrentDict들을 하나씩 저장할 Dictionary를 TotalDict로 정의하고 TotalDict에 CurrentDict의 정보를 저장해둔다. 그리고 사용이 완료된 CurrentDict는 다음행의 Loop가 시작되어 사라지기 전에 PreciousDict라는 임시변수에 저장하여 다음행의 정보가 산출되는 3번과정에서 사용할 수 있도록 한다.
  5. 계산이 완료되어 저장된 TotalDict를 DataFrame으로 한꺼번에 변환한다.

 

 

 

 

현재 프로그램의 업데이트가 모두 완성되지는 않았지만 기존 버전 대비 소요시간이 2~3배 개선 효과가 있는 것 같다. 이 속도의 개선이 어디서 나오는지 하나씩 따져봤는데 크게는 두 가지 관점에서 생각해볼 수 있는 것 같다.

 

 

  • Loop 방법의 차이

Df.iat보다 Df.itertuples가 속도에서 압도적인 차이를 보인다. 

 

 

  • DataFrame vs Dictionary

연산 및 데이터 업데이트를 Dictionary 상태에서 모두 완료한 후에 최종 결과물만 DataFrame으로 변환 처리한다. 즉, 굼벵이 Pandas의 사용빈도를 낮추는 효과가 있다. 이후 전략의 성과(누적수익, MDD, 변동성 등)의 산출 시에는 Pandas의 장점인 빠른 Vector연산을 사용하면 된다.