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

같은 코드로 같은 날짜에 매수하는데

루아흐 2021.08.20 09:04 조회수  174 추천 0

같은 코드로 같은 날짜에 매수하는데


시작일자에 따라 매수하는 종목이 조금씩 다르게 나옵니다.


왜 그런지 궁금합니다.

댓글 6
질문이 좀 더 구체적이어야 어떤 현상인지 정확히 알 수 있을 것 같습니다.
예를 들어,
1.  8/1에 백테스트를 시작하도록 해서 뽑힌 8/1일자 포트폴리오와 8/4에 시작하도록 해서 뽑힌 8/4일자 포트폴리오가 다르다면, 그건 서로 다른 날짜의 데이터로 종목을 선정했을 테니 당연히 다를 것입니다.

2. 만일 6/1을 시작 날짜로 해서 백테스트 했을 때 8/1 날짜에 정기 리밸런싱을 하면서 뽑힌 종목들과, 7/1을 시작 날짜로 해서 백테스트했을 때 8/1 날짜에 뽑힌 종목들이 다르다면... 이 경우는 전략에서 과거의 계좌 상태라든가 시장상황에 따라 어떤 종속되는 결정을 내리도록 한 경우가 거의 99.9% 입니다. 혹시 전략에서 그런 아이디어를 사용하고 계신 것 아닌지 다시 한 번 확인 부탁드립니다.

혹시 별 문제 없는 것으로 확인되셔도 댓글로 확인 결과를 알려 주시면 감사하겠습니다. ^^
인텔리퀀트 2021.08.20 11:25
답변 감사합니다. 저 같은 경우 2번의 경우입니다.
6/1에 정기 리밸런싱을 할때 시작날짜 4/1, 5/31, 6/1의 결과가 조금씩 다르게 나옵니다.
말씀하신 요소들이 딱히 없는데도 차이가 나서 다른 요인이 없는지 확인해보겠습니다.
루아흐 2021.08.20 15:47
그리고 어떤 요소가 있다고 하더라도 같은 코드로 같은 날짜에 리밸런싱을 한다면
같은 종목이 나와야한다고 생각합니다.
루아흐 2021.08.20 16:24
2번의 경우 포트폴리오 결과가 달라질 수 있는 상황을 아래에 예시를 들어 보겠습니다. 참고하시고 한 번 전략을 살펴 봐 주시면 좋을 것 같습니다.
아래의 경우에는 코드는 같더라도 백테스트 시작일이 달라지면 같은 일자 포트폴리오가 충분히 달라질 수 있는 경우들입니다.

(1) 계좌 상태에 따라 전략의 지표나 스타일을 바꾸는 경우
  - 시작일부터 누적된 계좌의 손실 또는 계좌 수익률 고점 대비 하락폭(DD)이 x% 이상 되면 팩터 지표들의 가중치를 변경하도록 한 경우가 이에 해당합니다. (예를 들어 저변동성 지표 등에 가중치를 더 둔다든가 하는 식으로)

(2) 계좌 총평가금액의 변화에 따라 필터링되는 종목이 달라져서 유니버스가 변경되는 경우
  - 종목을 필터링할 때 투자금액을 종목수로 나눈 금액보다 주가가 더 비싼 경우 그 종목은 1주도 매수를 못하므로 제외시켜 놓는 필터링을 하는 경우가 많습니다. 그런데, 계좌 평가금액이 늘어나거나 줄어들면 해당 기준이 계속 바뀌면서 경계선에 있는 종목이 유니버스에 들어가거나 빠지는데, 이 종목들이 있고 없고에 따라 전체 유니버스 갯수가 달라지면서 상대평가 점수가 달라져서 미묘하게 종목의 순위가 변할 수 있고, 선정된 종목이 1-2개 정도 달라질 수 있습니다.
 ex) 
  (a) 1000만원 20종목으로 4/1에 시작 -> 6/1에 계좌가 2000만원이 되었다면 종목당 100만원 할당. 1주에 100만원 이상의 종목은 필터링해서 제거
  (b) 1000만원 20종목으로 6/1에 시작 -> 6/1에 계좌는 1000만원이므로 종목당 50만원 할당, 1주에 50만원 이상의 종목은 필터링해서 제거


인텔리퀀트 2021.08.20 17:01
다시 댓글 달아 주신 상황을 고민해 보니, 5/31과 6/1 의 경우처럼 거의 날짜 차이가 없도록 시작일을 정한 경우에 종목에 차이가 생긴다면, 위에 예시한 2가지 경우가 아닌, 아주 예외적인 다른 경우일 가능성이 있을 것 같습니다.

보통 PER, PCR, GP/A, ROA 등의 경우처럼 비율을 구하는 지표함수를 사용하실텐데요...
혹시 지표함수를 만드실 때, 0으로 나누기 같은 무한대(Infinity) 값을 함수의 리턴값으로 그냥 보내는 상황이 생기지 않도록 코드를 신경 써서 작성하셨는지 꼭! 확인해 보실 필요가 있습니다. 
만일 혹시라도 이런 무한대 값이 그냥 함수의 리턴값으로 나오게 작성하셨다면, 지표를 가지고 종목을 정렬(sort)하는 배열 sort 부분에서 제대로 정렬이 안 되고 예상치 못한 순서로 결과가 나올 수 있습니다.

"JavaScript array 정렬" 으로 구글링 해 보면, 
"... 표준 JavaScript array.sort()를 사용하면 NaN에 도달 할 때까지 정렬 된 다음 그 결과가 무작위로 나타납니다."라고 되어 있습니다. (https://pythonq.com/so/javascript/1464833)

이와 같은 상황에서는 백테스트 시작 날짜에 따라 얼마든지 같은 리밸런싱 날짜의 정렬 결과도 예측 불허로 달라질 수 있으므로, 이 부분을 먼저 체크해 보시는 것이 좋을 것 같습니다.
인텔리퀀트 2021.08.21 03:36
상세한 답변 감사합니다.
루아흐 2021.08.21 21:05
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글