프로젝트/비트코인 자동매매

급등주 찾기 쿼리 - PostgreSQL 버전

Tech&Fin 2022. 5. 3. 10:28
반응형

예전에 업비트 급등주 찾기 프로그램을 공유 드린적이 있었는데요. 급등주를 찾는 쿼리가 오라클 데이터베이스로 되어 있어 PostgreSQL 쿼리를 문의하시는 분이 많았습니다.

 

오라클과 PostgreSQL은 문법이 조금 다르기 때문에 쿼리를 조금 변형해야 하는데요. 이번 시간에는 급등주 찾기 쿼리를 PostgreSQL로 작성해 보는 시간을 가져 보도록 하겠습니다.

 

 

목차 - 클릭하면 이동합니다.

     

    업비트 급등주 찾기 쿼리 - PostgreSQL

    급등주 찾기 쿼리 

    CREATE OR REPLACE VIEW FIND_SHOOT_1MIN AS 
     SELECT A.CODE,
        A.DATETIME AS ST_DATETIME,
        B.DATETIME AS EN_DATETIME,
        A.MIN_PRICE AS ST_PRICE,
        B.MAX_PRICE AS EN_PRICE,
        C.MIN_PRICE,
        C.MAX_PRICE,
        C.TRADE_VOL,
        C.TRADE_CNT,
        ROUND((((B.MAX_PRICE - A.MIN_PRICE) / A.MIN_PRICE) * (100)::NUMERIC), 2) AS CHG_PCNT
       FROM ( SELECT TD.CODE,
                MIN(TD.DATETIME) AS DATETIME,
                MIN(TD.TRADE_PRICE) AS MIN_PRICE,
                MAX(TD.TRADE_PRICE) AS MAX_PRICE,
                ROUND(SUM(TD.TRADE_PRICE * TD.TRADE_VOLUME)) AS TRADE_VOL,
                COUNT(TD.TRADE_VOLUME) AS TRADE_CNT
               FROM TICKER_DATA TD
              WHERE (((TD.CODE)::TEXT, TD.DATETIME) IN ( SELECT TD_1.CODE,
                        MIN(TD_1.DATETIME) AS ST_DATETIME
                       FROM TICKER_DATA TD_1
                      WHERE ((TD_1.DATETIME >= DATE_TRUNC('MINUTE'::TEXT, CURRENT_TIMESTAMP)) AND (TD_1.DATETIME < DATE_TRUNC('MINUTE'::TEXT, (CURRENT_TIMESTAMP + '00:01:00'::INTERVAL))))
                      GROUP BY TD_1.CODE))
              GROUP BY TD.CODE) A,
        ( SELECT TD.CODE,
                MAX(TD.DATETIME) AS DATETIME,
                MIN(TD.TRADE_PRICE) AS MIN_PRICE,
                MAX(TD.TRADE_PRICE) AS MAX_PRICE,
                ROUND(SUM(TD.TRADE_PRICE * TD.TRADE_VOLUME)) AS TRADE_VOL,
                COUNT(TD.TRADE_VOLUME) AS TRADE_CNT
               FROM TICKER_DATA TD
              WHERE (((TD.CODE)::TEXT, TD.DATETIME) IN ( SELECT TD_1.CODE,
                        MAX(TD_1.DATETIME) AS ST_DATETIME
                       FROM TICKER_DATA TD_1
                      WHERE ((TD_1.DATETIME >= DATE_TRUNC('MINUTE'::TEXT, CURRENT_TIMESTAMP)) AND (TD_1.DATETIME < DATE_TRUNC('MINUTE'::TEXT, (CURRENT_TIMESTAMP + '00:01:00'::INTERVAL))))
                      GROUP BY TD_1.CODE))
              GROUP BY TD.CODE) B,
        ( SELECT TD.CODE,
                MAX(TD.DATETIME) AS DATETIME,
                MIN(TD.TRADE_PRICE) AS MIN_PRICE,
                MAX(TD.TRADE_PRICE) AS MAX_PRICE,
                ROUND(SUM(TD.TRADE_PRICE * TD.TRADE_VOLUME)) AS TRADE_VOL,
                COUNT(TD.TRADE_VOLUME) AS TRADE_CNT
               FROM TICKER_DATA TD
              WHERE ((TD.DATETIME >= DATE_TRUNC('MINUTE'::TEXT, CURRENT_TIMESTAMP)) AND (TD.DATETIME < DATE_TRUNC('MINUTE'::TEXT, (CURRENT_TIMESTAMP + '00:01:00'::INTERVAL))))
              GROUP BY TD.CODE) C
      WHERE (((A.CODE)::TEXT = (B.CODE)::TEXT) AND ((A.CODE)::TEXT = (C.CODE)::TEXT));

    위의 쿼리를 이용하여 1분동안 급등하는 종목을 찾는 VIEW를 생성합니다.

     

    해당 쿼리는 조회 속도를 위해 1분간의 데이터만 조회한 후 시가, 종가, 최고가, 최저가를 구한 후 상승률을 구하도록 되어 있으며 총 3개의 서브쿼리를 사용하여 데이터를 산출하도록 되어 있습니다.

     

    PostgreSQL의 내장함수를 이용하여 라인수를 줄일수도 있겠지만 쿼리는 가독성도 중요하기 때문에 최대한 알아보기 쉽도록 작성해 보았습니다.

     

    쿼리는 아래와 같이 아이디어를 기반으로 작성하였으니 참고하시면 좋을 것 같습니다.

     

    현재 조회 시점이 2022년 5월 3일 09시 01분 30초라고 한다면 아래 구간의 데이터를 가져 옵니다.

     

    1. 시작시간 : 2022년 5월 3일 09시 01분 00초

    2. 종료시간 : 2022년 5월 3일 09시 01분 59초

     

    시가를 구하기 위해 시작시간의 MIN_PRICE를 가져오게 되는데 즉 09시 01분 00초의 거래가격 중 MIN 가격을 가져오게 됩니다.

     

    마찬가지로 종료시간보다 가장 큰 MAX 시간을 최종 거래가 발생한 시간으로 판단하고 해당 시간에 발생한 거래 중 가장 큰 MAX_PRICE를 가져와서 종가로 간주합니다.

     

    마지막으로 시작시간과 종료시간 구간 중의 MIN 과 MAX 값을 가져와 구간 중 최저가와 최고가를 산출합니다.

     

    마지막으로 위의 데이터를 이용해서 구간내 상승률을 계산합니다.

     

    해당 VIEW를 생성하기 위해서는 기초가 되는 거래내역 데이터가 계속해서 쌓이고 있어야 하며 해당 내용은 아래 포스팅을 참고 부탁 드립니다.

     

    2022.02.23 - [프로젝트/비트코인 자동매매] - 업비트 웹소켓 데이터 PostgreSQL DB에 저장하기 - 파이썬 비트코인 자동매매

     

    업비트 웹소켓 데이터 PostgreSQL DB에 저장하기 - 파이썬 비트코인 자동매매

    지난 포스팅까지 PostgreSQL 데이터베이스 서버를 리눅스 서버에 설치하고 기본적인 세팅 및 외부에서 접속할 수 있도록 설정을 하는 방법에 대해서 살펴 보았습니다. 이번 시간에는 업비트 웹소

    technfin.tistory.com

     

    이전에 포스팅한 급등주를 찾는 파이썬 프로그램은 아래 포스팅을 참고 부탁 드립니다.

     

    2022.01.26 - [프로젝트/비트코인 자동매매] - 급등주 찾기 - 업비트 파이썬 비트코인 자동매매 프로그램

     

    급등주 찾기 - 업비트 파이썬 비트코인 자동매매 프로그램

    업비트의 경우 일명 9시 경주마라고 불리고 있는 변동률이 초기화 되는 오전 9시에 이유없이 갑자기 급상승하는 종목들이 있는데요. 이런 종목 외에도 호재 공지가 뜨거나 해외 거래소의 급상승

    technfin.tistory.com

     

    위의 프로그램은 오라클 버전일 때 작성한 포스팅이기 때문에 오늘 말씀드린 PostgreSQL에 맞게 프로그램 내부의 쿼리는 조금 변경해 주셔야 작동 합니다. 이 부분은 어려운 부분이 아니기 때문에 생략하도록 하겠습니다.

     

    마치며

    급등주를 분석하다 보면 세력의 장난이 심한 것을 발견할 수 있는데요. 예를 들면 9시에 업비트 장이 새로 초기화 되면서 급등하는 주는 계속해서 급등하는 것 보다는 잠깐 올랐다 다시 제자리로 돌아오는 경우가 더 많습니다.

     

    그동안 저는 급등주에 관련하여 여러가지 실험 및 분석을 해 봤었는데요. 그 결과 세력의 이상한 움직임을 포착할 수 있었습니다.

     

    그 중 한가지 예를 들자면 오전 9시에 10% 이상 급등하는 종목을 시장가 매수하여 5% 수익시 바로 매도하는 로직을 실험했을 때 15%까지 가지 못하고 다시 원점으로 돌아오는 경우가 많았으며 상승률은 매일 다르기 떄문에 일정 상승률을 정하기가 매우 어려웠습니다.

     

    또한 급등하는 종목의 호가 데이터를 실시간으로 저장해서 분석해 본 결과 사전에 호가창 작업을 면밀히 해 둔 상태에서 9시가 되면 호가창을 모두 비워서 거래 없이 10%이상의 상승을 만들고 실제 타인에 의한 거래가 들어오면 매도를 하는 등 비정상적인 상승의 경우가 많았습니다.

     

    결론적으로는 급등하는 주를 매수해서 아주 작은 %만 수익을 보고 나오겠다는 로직은 실제로는 원하는 대로 작동하지 않는 경우가 더 많아 손실로 이어지게 됩니다.

     

    해당 부분을 보완하기 전에는 급등주를 무조건 매수하는 것은 조금 위험할 수 있으니 참고 부탁 드리겠습니다.

     

    참고로 지금까지 자동매매 프로그램에 관심을 가져주신 분들이 많고 여러가지 의견을 주시고 계셔서 자동매매 프로그램을 대대적으로 손봐서 새로운 버전을 만들어 보려고 합니다.

     

    조금 더 구조적이고 운용이 쉽도록 만들어 볼 예정이니 많은 관심 부탁 드리겠습니다.

     

    블로그를 구독하시면 소식을 더 빨리 받아보실 수 있습니다. 감사합니다.

    반응형