본문 바로가기
주식/주식자동매매

주식 자동매매 변동성 돌파 전략 업그레이드 - 거래량 상위 종목 매수하기

by 날아라키위새 2021. 9. 7.
반응형

몇 달째 대신증권 크레온 플러스 파이썬 API로 만든 주식 자동매매 스크립트를 돌리고 있지만
여러 번에 걸친 삽질과 코드 수정에도 수익률은 엄청난 상승곡선을 이루거나 하지 않고 있다.

(참고: 눈물의 주식 자동매매 일지)

 

여러 가지 이유가 있겠지만 짧은 생각으로는
왠지 매수 종목 리스트에 코덱스 etf 종목 4개만 딸랑 넣어놔서 그런 것 같았다.
(KODEX 200, KODEX 선물인버스, KODEX 코스닥 150, KODEX 코스닥150선물인버스)
그렇게 한 이유는 하락시장에서도 인버스 종목으로 수익을 내보겠다는 이유였지만

지수 종목 특성상 끽해야 1.5% 정도 수익이 최대였던 거 같다.
그나마 변동성 큰 코스닥시장 만세!

 

그래서 차라리 좀 크게 먹고 크게 잃자(읭?)라는 생각을 하며

매수 종목 리스트를 매일매일 거래량 상위 종목으로 선정해보면 어떨까라는 생각을 하게 되었다.
변동성 돌파 전략에서는 재무제표가 어떻든 기업이 유망하고 건실하던 어떻든
장투 할 것도 아니니 상관이 없다고 생각했고
거래량 상위 종목들은 어찌 됐든 그날 hot한 종목들이라는 소리가 아니겠는가 싶었다.


9시 5분이나 9시 10분에 아래의 거래량 상위 종목을 불러오는 함수를 이용하면
그 종목들 중에서 변동성 돌파를 하는 종목을 매수하게 되는 것이다.

 

거래량 상위 종목 구하는 법

# -*- coding: UTF-8 -*-

import win32com.client
import pandas as pd
from datetime import datetime
import pytz


cpTopVol = win32com.client.Dispatch('CpSysDib.CpSvr7049')
cpStock = win32com.client.Dispatch('Dscbo1.StockMst')
KST = pytz.timezone('Asia/Seoul')



def get_top_volume(qty,qty2):
    """qty로 받은 종목에서 거래량 상위 qty2 종목들을 리턴한다."""
    try:
        cpTopVol.SetInputValue(0, '4')  # 시장 구분 "1":거래소, "2":코스닥, "4":전체(거래소+코스닥)
        cpTopVol.SetInputValue(1, 'V')  # 선택 구분 : "V":거래량상위, "A":거래대금상위
        cpTopVol.SetInputValue(2, 'Y')  # 관리 구분 :  "Y'', "N"
        cpTopVol.SetInputValue(3, 'Y')  # 우선주 구분 :  "Y'', "N"
        cpTopVol.BlockRequest()
        columns = ['code', '종목명', '현재가', '전일대비', '전일대비율', '거래량', '거래대금']
        index = []
        rows = []
        for i in range(qty):
            index.append(cpTopVol.GetDataValue(0, i))
            rows.append([cpTopVol.GetDataValue(1, i), cpTopVol.GetDataValue(2, i),
                         cpTopVol.GetDataValue(3, i), cpTopVol.GetDataValue(4, i),
                         cpTopVol.GetDataValue(5, i), cpTopVol.GetDataValue(6, i),
                         cpTopVol.GetDataValue(7, i)])
        df = pd.DataFrame(rows, columns=columns, index=index)
        df = df.head(qty)
        df = df[~df['종목명'].str.contains("KODEX | KINDEX")]
        df = df[~df['종목명'].str.contains("TIGER | 레버리지")]
        df = df[~df['종목명'].str.contains("스팩")]
        df = df[df['현재가'] >= 1000]
        df = df[df['현재가'] <= 50000]
        df = df[df['전일대비율'] <= 10]
        df = df.sort_values(by=['거래량'], ascending=False).head(qty2)
        df.to_csv(datetime.now(KST).strftime('%m_%d_%H%M') + "_top" + str(qty2) + ".csv", encoding='utf-8-sig')
        df_list = list(df['code'])
        return df_list
    except Exception as ex:
        print('get_top_volume(qty) -> 에러 발생! ' + str(ex))
        return None

 

간단히 코드를 설명하자면 먼저 qty만큼 받은 거래량 상위 종목들에서
여러 가지 조건들을 제하고 난 다음 qty2에 해당하는 최종 종목 리스트를 반환하는 코드이다.

즉, get_top_volume(100,20)을 실행하면

거래량 상위 100에 해당하는 종목들에서 (코스닥+코스피)
조건에 맞춰서 (kodex, kindex, tiger 등등 제외시키고)
또 다른 조건에 맞춰서 (현재가, 전일대비율) 최종 정리한 뒤 거래량 상위 20 종목을 반환한다. 전일대비율은 적당히 조절하는 게 좋아 보인다.
10%로 제한을 둔 이유는 장 초반부터 상한가를 치거나 하는 종목을 리스트에 넣을 이유가 없고
장 마감 전까지 어느 정도 수익을 낼 수 있어야 한다고 생각했기 때문이다.

 

마지막으로 자동매매 메인 코드에

symbol_list = get_top_volume(100,20)

이런 식으로 넣어주면 매일매일 새로운 매수리스트로 자동매매가 실행된다.
그리고 csv파일로 그날그날 결과를 저장하니 나중에 엑셀로 열어서 살펴보기도 좋다.

후기는 나중에 자동매매 일지에서 공유하겠다.
대박 나서 집 사고 싶습니다 제발!

 

관련 글:

주식 자동매매 변동성 돌파 전략 단점 업그레이드 하기 - 매도 타이밍

주식 자동매매 프로그램 변동성 돌파 전략 단점 업그레이드 하기 (대신증권 크레온 플러스 파이썬 API)

주식 자동매매 변동성 돌파 전략 - 매수량 조절하기

 

반응형

댓글