[runon] 개발언어, 미들웨어

 개요 runon 은 종 3가지 개발 언어를 사용합니다. java, python, dart(flutter) 미들웨어 2가지를 활용합니다 postgresql, redis  그리고 직접 설게해서 구현한 파일시스템를 이용합니다. 파일시스템의 파일구조는 thread당 접근해서 분석할 수 있는 단위로 파일이 나뉘어져 있습니다. 테라 단위가 넘는 데이터를 분석에 이용하기 때문에 분산처리에 효율적인 데이터 구조를 직접 설계해서 개발하고 있습니다. java java를 사용한 이유는 분산처리, 분석 알고리즘, 코어기술과 같은 복잡한 개발을 할때 가장 익숙한 컴파일언어가 편해서 입니다. 10년넘게 주언어로 사용한 언어라 직접 개발한 각종 라이브러리가 많이 있습니다.  python 데이터 분석에 유리한 많은 라이브러리, 머신러닝, AI를 활용하려면 python은 필수 입니다. 이미 만들어진 수많은 도구를 잘 활용하기 위해 사용합니다. flutter(dart) 여러 언어와 개발환경을 사용하기에 기존 주언어(java)와 유사한 코드를 제공하는것을 이용하고자 하는 용도와 멀티 플랫폼을 지원하기 때문에 적은 인력으로 가장 효율적으로 UI를 구성할 수 있는 선택지였습니다. 모바일, 데스크탑, web, AOT 기기들에 사용되는 화면을 하나의 언어와 프레임웍으로 동시접근이 가능한건 엄청난 매력입니다.  flutter 에서 자체제공하는 머티리얼 디자인으로 인해서 디자이너 없이도 어느정도 퀄리티가 나오는 화면을 구성할 수 있습니다. 특히 퀀트는 화면의 중요도가 다른 프로젝트에 비해 적기때문에 효율성 높은 환경이 중요합니다.

턴어라운드 가능성 (현대건설, 한화솔루션)

개요  항상 턴 어라운드 가능성이 높은 종목을 찾는 방법에 대해 고민 합니다. 개인적으로는 가장 안전하면서 수익성도 높은 투자 방법이라고 생각합니다. 올해 턴어라운드 가능성이 투자했던 종목은 3종목입니다. 현대건설 : 매입단가 25000 ~27000원부근 (이후 85100원까지 상승) 한화솔루션: 매입단가 18000 ~ 22000원부근  (이후 40750원까지 상승) 엔씨소프트: 매입단가 138000~ 150000, 152500[MSCI 편출 리벨런싱 종가]  (이후 218000원까지 상승 글 작성기준으로는 아직 진행중) 최고가에서 매도하진 못했지만 크게 이익을 보고 차익 실현 하였습니다. 현시점에서는 위에 종목들은 매입 단가보다 이미 많이 오른 상황이라 매력은 떨어집니다. 어떤 관점으로 위에 종목들에 투자했는지 정리합니다.  기업의 매출 매출은 그 기업의 상품성입니다. 기업의 매출이 지속적으로 상승하거나 유지되고 있고, 영업이익이 좋지 않아진 경우에, 영업이익이 좋아질 가능성이 있을지 를 분석합니다. - 현대건설 투자 시기에 시가총액은 3조도 안되었는데 매출은 년 32조였습니다.  - 한화솔루션 투자 시기에 시가총액은 3조도 안되었고 매출은 12조 4천억 수준이었습니다. 두기업다 매출이 유지되거나 지속적으로 늘어나고 있었고 영업이익율이 개선될 수 있는 방향성이 보였습니다. 가격이 낮은지 기업이 관심을 받지 못하거나 관련 업종이 좋지 않으면 주가는 크게 하락합니다. 현대건설 투자 당시에는 건설업 연쇄부도 관련 언론이슈가 나오던 시기였고 한화솔루션은 트럼프 대통령 당선으로인해 태양광 미래가 좋지 않다는 인식이 강한 시기 였습니다. 그로인해 가격은 심각하게 하락한 상태였고, 퀀트 도구들을 활용해 지금 사도 리스크가 충분히 낮은지를 확인 하였습니다.  미래 방향성(시나리오) 현대건설은 아래와 같은 시나리오를 생각하였습니다. - 경기를 살리기 위해 건설 관련 공사가 많아질 것으로 예상 - 데이터센터, 원자력발전소, ...

[java] runon jdbc 라이브러리

이미지
  개요 https://github.com/runonio/stock 과 같은 runon의 프로젝트를 보면 직접 개발한 jdbc를 사용합니다. 관련 라이브러리를 개발한 시기는 대략 2013년 쯤으로 기억하는데 이때에는 mybatis 가 유행하던 시기로 지금 많이 사용하는 jpa 가 국내에서 잘 사용되지 않던 때였습니다. 수백만 단위의 데이터를 불러와서 수억건의 row 를 저장하는 일들이 있었는데 프레임웍에서 동작하는것보다 low level 까지 들어가서 조작하고 싶어서 제작 하였습니다. 오픈소스로 제공되는 라이브러리 입니다. https://github.com/runonio/commons modules -> jdbc 에서 사용할 수 있습니다. 그당시 상황 항상 사용되는 2천만 가량의 row 데이터가 있고, 이 row 데이터를 기반으로 매일 수백만건의 문서를 분석해야 하는 일이 있었습니다. 당시에는 분석결과 또한 오라클 엑사데이터에 구성하길 원하는 금융권이 많아서 대량 select 도중 데이터를 받는기능, 대량 insert 관련된 부분이 필요한 시점이었습니다. 그래서 2천만 가량의 row 는 싱글턴으로 메모리 인덱스 구조를 생성하여 미리 올려놓고 활용하는 형태로 개발을 하였는데 복잡한 쿼리가 필요 없을때가 많았고 불러온 이후에 java 객체로 변환하는 과정이 귀찮고, 단순쿼리를 짜는것도 귀찮아서 개발 하였습니다. 또 당시는 dump, link 권한이 없는 상태에서 db 데이터를 이관시키는 일 oracle -> mysql, mysql -> oracle, oracle -> mssql 등으로 서로 다른 db 시스템으로 이관시키는 일등이 많이 생기는 시기였는데 이러한 경우에 중간에 jdbc를 이용해서 프로그램 적으로 편하게 옮길 필요가 있었습니다. 이러한 상황에서 사용 DB를 설계하기전에 아래처럼 도메인 헤드별 타입을 정의하고, 용어사전을 만들어서 사용하는 경우가 많았는데 당시에는 이러한 규칙이 잘 지켜지지 않으면 데이터 품질평가 점수가 좋지 ...

[java] 파일 라인수 얻기, 특정라인 빨리 읽기 (빠른 라인처리)

  개발을 하던중 데이터 시스템을 제작할 일이 생겨서 java 로 복잡하지 않은 시스템을 만들기로 하였습니다. 아래와같이 간단한 설계를 진행하였고 .. 데이터는 json object 단위로 파일의 한라인에 입력 병렬 접근이 가능하게 하기위해 파일을 설정한 용량으로 나누어서 생성 각 데이터의 인덱스는 파일경로, 라인위치로 지정함 위 요건들을 충족하기 위해서 빠른 속도로 파일 라인수를 읽고 특정라인을 빨리 읽어오는 부분이 필요하게 되었습니다. 소스 https://github.com/runonio/commons modules -> commons 에서 사용할 수 있습니다. int count = FileUtil . getLineCount ( filePath ); String lineValue = FileUtil . getLine ( filePath , 77 ) 성능비교 성능 비교에 사용한 소스 //java.io 패키지 사용 try ( BufferedReader br = new BufferedReader ( new InputStreamReader ( new FileInputStream ( file ), charSet ))){ String line ; while (( line = br . readLine ()) != null ) { } } catch ( IOException e ){ throw new IORuntimeException ( e ); } //java.nio 패키지 사용 try ( Stream < String > lines = Files . lines ( Paths . get ( path ), StandardCharsets . UTF_8 )) { //noinspection OptionalGetWithoutIsPresent return lines . skip ( lineIndex ). findFirst (). get (); } catch ( IOExceptio...