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

함수 메소드 건의

칸트 2022.02.14 16:57 조회수  111 추천 0

안녕하세요.


모멘텀 점수화하는데 보통 일간 데이터를 이용해서 sum해서 사용하는데,

트레이딩이 아닌 코드문에서는 보통 월간, 분기를 많이 사용할거 같은데요.

보통 월간은 21일 평균으로 잡는데, 큰 차이는 아니겠지만 이게 각 월마다 미세하게 다릅니다.

따라서 월간/분기별 리밸런싱시 약간 다르게 나오는 것 같습니다.

(최근 3년간 일간데이터로 월간 모멘텀 수작업 계산시 의도치 않은 차이가 발생합니다)

특히 자산배분과 관련해서 비교하면 하루 이틀 상관으로,

일간 합계로 계산하는 함수식 구현과 월간 모멘팀의 함수식과의 (사전에 정의된) 자산별 비중의 차이가 발생합니다.


일간/월간 데이터가 내재되어 있으실테니, 일수별이 아닌, 월간별로 메소드를 만들어 주시면 유용하게 사용할 수 있을 것 같습니다.

이렇게 하면, 월간/분기별 리밸런싱시 데이터를 좀 더 의도한대로 정확하게 반영할 수 있을 것 같습니다.

가령,

getMonthlyStartAdjClose(1) : 전월 첫번째 영업일 수정종가

getMonthlyEndAdjClose(1): 전월 마지막 영업일 수정종가

getMonthlyStartClose(3) : 3달전 첫번째 영업일 종가 (이렇게 하면 지수-지수에서 AdjClose 메소드가 가능한지는 모르겠지만-에서도 쓸 수 있을 것 같습니다)


월간/분기별 전략에서 사용하기에 간단하며, 이점이 많을 것으로 생각합니다.

검토 부탁드립니다.

고맙습니다.

댓글 2
칸트님 안녕하세요.

Stock 객체와 Index 객체에 일일이 제안하신 함수를 추가하는 방식은 고려해 보기 쉽지 않을 것 같지만, 조금만 응용해 보면 필요한 함수를 쉽게 만들어 쓸 수 있을 것 같습니다.

전략토론방에 올린 getWorkingDayOffset() 함수 예제 (https://www.intelliquant.ai/article/1057?forum=0 ) 를 사용하시면 아래와 같이 원하시는 데이터 조회가 가능할 것 같습니다.

function getMonthlyEndDay(ref_date, month) {
    var m = (typeof month !== 'undefined') && month > 0 ? month : 1;	// 1 -> 지난 달 마지막 거래일
    return new Date(ref_date.getFullYear(), ref_date.getMonth()-month+1, 0);
}

function getMonthlyStartDay(ref_date, month) {
    var m = (typeof month !== 'undefined') && month >= 0 ? month : 0;    // 0 -> 이번 달 첫 거래일
    return new IQDate.getNextWorkingDay(new Date(ref_date.getFullYear(), ref_date.getMonth()-month, 0));
}

function onDayClose(now) {
    var prevMonthEnd = getMonthlyEndDay(now, 1);
    logger.info('prevMonthEnd = ' + prevMonthEnd);
    
    var prevMonthStart = getMonthlyStartDay(now, 1);
    logger.info('prevMonthStart = ' + prevMonthStart);
    var stock = IQStock.getStock('A005930');
    
    var day_off1 = getWorkingDayOffset(prevMonthEnd);
    logger.debug('AdjClose(' + day_off1 + ') = ' + stock.getAdjClose(day_off1));

    var day_off2 = getWorkingDayOffset(prevMonthStart);
    logger.debug('AdjClose(' + day_off2 + ') = ' + stock.getAdjClose(day_off2));

    ......
}
Joseph 2022.03.03 22:51
joseph님 댓글이 늦었습니다.
전에 봤었는데 이해가 안 되서 넘어갔었는데, 알려주신 것 공부해보겠습니다.
고맙습니다. ^^
칸트 2022.03.18 18:26
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글