자동매매봇 제작기

2021. 8. 18. 20:10Hi/Blockchain

예전에 주식도 해보고 코인도 해봤었는데, 정보도 없이 사람의 머리로 생각하고 손으로 거래하다보니 결과적으로 잃는게 더 컸던 것 같다. 이득보면 욕심이 생기고, 손해보면 언젠간 오르겠지란 생각으로는 못 벌겠다고 느꼈었고 접었었다.

다시 코인판이 올라오면서 봇을 돌려버리면 내가 설정한 조건 안에서 안전하게 수익을 창출할 수 있지 않을까해서 간단한 자동매매 프로그램을 만들었었고, 백테스팅을 통해 결과를 따져보고 만원으로 테스트기간을 가졌었다.

일단, 주식판은 정보도 많이없고, 이미 여러 알고리즘과 전략, 정보들과 인공지능 모델을 통해 프로그램이 많았기에 생각하지 않았고, 코인한번 해보니 주식보단 코인이 재밌었었다.  코인판은 24시간 돌아가기에 여러 조건 따져서 자동매매 프로그램 돌려버리기에 좋을 것 같다고 생각해서 제작했었다.

 

처음 제작한 프로그램은 진짜 간단하게 하루동안 생각한 것으로 돌렸었다.

업비트에서 가져온 api로 이전 종가와 현재 종가, 거래량 등을 따져서 급등할 것 같은 코인을 찾고, 찾았다면 사는 프로그램을 만들었었다.

 

이렇게 모든 종목을 검색하면서 조건을 따져보고, 발견하면 사고, 올라가다가 0.5% 떨어지면 다시 파는 프로그램이었다.

이런식으로 테스트결과 괜찮은 것 같아서 돌려놓고 자고일어났는데 10000원 > 8000원(-20%) 때려박히고 다 뜯어 고쳤다.

 

이전 모델들은 거의 20분에 한번꼴로 사고팔고를 반복하면서 수수료와 손해를 봤었는데, 현재는 하루에 몇번만 거래를 하는 봇을 제작하였다.

 

일단 제일 초창기 모델만 올릴 것이다. 이 때는 진짜 간단한 조건만 추가한 것이라 수익을 기대하긴 어렵다.

import time
import pyupbit
import datetime
import pandas
import json
import random

access = "-"
secret = "-"

# 로그인
upbit = pyupbit.Upbit(access, secret)
print("가쥬아")

coinArray = pyupbit.get_tickers(fiat="KRW")
coinArray = random.shuffle(coinArray)
count = 0

 

필요한 라이브러리를 가져오고, 업비트 api를 제공받아서 로그인을 하고, 모든 코인 종목을 가져와서 랜덤으로 배열에 넣었다.

def search() :
    global count
   
    try :
        count +=1
        coinArray = pyupbit.get_tickers(fiat="KRW")
        coinArray = list(reversed(coinArray))

        for i in coinArray :
            #1분봉 #200
            df = pyupbit.get_ohlcv(i, "minute1")
            
            #n/2분 전 종가
            ssClose = int(df.iloc[-10]['close'])
            #n분 전 종가
            firstClose = int(df.iloc[-5]['close'])
            #n분 전 거래량
            firstVolume =int(df.iloc[-5]['volume'])
            #n분 전 거래량
            sVolume =int(df.iloc[-3]['volume'])
            #n/2분 전 종가
            sClose = int(df.iloc[-3]['close'])

            
            #현재 종가
            curClose = int(df.iloc[-1]['close'])
            #현재 거래량
            curVolume = int(df.iloc[-1]['volume'])
            Price = pyupbit.get_current_price(i)
            print()
            print("***  "+ i + "   ***")
            print('처음 종가/거래량' + str(firstClose) + '/' + str(firstVolume))
            print('현재 종가/거래량' + str(curClose) + '/' + str(curVolume))

            if (firstClose < int(Price) and sClose < int(Price) and ssClose*1.01 < int(Price) and firstVolume * 1.5 < curVolume and sVolume *2 < curVolume) :
                print("!!!!!!!급등코인!!!!!!!!")
                return i
                break
            
    except :
        print("다시조회합니다. {} 회 반복중".format(count))
        time.sleep(2)
        search()

단타로 낮은 수익만 빼갈려고 설정한 조건이다. 물론 이것만 따졌다가 손해보고 다뜯어고쳤다.

각 코인마다 정보를 가져와서 1분봉으로 종가와 거래량을 따져서 조건에 맞으면 급등코인이라 판단하고, 못찾는다면 다시 처음부터 찾게 만들었었다.

while True: 
    try:
        i = search() #급등코인 결정
        krw = upbit.get_balance("KRW")
        upbit.buy_market_order(i, krw*0.9995)
        print("<<<< " + str(i) + " 구매완료 >>>>")
        
        # 결제 금액 
        firstPrice = pyupbit.get_current_price(i)
        print("구매금액 : " + str(firstPrice))
        
        while True :
            df1 = pyupbit.get_ohlcv(i, "minute1")

            #n분 전 종가
            firstClose = int(df1.iloc[-3]['close'])
            #n분 전 종가
            firstClose2 = int(df1.iloc[-5]['close'])
            #현재 종가
            curClose = int(df1.iloc[-1]['close'])
            
            curPrice = pyupbit.get_current_price(i)
            
            # 최근 5분 전, 3분 전 둘 다 0.5%이상 하락했을때 or 구매가격에서 0.7% 손해봤을때 
            if  (firstClose*0.995 > int(curPrice) and firstClose2*0.995 > int(curPrice))  or firstPrice *0.993 > curPrice:
                useCoin = upbit.get_balance(i)
                upbit.sell_market_order(i, useCoin)
                print("<<<< " + str(i) + " 판매완료 >>>>")
                time.sleep(5)
                print("현재 보유 KRW : " + str(upbit.get_balance("KRW")))
                break
                
            else : time.sleep(5)
        
        print('판매코인 현재가 : ' + str(pyupbit.get_current_price(i)))
        time.sleep(10)
        
    except Exception as e:
        print(e)
        time.sleep(1)

보면 알겠지만, 진짜 간단한 자동매매 프로그램이라 코드가 100줄가량 밖에 되지않는다. 물론 지금은 몇배뛰었다..

 

결정되면 그 코인을 구매하고, 그 코인에 대한 정보만 조회하면서 조건 될 때까지 기다렸다가 조건이 되면 다시 팔고 처음부터 다시 시작하는 프로그램이었다.

처음 생각한 방법은 구매량이 많고 가격이 올라갔다면 탑승해서, 쭉 타고 올라갔다가, 갑자기 어느정도 떨어지면 바로 팔아버리는 단타를 위한 코드였는데, 실제 백테스팅이나 결과를 봤을 때에는 급 올라가길래 사고, 사자마자 떨어지면 바로 팔아버려서 여러 수정하다가 그냥 버린 코드이다.

 

위에 코드는 그냥 어떤 식으로 제작을 시작하면 되는지에 대한 코드이고, 따라했다가 손해만 볼 것이다.

여러 전략들을 생각해내거나, 정보를 받아서 이를 적용시키고 돌리면 될 것이다.

 

그래도 간단히 자동매매 프로그램을 제작할 수 있고, 서버같은 걸로 24시간 돌릴 수 있다는 점이 좋다.

다만, 간단할수록 안좋은 변수 상황들에 대해 처리할 수 없기에 손해를 볼 것이다.

안정성있는 모델을 구현해서 적용하면 좋을 것이다.

 

현재 나는 여러 모델들을 제작하고 테스트해보면서 찾는 중이고, 그나마 초보수준에서 상승장이든 하락장이든 수익률 적당히 나오는 프로그램을 만들고 있는 것 같아서 기분이 좋다.

나중에 LSTM으로 딥러닝모델 돌려서 정보따고 이를 적용해서 만들어 볼려한다.

용돈벌이 해야겠다는 야망가지는 중.

728x90

'Hi > Blockchain' 카테고리의 다른 글

RSI기반 자동매매 프로그램 제작 (업비트)  (35) 2021.11.21
블록체인 개념  (0) 2021.03.04