코드 한 번 살펴봐 주시기 부탁드립니다.
ㅠ.ㅠ
여쭤보는 김에..
지금 이 전략은 보시다시피 ETF에 상대모멘텀을 적용한 것인데요.
포트에 담긴 종목수(ETF수)를 상대모멘텀 점수대로 비중을 조절해보려고 할 때는 어떻게 해야 할까요?
(인텔리의 자산배분 전략은 아직 내부 용도로만 적용되고 있는 것으로 알고 있긴 합니다. 대표님이 예전에 덧글을...)
고맙습니다.
-------------------------------------------------------------------
안녕하세요.
1.
ETF를 유니버스로 구성해서 백테스트를 하는 중입니다.
전체 ETF 중 문자를 포함하는 ETF를 제외하려고 하는데 잘 안 됩니다.
function stockFilter(stock) {
if (stock.isETF) {return true;}
if (stock.name.substr(stock.name.length -4) === "레버리지") { return false; }
if (stock.name.substr(stock.name.length -3) === "인버스") { return false; }
if (stock.name.substr(stock.name.length -3) === "(H)") { return false; }
if (stock.name.substr(stock.name.length -2) === "채권") { return false; }
return false;
}
어느 부분을 고쳐야 해당 문자를 포함한 ETF가 걸러질까요?
2. 제목 및 본문, 리플 등 검색하는 부분이 있었으면 좋겠습니다.
찾기 등이 보다 수월할 것 같습니다.
3. 사용자 데이터
아직 막혀 있는데, 언제 정도 오픈이 가능하신지 여쭤보고 싶습니다.
4. 스코어(점수) 처리 문제
(스코어로 functon 처리하여,) 포트폴리오에 구성된 종목들의 스코어를 log.debug로 보니,
몇 몇 스코어에서 infinity가 뜹니다.
이것을 정수 등으로 보이게 하는 방법이 있을까요?
(아니면 계산되어진 것이니 그냥 무시하고 그대로 따르면 될까요?)
고맙습니다.
안녕하세요. 칸트님 1번과 4번 답변드리겠습니다. 1번은 아래처럼 정규식을 사용하는게 편리할 것 같습니다. 시뮬레이션 일자를 최근 하루치만 돌려보시기 바랍니다. (여러날을 돌리면 데이터가 중복해서 나오게 됨으로) function initialize() {} function stockFilter(stock) { //ETF 중에 인버스 혹은 레버리지 혹은 채권 혹은 (H 가 포함된 문자열을 찾는다. var pattern = /인버스|레버리지|채권|\(H/ if (stock.isETF && pattern.test(stock.name)) { return true; }; return false; } function onDayClose(now) { var universe = IQStock.filter(stockFilter); universe.forEach(function(stock) { logger.info(stock.name + ', ' + stock.code); }); } 위의 예제에서는 stockFilter에서 return true로 하였지만 사용하실때는 return false로 바꾸시면됩니다. 4번은 아래처럼 isNumber 함수를 추가하시고 stockfilter에서 걸러내면 됩니다. 저의 경우는 Infinite와 NaN은 측정불가한 수치이기 때문에 걸러냅니다. //Infinite(무한대)와 NaN(숫자가 아님) 걸러내기 function isNumber( value ){ return typeof value === "number" && isFinite( value ); }; 위의 함수를 선언하고 stockfilter에서 아래처럼 사용하시면 Infinite와 NaN를 걸러낼 수 있습니다. if ( ! isNumber( bp(stock) ) ) { return false; } 그럼 수고하세요칸트님 1번은 아래처럼 하시면 됩니다. function stockFilter(stock) { var pattern = /인버스|레버리지|채권|\(H/ if ( stock.isETF && ! ( pattern.test(stock.name) ) ) { return true; }; return false; }우선 수작업으로 일일이 문자가 포함된 ETF 제외하려면 if (stock.isETF != true) {return false;} // ETF가 아닌 일반 종목 제외 if (stock.name.substr(stock.name.length -4) === "레버리지") { return false; } // 문자 들어간거 제외 if (stock.name.substr(stock.name.length -3) === "인버스") { return false; } // 문자 들어간거 제외 if (stock.name.substr(stock.name.length -3) === "(H)") { return false; } // 문자 들어간거 제외 if (stock.name.substr(stock.name.length -2) === "채권") { return false; } // 문자 들어간거 제외 등등 제외시키려는 문자 모두 설정해주고 맨 마지막에 if (stock.isETF) {return true;} // 위에 모든 필터링 통과한 ETF만 담기 return false; } 맨 첫줄에 if (stock.isETF) {return true;} <-- 이게 있으면 아래에서 필터링 되기 전에 먼저 ETF를 모두 유니버스에 담아버립니다칸트님 제가 해보니 잘되는데요. 아래 이름중에 선물인과 선물레는 각각 선물인버스와 선물레버리지로 판단되어 FILTER 처리하고, 국채와 공채도 채권으로 판단되어 FILTER 처리 되었습니다. function initialize() {} function stockFilter(stock) { if (! stock.isETF) { return false; }; //ETF 가 아니면 버린다 var pattern = /인버|레버|선물인|선물레|채권|공채|국채|\(H/ if (! pattern.test(stock.name)) { return true; }; //이름에 인버스, 레버리지, 채권, (H) 가 포함된 종목은 버린다 return false; } function onDayClose(now) { var universe = IQStock.filter(stockFilter); universe.forEach(function(stock) { logger.info(stock.name + ', ' + stock.code); }); } 정규식을 사용하실때 | 는 OR입니다. 제거할 필터가 여러개 일때 슬래시 / 와 / 사이에 제거할 필터를 | 로 구분하여 여러개 넣으시면 됩니다. 그리고 특수문자 앞에는 역슬래시 \를 사용해야 제대로 걸러집니다. 위의 예제에서는 (H 의 앞에 (가 특수문장기 때문에 \를 사용했습니다.그러고 보니 모멘텀 필터 펑션에서, logger.debug('point = ' + m12_mo(stock)); 의 값이 왜 로그에 2번씩 찍힐까요? ㅠ.ㅠ 코드 좀 잡아주시기 부탁드립니다. ㅠ.ㅠ