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

(블록알고리즘) '베타계수 구현하기' 조언을 구합니다.

koa55 2020.01.24 15:24 조회수  517 추천 0

몇주전부터 블록알고리즘으로 베타계수를 만들며 시행착오를 겪고있는데 쉽지 않아 회원님들의 조언을 구합니다.


현재까지 문제점은 실행은 되긴하나 연산이 많아서 그런지 계속 시간초과가 납니다. 이 문제는 알고리즘을  획기적으로 개선하거나


다른 필터들을 적용후에 최종필터로 이용하여 연산대상을 줄여서 써야 할 것 같고,  더 큰 문제는 블록알고리즘이고 제가 프로그래밍이 능숙하지 않다보니


블록으로 봐도 스크립트로 봐도 더 이상의 문제점을 찾기가 힘듭니다... 짧은 시간이라도 한번 봐주시고, 한줄 조언이라도 해주신다면 감사하겠습니다.


베타계수를 구현하려는 목적은 포트폴리오 방어를 위해 low beta 주식만을 대상으로 유니버스를 구성하거나, 시장 모멘텀에 따라


포트폴리오 베타를 액티브하게 조절하고자 합니다.


베타계수의 산식은 (주식수익률과 코스피수익률의 공분산) / (코스피 분산) 


공분산은 편차곱의 평균, 분산은 편차제곱의 평균으로 계산하였습니다.




일단 그간의 과정을 나열하자면..


1. 처음에 매개변수 없이 함수를 짰더니 stock이 지정되지 않았다고 오류가 나서 매개변수를 넣어주긴 했는데 그게 맞는건지 잘 모르겠습니다. 

 어차피 수정종가를 불러올 때 stock이 지정될거라 생각했는데 그게 아니었나 봅니다. 어쨌든 매개변수 지정후에 실행이 되긴 했습니다.


2. 연산을 수행하는 과정에 문제가 있는건지, 계산 로직 자체를 잘못짠건지 모르겠으나 필터에 '베타>0.5'를 하든 '베타<0.5'를 하든 첫달 이후에는 종목이 나오지 않습니다. 


3. 저번 글에서 Joseph님이 피드백 주신대로 리밸런싱시 선행작업에서 함수를 호출하고 필터에서 변수를 꽂아주었으나

Cannot read property "getAdjClose" from undefined in <eval> at line number 15 오류가 납니다. 필터에서 함수를 직접 호출하면 실행은 됩니다.



스크립트가 편하신 분들은 전환해서 보시고 피드백 주셔도 됩니다. 제가 좀 더 공부해볼게요 ^~^ 


연산이 많으니 테스트하실 땐 1차로 유니버스를 구성한 후에 해보시길 추천드리구요.. 


다들 설 잘보내세요 ~ !


댓글 3
1. 함수를 만드실 때, 만일 그 함수가 포트폴리오 블록에서 유니버스내의 필터링 과정 또는 필터링 후에 지표 계산하는 과정에서 모든 종목에 대하여 각각 계산을 하는 함수라면, stock이라는 이름으로 매개변수를 넘겨 주셔야 하는게 맞습니다. 
2. 베타 계산하는 함수 내에서, Sum_Kospi_Profit, Sum_Stock_Profit, Covar_y, Kospi_Var_y 등은 반복문을 수행하면서 매번 계산한 값들을 합산해 주는 변수들인데, 초기값을 0으로 설정해 주는 부분이 누락된 것 같습니다. 예를 들어, Beta함수 내의 첫번째 반복문을 시작하기 전에 ['Sum_Kospi_Profit'을 '0'으로 설정] 처럼 블록을 끼워 주시는게 필요합니다.
3번의 경우는 1번과도 관련 있는데요.. 이 경우에는 리밸런싱 선행작업에 넣는게 아니라 포트폴리오 블록에서 직접 호출하는게 맞습니다. 리밸런싱 선행작업에서는 유니버스 내의 개별 stock에 대하여 아직 알지 못하는 단계라서 stock을 매개변수로 넘겨 줄 수가 없습니다. 지난번에 조언 드린 경우는, 임의의 stock의 데이터를 사용하지 않으면서 '투자비중'처럼 포트폴리오 블록 내에서 벌어지는 일이라기보다는 미리 계산하는게 바람직한 경우에 리밸런싱 선행작업 부분을 활용하시는게 좋은 경우였습니다. 반면, 필터나 지표 계산처럼 각 개별 stock에 대하여 뭔가 계산을 하는 경우는 포트폴리오 블록 내에서 불러 주셔야 합니다.
Joseph 2020.01.26 17:39
2번에서 베타>0.5 또는 베타<0.5 를 해도 결과가 마찬가지로 잘 안 나오는 이유는 NaN 값이 찍히기 때문이네요. 이 경우도 지난번 올리신 전략에서 표준편차를 구하기 위해 볼린저밴드 함수를 활용하실 때 과거 데이터가 없는 종목의 경우 데이터가 엉망이 된 것처럼, 예전 데이터가 없는데 나눗셈을 하는 과정에서 NaN이 발생하여 결국 모든 값들이 NaN이 되어 버리기 때문입니다.

해결책은 지난번 푸른주전자님이 제안한 방법처럼 필터에 '수정종가 240일전'  > 0 을 조건으로 하셔서 나눗셈에 문제 없도록 해 주시면 될 것 같습니다.
Joseph 2020.01.27 00:07
감사합니다 !!  설명을 쉽게 해주셔서 금방 이해가 되네요.
말씀 주신대로 고쳐보겠습니다. 
koa55 2020.01.27 01:45
댓글 등록을 위해서 로그인해주세요.
 
최신 게시글