커뮤니티
내가 만든 전략들과 지식을 공유하고 토론합니다.

getAdjClose() 속도 관련 질문

Europa 2023.02.03 17:22 조회수  139 추천 0

안녕하세요, 오랫만에 질문 드립니다.


getAdjClose()를 각 종목당 많은 횟수를 호출을 시도했더니 백테스트의 속도가 거의 진행이 안되는 수준으로 느려졌습니다.

예를 들어, moving average를 구하려 한다면 (실제로는 다른 일을 시도했음) getAdjClose(i)를 수십번 호출해야 하는데,

이런 일을 실제로 stockFilter() 안에서 진행했더니 백테스트가 굉장히 느려져서 도저히 할 수 없는 수준이 되네요.

하나의 종목당 60회의 호출을 했더니 한 종목을 진행하는데 1초 정도가 걸립니다.


이걸 더 빠르게, 백테스트를 진행할 수 있을 정도의 속도로 빠르게 할 수 있는 방법이 있을까요?

아니면 제가 뭔가를 잘못한 것인가요?


미리 감사드립니다.

댓글 3
(약간의 사족을 덧붙입니다.)

백테스팅을 시작하는 첫번째 날짜에 굉장히 오랜 시간이 걸리고, 한번 진행이 시작되면 그 다음 날자부터는 정상적인 속도로 진행이 되네요. 지금은 obsolete되었다는 getPrevData()를 일부러 넣어서 미리 데이터를 읽어오게 했더니 넣지 않은 버전에 비해서 수십배 정도의 초기날짜 속도 향상이 있었습니다.
Europa 2023.02.03 17:34
댓글에 올리신 글처럼 테스트하신 것에 해답에 대한 힌트가 있습니다.^^ 

백테스트를 실행시킬 때 과거데이터를 참조할 때마다 매번 DB에서 불러서 호출하는 비효율을 피하기 위해, 특정 과거데이터를 참조하면 그 이후 날짜의 해당 시계열 데이터를 모두 가져와서 캐시에 저장해 두도록 동작하고 있습니다. 
예를 들면, getAdjClose(100)을 하여 100일 전 수정종가를 호출하면, 99일 ~ 당일 수정종가가 모두 캐시에 로딩되어 이후에 이 기간의 데이터는 바로 읽어서 사용하게 됩니다.

따라서, 속도가 느려지는 아주 비효율적인 시나리오는 for loop을 사용할 때 만일 당일 -> 1일전 -> ... -> 100일 전 데이터 순서로 호출하여 계산하면 매번 새로 데이터를 로딩해서 캐시에 올리는 작업을 반복하기 때문에 매우 느려지는 것입니다.

따라서, loadPrevData()를 사용하지 않고도 같은 속도만큼 빠르게 하기 위해서는 for loop를 돌릴 때 가장 과거부터 최근으로 거꾸로 호출하게 하시면 됩니다.
ex) for(i=0; i<100; i++)  { var a = stock.getAdjClose(i); }
      와 같은 코드보다는
      for(i=99; i>=0; i--)  { var a = stock.getAdjClose(i); }
처럼 작성하면 됩니다.
인텔리퀀트 2023.02.03 18:02
네, 빠른 답변 감사합니다. 좋은 주말 되세요~
Europa 2023.02.03 19:34
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글