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

몇 가지 (스탁 필터, 검색 등) 문의사항

칸트 2018.03.02 14:36 조회수  539 추천 0


코드 한 번 살펴봐 주시기 부탁드립니다.

ㅠ.ㅠ


여쭤보는 김에..

지금 이 전략은 보시다시피 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가 뜹니다.

이것을 정수 등으로 보이게 하는 방법이 있을까요?

(아니면 계산되어진 것이니 그냥 무시하고 그대로 따르면 될까요?)


고맙습니다.


댓글 12
안녕하세요. 칸트님 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;  }

그럼 수고하세요
소포클레스 2018.03.02 17:20
@ 소포클래스
고맙습니다.
그런데, 1번 항목에서 return false로 바꾸었는데
2018-03-02] KINDEX 미국4차산업인, A280320
[2018-03-02] 롯데제과, A280360
[2018-03-02] ARIRANG 주도업종, A280920
[2018-03-02] 케이씨텍, A281820
[2018-03-02] KBSTAR 중소형고배당, A281990
[2018-03-02] KBSTAR 국고채3년선물, A282000
[2018-03-02] BGF리테일, A282330
[2018-03-02] 동아타이어, A282690
[2018-03-02] KODEX 중국본토CSI300, A283580
[2018-03-02] KBSTAR 지주회사, A283930
[2018-03-02] KODEX 200미국채혼합, A284430
[2018-03-02] 쿠쿠홈시스, A284740
[2018-03-02] KBSTAR 200금융, A284980
[2018-03-02] KBSTAR 200에너지화학, A284990
이렇게 일반 종목도 섞여 나옵니다.;;;; 제가 뭘 잘못한걸까요 ㅠ
4번의 알려주신 코드에서 (bp(stock))은 (value)로 고치면 되는 것인지요?
칸트 2018.03.02 19:03
아아.. 4번은 이해가 되었습니다. 무한대가 나오는 계산된 function 함수명을 넣는 것이군요. ㅎㅎ
칸트 2018.03.02 19:09
4번도 안 되네요;;; 좀 있다가 코드 전체를 올려보겠습니다.
어디서 잘못된 것인지..한 번 봐주시기 부탁드립니다. ㅠ.ㅠ
칸트 2018.03.02 19:12
네 칸트님 코드 올려주시면 보겠습니다 
소포클레스 2018.03.02 20:28
칸트님 1번은 아래처럼 하시면 됩니다. 
function stockFilter(stock) {
   var pattern = /인버스|레버리지|채권|\(H/                      
   if ( stock.isETF && ! ( pattern.test(stock.name) ) ) { return true; };  
   return false;
}    
소포클레스 2018.03.02 22:16
안 되네요;; ㅎㅎ 애써주셔서 고맙습니다. ^^
칸트 2018.03.03 14:08
우선 수작업으로 일일이 문자가 포함된 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를 모두 유니버스에 담아버립니다
Prophit 2018.03.03 15:05
칸트님 제가 해보니 잘되는데요.
아래 이름중에 선물인과 선물레는 각각 선물인버스와 선물레버리지로 판단되어 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 의 앞에 (가 특수문장기 때문에 \를 사용했습니다.
소포클레스 2018.03.04 00:06
소포클래스님 고맙습니다. ^^ 마지막 알려주신 코드로 하니 걸러지네요^^
설명도 고맙습니다. 또 하나 배웠습니다.
프로핏님 고맙습니다. 순서대로 작동하는 것을 잊어버렸었네요;;
좀 다듬어서 저도 게시라는 걸 해보고자 합니다. ㅎㅎ
칸트 2018.03.05 10:21
그러고 보니 모멘텀 필터 펑션에서,
logger.debug('point = ' + m12_mo(stock)); 의 값이 왜 로그에 2번씩 찍힐까요? ㅠ.ㅠ
코드 좀 잡아주시기 부탁드립니다. ㅠ.ㅠ
칸트 2018.03.07 23:16
 basket.buildPortfolio();   
   basket.reset();
   basket.targetSize = MAX_SIZE;
   basket.buildPortfolio();

빌트포트폴리오를 2번해서 그런거 같은데요
Prophit 2018.03.11 10:36
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글