솔버의 사용과 대체, 빠른 서버 사용

현대포트폴리오이론의 적용은 컴퓨터기술 영역에서는 일종의 옵티마이징이 될 것입니다.

그런데 몇가지 종류의 수치만을 사용하는 마코위츠 모델 같은 경우 사소한 변수에 의해 많은 부분을 다같이 결정하고 선택하는 문제가 발생합니다. 그래서 블랙-리터만이 새로운 모델을 만든 것이기도 합니다. 투자자의 의향이라는 변수를 집어넣는 것은 전체 투자자들의 집합에서 봤을 때 투자할 자원들의 고른 분배에 도움이 되는 것을 볼 수 있습니다.

우리는 블랙-리터만의 모델을 잘 적용시키기 위해 오래 연구해 왔습니다. 이는 블랙-리터만의 모델이 유명해서 증권회사들마다 더 잘 적용하려고 노력하는 현실이 있었기 때문이기도 합니다. 단순한 투자자의 의향이 아닌 ‘전문투자자의 이유있는 의향’이 될수록 이 모델은 효과를 더 발휘할 여지가 있습니다.

그래서 블랙-리터만의 모델을 효과적으로 적용시키기 위한 컨스트레인트(제한조건)들을 다수 설정함으로 투자자의 의향이 반영되게 만들었습니다. 오늘날에는 투자자의 의향이라는 변수로 전체 투자를 고르게 발생시키는 것에서 지나 아예 그 시점마다 효과적인 리밸런싱을 통해 더 나은 포트폴리오 구성을 얻는 데 초점이 맞춰지고 있습니다. 우리도 첫째는 최적의 컨스트레인트를 주고, 둘째는 훌륭한 예측에 기반한 수시 재계산을 통해 적절한 리밸런싱을 하는 방법들로 이 추세를 따르거나 심지어 앞서 나가도록 노력해 왔습니다.

솔버를 포함한 옵티마이저 분야에서 독보적인 회사는 Gurobi입니다. 구로비 솔버는 이 연구를 처음 시작한 몇년 전 가장 뛰어난 프리웨어 옵티마이저보다 속도에서 80배 앞설뿐 아니라 보통의 옵티마이저들이 풀지 못하는 다양한 조건들 하에서도 해답을 찾아내는 능력이 뛰어났기 때문에 이것을 쓰고 싶었습니다. 문제는 높은 비용이었는데, 그 때문에 테스트를 신청하고 그 테스트 기간에 Gurobi 솔버를 파이썬 라이브러리로 사용해서 계산할 수 있었습니다.

10개 정도의 컨스트레인트를 주고 그 조건을 만족하는 포트폴리오들로만 출력한 이피션트 프론티어를 통해 원하는 포트폴리오를 얻었는데, 이것은 현대적인 블랙-리터만 모델에 가까운 것이기도 했습니다.

우리는 높은 비용이 드는 Gurobi 솔버를 이용하기보다 다른 선택으로 비슷한 결과를 만드는 것을 선택했습니다. 이것을 하기 위해서는 다음과 같은 함수가 필요합니다.

입력:

  • 일별이익률 데이터프레임
    이 데이터프레임의 인덱스는 {‘Date’: ‘2021-01-01’ 형식의 문자열}, 칼럼은 {‘Ticker’: 종목 문자열}, 내용은 일별로그이익률
  • 컨센트레이트
    예를 들어 SPY를 SH 이상으로 유지한다는 조건이라면 Gurobi Solver 및 IBM Cplex의 경우 다음과 같이 입력합니다.
    Gurobi 경우 (SPY, grb.GRB.GREATER_EQUAL, vars.SH)
    Cplex 경우 (vars.SPY >= vars.VIXM)

그러나 이런 범용성이 필요한 것이 아니기 때문에 우리는 A가 B보다 많을 조건 같으면 수식 입력 대신 종목 A, B만을 입력으로 받게끔 만들어 나가고 있습니다. 사용할 조건은 두 종목의 상대적 크기 관련 5개를 우선 사용하고 이후에 10개 정도로 늘릴 예정입니다.

출력:

  • 위험감수성향에 따른 포트폴리오 데이터프레임
    입력된 데이터프레임의 Ticker 칼럼을 그대로 칼럼으로 하고 인덱스를 {‘risk’: 1부터 5까지 고객의 위험감수 성향에 따른 r1 ~ r5}로 합니다. 내용은 해당 리스크당 그 종목이 포트폴리오에서 가질 비율이 됩니다.
  • 그래프
    그래프를 그리는 것은 계산 자체에는 중요하지 않기 때문에 빼도 됩니다.

이러한 입력과 출력을 가지는 함수를 계속 재사용하여 실시간으로 그때마다의 이피션트 프론티어를 구하는 것을 통해 블랙-리터만 모델의 최신 적용에 도움을 받을 수 있습니다.

우리는 이 모든 데이터를 빠르게 처리하고 계산하여 여러 사용자들에게 동시에 혜택을 줄 수 있는 서비스를 만들기 위해 노력해 왔습니다. 그래서 데이터베이스에서 입출력을 하는 시간 자체도 절약하기 위해 전체 데이터를 3차원 구조로 메모리에 넣어 빠르게 처리하고 있습니다.

그런데 빠른 서비스를 위해서는 솔버의 속도나 데이터의 입출력보다 더 중요한 것이 서버의 처리능력임을 생각하게 되었습니다. 이것을 위해 어떤 웹서버를 사용할지를 정해야 했는데 최종적으로 uWSGI-제벤트, NGINX 조합을 사용하기로 했습니다. 제벤트(G이벤트)는 비동기 이벤트처리 부분에서 최근에 각광받고 있고 엔진엑스는 아파치를 성능에서 월등하게 앞서며 빠르게 대체해 가고 있습니다.

이것은 각 서버들의 응답시간 그래프인데 보통의 서버들에 비해서 노드제이에스의 응답이 역시 매우 빠름을 알 수 있습니다. 거래소 또는 네이버 같은 포털서비스 업체들에서 주된 영역에서 채택하는 노드제이에스인 만큼 당연한 것이기도 합니다.

그런데 uWSGI의 응답시간을 주목해 본다면 노드제이에스를 능가하는 것으로 보입니다.

처리량 관점에서는 이런 그래프가 나왔습니다. 역시 노드제이에스가 뛰어나긴 하지만 uWSGI가 훨씬 많은 동시처리량을 보입니다.

우리는 인공지능 사용에 필수적인 파이썬과 연계된 상용서버에는 uWSGI를 쓰기로 결정했습니다. (또는 경우에 따라 Passenger WSGI를 쓸 수도 있습니다.)

루미네움은 인공지능/메타버스 연구개발 외에도 옵티마이징을 포함한 각종 계산, 데이터 처리, 웹서버 응답 등에서 최적의 솔루션을 만들 수 있도록 연구개발을 계속할 것입니다.

Scroll to Top
Share via
Copy link
Powered by Social Snap