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

Z-Score로 팩터 결합하기

koa55 2020.08.19 18:53 조회수  554 추천 2


  LimSung Hyun님께서 말씀하신게 이런 형태가 맞나요?

주식시장 전 종목 수가 2100개 내외라 targetSize를 10배 정도 쓰면 기간 관계없이 전 종목이 잡힐 것 같습니다.


  코딩에 오류가 없다는 전제하에...

해당 기간동안 이 전략에서 지표값 NaN,Infinity는 나오지 않아서 결측치는 없었던 것 같고

100종목까지 확장해도 일반 순위값을 쓴 것과는 차이가 없었습니다.


  그럼에도 의문이 들었던 점은

1. 인텔리퀀트에서는 지표값에 이상이 있으면 제거가 아니라 다른 수로 대체되는데 그래도 정규화가 유의미한가?

2. 결측치가 없더라도 분포, 표준편차가 다르고, 순위값 랭킹과 분위값 랭킹이라 차이가 있을거라 생각했는데 그렇지 않았다.

    (이 조건에서만 그럴수도 있겠습니다.)

3. 인텔리퀀트에 결측치가 있는가?

입니다.

댓글 7
정규화하는 과정 맞는 거 같습니다. 저 혼자 복잡하게 고민한 것에 비해 구성은 간단하네요. 저번에 팩터유니버스 올려주신거 처럼 배열리스트를 하나하나 다 작성해야 하나 했는데 블록코딩으로도 배열 만드는 게 따로 있었네요. 감사합니다.

저도 몇가지 팩터로 정규화순위, 통합순위 비교해봤는데 대부분 비슷하게 나오더군요. 말씀하신대로 인텔리퀀트에서 자체적으로 이상치나 결측치를 제거하거나 대체하는 방법을 써서 그런거 같기도 합니다. 그 부분은 메일로 따로 질문해보겠습니다
LimSung Hyun 2020.08.20 00:26
네 답변 오면 보내드릴게요^^
LimSung Hyun 2020.08.20 00:49
이메일로 문의하신 내용을 여기에 답변을 드리겠습니다:
이상치, 결측치를 자체적으로 처리하도록 하는지 질문 주셨는데요...
당연히 블록을 사용하실 때 기본 지표들이 문제없이 계산되도록, 0으로 나눗셈이 될만한 상황이거나 모멘텀 계산인데 과거 주가가 0 (즉, 상장 이전 같은 상황) 이거나 하면 모두 필터링 되도록 조치를 해 놓습니다.

보다 자세히 처리 방법을 알고 싶으시면, 블록 알고리즘을 "스크립트로 내보내기" 하셔서 해당 지표계산 함수들을 찾아 보시면 이해가 되실 것 같습니다.
인텔리퀀트 2020.08.21 13:01
참고로, 원문에 1, 2, 3으로 의문을 품으신 부분에 대하여..

1. 지표값이 이상하면 (예를 들어 0으로 나누기 같은 상황) 함수의 리턴값으로 -99999999 를 대체하여 주도록 하는데, 이 값은 함수를 호출한 부분에서 제거를 하지 않으면 순위 점수가 가장 나쁘게 되도록 만들어 줍니다. 예를 들어, PER 가 작을수록 높은 순위를 부여하려면 미리 음수인 것을 필터링하여야 제대로 작동을 할 수 있습니다. 만일 필터링하지 않으면 이 대체값 뿐 아니라, 당기순손실인 종목들도 무더기로 좋은 순위로 자리잡아 이 지표는 엉망이 되겠죠.
블록에서는 기본필터의 항목 중에 당기순손실 제외와 영업현금흐름 음수 제외 항목을 체크하도록 하여 이 부분을 사전에 방지할 수 있습니다. (무조건 제외시키려다가 사용자들이 인지할 수 있게 명시적으로 체크를 하도록 했습니다.)

2. 지표의 순위와 Z-score로 변환한 점수를 비교해 보면, 단일 지표만으로 최종 순위를 낸다고 하면 같을 것이고, 복합 지표로 종합점수를 낸다면, 지표별 단순 순위를 점수로 하여 총점을 낸 것보다는 Z-score로 변환한 점수를 합쳐서 총점을 내는 경우에 최종 종합 순위는 달라질 수 있습니다. 하지만, 저희 경험으로는 성과가 눈에 띄게 많이 차이나는 것은 아니고, 오히려 단순순위 합산일 때 더 좋은 경우가 많았던 걸로 기억합니다.

3. 인텔리퀀트에 결측치가 있는가?.... 라는 질문은 무슨 의미인지 정확히 모르겠지만, 혹시 종목 데이터가 누락된 것이 있는가? 라는 질문이시라면, 전혀 없다고 저희가 장담은 못하겠습니다. ㅜㅜ    열심히 데이터 작업을 하고 수고를 많이 하고 있음에도 이 많은 데이터를 관리하다 보면, 자칫 누락되거나 잘못된 값이 들어가 있는 경우도 아주 가끔 발생합니다. 이런 데이터가 발견되면 즉시 제보 부탁드립니다. ^^

첨언으로, Z-score를 계산하는데 블록으로 하려니 너무 어렵게 구현이 되는 것 같습니다. 스크립트로는 훨씬 간단히 구현될 수 있을 텐데요.... ㅜㅜ   
시계열 데이터 형태로 간편히 처리할 수 있는 블록들을 고민해서 향후에 추가해 보도록 하겠습니다.
인텔리퀀트 2020.08.21 13:21
자세한 답변 감사합니다!
koa55 2020.08.21 13:35
세세하고 친절한 답변 감사합니다
ParkAlex 2020.09.21 22:04
음 저 이거 코드 돌려보고 있는데 Z-score 로 바꿔서 합산한 후에 rank 를 하는게 아니라 Z-score 로 바꿔서 rank 를 하고 거기에 다시 합산을 하면 PER, PBR 의 rank 에 바로 sum 하는 거랑 차이가 없는 것 아닌가요?
Myungbo Kim 2020.12.09 12:55
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글