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

Basket 내 종목들의 구매 비율을 바꾸는 방법에 관한 질문

Europa 2021.07.06 14:44 조회수  133 추천 0

자주 질문 드리네요.


제목처럼, basket내 종목들의 구매 비율을 바꿔보려는 시도를 하고 있습니다. 아무것도 하지 않았을때는 BasketEgg.ratio 가 모두 비어 있는 상태로 보입니다. Ratio 정보를 종목별로 다르게 주면 포트폴리오 구매 비율이 바뀌는지를 체크해 보려고 합니다. 아래 좀더 구체적인 질문들을 나열했습니다.


1) onDayClose()에서 basket.buildPortfolio()가 호출된 이후에 종목들이 설정이 되는 것으로 보이는데, 포트폴리오에 담긴 종목들이 실제 매수, 매도 처리되는 시점은 언제인 것인지요?

2) 그리고 onDayClose()에서 buildPortfolio() 호출 이후에 BasketEgg.ratio 정보를 바꿔주면, 그 비율대로 매무, 매도 처리에 반영이 되는 것인지요? buildPortfolio()시에 이미 quantity field가 채워지는 것으로 봐서 ratio를 추후에 바꿔준다고 해도 종목 구매 비율은 바뀌지 않을거라고 예상하고 있습니다. 그렇다면 어느 시점에 ratio 정보를 이용하게 되는 것인가요?

3) Eggs의 ratio에는 어떤 값들이 들어갈 것으로 기대하고 있는지요? 예를 들어, basket 내의 ratio 들의 합이 1이 되어야 하는 것인지, 아니면 그것과는 무관하게 숫자만 넣으면 다른 종목을 고려해서 비율 처리가 자동으로 되는 것인지 궁금합니다. 도움말에는 아래와 같이 기술되어 있습니다. (이 부분이 도움말의 코드 예제로 들어가 있으면 훨씬 도움이 될 것 같습니다.)

  "Basket에 담긴 종목의 비율입니다. 단 Basket에 담기는 시점의 비율이며, 종목이 추가된다고 해서 이 값이 변하지는 않습니다. 전체 Basket에서 비중이 필요하면 별도 계산이 필요합니다."


감사합니다.

댓글 1
안녕하세요 Europa님,
개괄적으로 설명을 먼저 드리자면,
ratio 정보는 백테스트 시에는 사실상 거의 영향을 주지 않는 정보이며, 모든 매매 시뮬레이션의 기준은 수량(quantity) 기준으로 수행됩니다. ratio 정보가 부가적으로 사용되고 있는 이유는 실전투자를 위해 증권사 등 외부와 정보를 교환할 때 수량이 아닌 종목별 비중 정보를 전달하는 방식으로 되어 있어서 추가하게 된 것입니다. (그런데, 지금은 이것도 다른 방식으로 계산방법을 개선하여서 사실 그닥지 중요한 정보가 안 되고 있습니다. ㅜㅜ)

1) onDayClose() 함수가 리턴되고 나면, 이후에 현재 보유 포트폴리오 종목 목록과 새로 구성되어야 할 타겟 포트폴리오 종목 목록을 비교하여 매수/매도 목록을 작성하고, 매매가격 가정에 대한 설정 (당일 종가, 익일 시가, 익일 평균가) 에 따라 실제 매매 시점에 매매 수행 함수를 호출합니다. 당일 종가인 경우에는 바로 매매가 수행되는 것이고, 익일 시가/평균가 인 경우에는 시뮬레이션 날짜를 1영업일 더 전진한 후 장 마감을 의미하는 onDayClose()가 호출되기 전에 매매를 먼저 수행합니다.

2) 위에 ratio 설명대로 ratio 정보만 변경하는 것은 백테스트에서는 의미가 없습니다. 오히려 실전투자에 정보를 전달할 때는 영향을 끼칠 수 있지만, 백테스트로 검증이 되지 않은 채로 영향을 끼치는 것이라 권장하지 않습니다.

3) ratio는 해당 종목이 속한 Basket 의 비중 합이 1이라고 가정하고 계산합니다. 그리고, 도움말의 문구처럼 새로 BasketEgg 객체를 생성할 때나, enter 함수 / leave 함수를 사용하여 바스켓에 명시적으로 종목을 넣거나 뺄 때 한 번 계산합니다.

실제  종목별 구매 비율 (또는 비중/가중치)을 변경하고 싶으신 경우에는, buildPortfolio() 를 활용하시지 말고, 종목을 하나씩 enter() 함수를 이용해서 해당 Basket에 직접 차등화된 종목 비중만큼 수량을 계산하여 넣어 주시는 방법을 사용하시면 됩니다. (이 때 ratio는 자동 계산됩니다.)

ex) 테스트까지 마친 코드는 아니니, 참고하셔서 작성해 보시기 바랍니다.
function myPortConstruction() {
    var universe = IQStock.filter(myFilter);

    var sortedByPer = universe.slice().sort(function(a,b){return getPER(a)-getPER(b);});
    var aa = sortedByPer.slice(0, stock_num);

    var basketAmount = stock_port.getBudget();  
    
    stock_port.reset();    
    for (var i = 0; i < aa.length; i++) {     
        ratio = getStockRatio(aa[i]);     // 종목별 투입 비율 계산하는 함수 있다고 가정
        qty = Math.floor(basketAmount * ratio / aa[i].getAdjClose());
        stock_port.enter(aa[i], qty);        
    } 
}
인텔리퀀트 2021.07.06 18:01
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글