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

과거 주가(시장) 데이터를 날짜로 지정해서 조회하는 방법

Joseph 2021.12.10 16:27 조회수  599 추천 2

Re: 특정시점의 과거 PER, PBR 값 구할 수 있을까요? (자유게시판 질문에 대한 답변)


자유게시판에 서광원님께서 문의하신 내용을 구현하실 수 있도록,

과거 주가(시장) 데이터를 조회하는 방법으로 특정 날짜를 지정해서 조회할 수 있도록 임시방편으로 함수를 만들어 보았습니다.

동작과 사용법에 대한 이해를 위해 공유된 알고리즘을 복사해 가신 후 실행시켜 보시고 나서 활용하시기 바랍니다.


코드의 마지막 부분에 있는 두 개의 함수를 복사해서 본인의 전략 코드에 붙여넣기 하고 사용하시면 될 것 같습니다.

// years, months, days 설정한 만큼의 과거 달력상 날짜 가져오기

getPastCalendar(date, years, months, days)


// 지정한 날짜 (date)가 현재로부터 얼마나 과거 거래일수 만큼 떨어져 있는지 계산하는 함수

getWorkingDayOffset(date)



*** 주의 ***

현재 안전(?)을 위해 300 거래일까지의 과거만 조회 가능하도록 해 놓았습니다.

이 기능을 플랫폼에 내재화할 때에는 그 이상의 과거 값을 조회하는 것도 가능하도록 할 예정입니다.


댓글 6
Joseph 님 감사드립니다. 이제 정확한 일자 계산이 가능해졌습니다.
소포클레스 2021.12.10 20:57
Joseph 님 테스트 해보니 말씀하신대로 전년동기의 재무데이터 발표일을 가져올때 "Out of range !!" 에러가 발생합니다.  그러므로 PEG 전략에 관한 글은 플랫폼에 내재화한 후에 게시하겠습니다. 감사합니다.  
소포클레스 2021.12.10 23:32
참고로 전년동기의 재무데이터 update 일자의 Offset을 가져오는 함수는 아래와 같습니다. 플랫폼을 내재화 할때 같이 고려해 주시면 저처럼 자바스크립트 초보들에게 많은 도움이 될것 같습니다. 
function getYoYDate() { 
    var thisYear = IQIndex.getIndex("001").getDate(0).getFullYear() ;
    var thisMonth = IQIndex.getIndex("001").getDate(0).getMonth() + 1;        
    var YoYYear;
    var YoYDate; 
    if (thisMonth >= 1 && thisMonth <= 3) {
        YoYYear = thisYear - 2;
        YoYDate = YoYYear + '-12-01';
    }   
    else if (thisMonth >= 4 && thisMonth <= 5) {
        YoYYear = thisYear - 1;
        YoYDate = YoYYear + '-04-01';
    }       
    else if (thisMonth >= 6 && thisMonth <= 8) {
        YoYYear = thisYear - 1;
        YoYDate = YoYYear + '-06-01';
    }       
    else if (thisMonth >= 9 && thisMonth <= 11) {
        YoYYear = thisYear - 1;
        YoYDate = YoYYear + '-09-01';
    }  
    else if (thisMonth === 12) {
        YoYYear = thisYear - 1;
        YoYDate = YoYYear + '-12-01';
    }      
    var Offset = getWorkingDayOffset(YoYDate);  
    logger.debug( 'YoYDate:' + YoYDate + ' , Offset:' + Offset );
    return Offset;
}
 
감사합니다.
소포클레스 2021.12.11 00:18
소포클레스님의 예시 코드를 보니, 300 거래일 과거로는 너무 부족하겠네요. 제한이 없이 적용 가능하도록 다시 점검해서 개선해 보겠습니다.^^
Joseph 2021.12.11 10:56
Joseph님, 제 질문에 답변 뿐만 아니라 이렇게 개선까지 해주시니 너무 감사하고 감동입니다.

현재 퀀트 백테스트 서비스가 많이 등장하고 있지만, '특정 시점에서의 밸류, 지표'로 종목을 필터링하는 것으로 제한되어 있어 많이 아쉬웠습니다. 저PBR, 저PER 등 저밸류에이션 기업의 필터링도 분명 알파가 있는 것으로 확인됩니다만, 과거 데이터를 통계적으로 분석하고 이를 밸류에이션에 활용하면 더 나은 알파를 만들 수 있을 것이라고 생각합니다. 어떠한 기업은 상장 이후 단 한번도 PBR 1을 넘겨보지 못했고, 어떠한 기업은 상장 이후 PBR 2 미만이 된 적이 아예 없기도 합니다. 일반적으로 생각하는 PBR 1이 저평가/고평가의 기준이라면, 그래서 주가고점에서조차 PBR 0.9인 기업을 저평가로, 주가저점에서조차 PBR이 2인 기업이 고평가로 말하게 된다면, 지나치게 종목의 유니버스를 narrow-down 해버리고, 투자자의 관점을 제한하지 않을까 생각합니다.

예를 들어 삼성전자의 과거 10년의 PBR은 0.9~1.8 가량에서 움직였습니다. 그러면서 이익잉여금이 누적되며 자본총계는 늘었기 때문에, 0.9*BPS를 저점으로 1.8*BPS를 고점으로 하는 매수매도 전략을 생각해볼 수 있을 것 같습니다. 아프리카TV는 PBR 4~9 가량에서 움직였습니다(단, 최근 사업모델이 달라지면서 역사적 PBR 상단을 돌파). 결국 PBR 밴드차트의 하단에 매수하여 상단에 매도하는 전략입니다. 제가 생각하기에는 괜찮은 방법이라 판단되나, 이 방법이 전체 시장에서 알파를 만들 수 있는 전략인지 혹은 우연히 운이 좋았던 것인지 늘 찝찝했었습니다. 이를 백테스트하기 위해서는 특정종목의 n년(적어도 3~5년)에 해당하는 PBR 표본이 있어야 하고, 표본 내에서 현재 PBR의 백분위수를 알아야 하는데, 비슷하게 구현해볼 수는 있겠지만, 이러한 것이 가능한 백테스트 서비스는 아직 없는 것 같습니다.

Joseph님께서 말씀하신대로 해당 기능이 내재화 되어 제한 없이 적용가능해진다면 위 뿐만 아니라 여러 아이디어를 적용해볼 수 있을 것 같습니다. 다시 한번 사소한 저의 의견에도 귀를 기울여주시고 반영해주신 점 감사합니다.
서광원 2021.12.11 18:04
오늘 공지사항에 올라온 것처럼 이번에 과거 참조 가능한 거래일을 300 거래일에서 600거래일로 늘렸습니다. 일단 이렇게 늘리면 2년 전 (정확히는 2년 4개월?)까지는 확실히 조회가 가능하게 됩니다.

더 먼 과거까지 조회 가능하게 하고자 부하 테스트를 많이 해 보았는데요, 그렇게 되면 서버 가용성이 너무 낮아지면서 저희가 서버를 몇 배로 더 증설해야 되는 상황이 발생할 것 같습니다. 그래서, 일단은 2배까지만 늘려서 적용하고 추후에 효율적인 서버 운영 방안이 마련되면 더 늘려 나가도록 하겠습니다.
Joseph 2022.02.28 16:45
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글