본문 바로가기
프로젝트/코인 자동매매

파이썬 코인 자동매매 봇 만들기#12 - 거래량으로 매수 판단하기

by 큰공 2021. 10. 29.
728x90
반응형

 

들어가며

2021.08.19 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#1 - pybitumb 모듈 설치하기

2021.08.21 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#2 - 24시간 변동률 정렬하기

2021.08.24 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#3 - 급등주를 찾아라

2021.08.25 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#4 - 매수 / 매도 시뮬레이션

2021.08.30 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#5 - 시뮬레이션 첫 수익률은?

2021.09.05 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#6 - STOP LOSS 기능을 추가

2021.09.06 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#7 - NONE TYPE ERROR 수정

2021.09.08 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#8 - 빗썸 API 신청 및 잔고조회 하기

2021.09.10 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#9 - 매도 주문을 해보자

2021.10.12 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#10 - 웹소켓을 사용하여 급등주를 찾아보자

2021.10.15 - [개발 프로젝트/코인 자동매매] - 파이썬 코인 자동매매 봇 만들기#11 - 빗썸 API 매수하기

 

파이썬 코인 자동매매 봇 만들기#11 - 빗썸 API 매수하기

들어가며 2021.08.19 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#1 - pybitumb 모듈 설치하기 2021.08.21 - [IT/파이썬] - 파이썬 코인 자동매매 봇 만들기#2 - 24시간 변동률 정렬하기 2021.08.24 - [IT/..

coinpipe.tistory.com

 

목표

 지난번 포스팅에서는 "실시간" 으로 급등주를 찾고 자동으로 "매수" 하는 로직을 구현해보았습니다. 오늘은 "매수" 조건에서 "거래량 (거래금액)" 을 추가하여, 일정 거래량 이상이 되는 종목만 매수 할 수 있도록 해보겠습니다.

 

거래량이 왜 중요한가?

 급등주를 찾고 자동으로 매수는 가능하나, 매수 했던 종목이 터무니 없는 종목 (소위 잡코인) 을 매수를 많이 하는것이였습니다. 잡코인이니, 단기 급등을 했더라도 바로 하락해버려서, 이거 매수는 하는 종목 마다 다시 하락이 이뤄지니, 코인 자동매매를 하는 의미가 없어지는것이였습니다. ㅠㅠ

 

 그래서 고민하던 와중에, "거래금액" 이 일정 금액이 넘어가는 종목만 매수를 해야 겠다고 생각이 들었습니다.

 이번 구현의 목적은

"빗썸 코인 180개의 총 거래금액의 평균보다

해당 종목의 거래금액이 클 경우만 매수한다"

로 잡아 보았습니다.

 

 

 

초기 데이터 프레임 열 추가

 초기 데이터 프레임에서 value 항목 (24시간 거래금액) 열을 추가합니다.

 # DataFrame 초기화
df = DataFrame([ ( 0, datetime.now(), 0, 0 )], columns=['ticker_symbol', 'time', 'closing_price', 'value'])
df = df.drop(0)

 # DataFrame 베이스 Data 취득
for ticker, data in all.items():
    ticker_symbol.append(ticker+"_KRW")    
    df = df.append( { 'ticker_symbol' :  ticker+"_KRW", 'time' : datetime.now().strftime('%Y%m%d%H%M%S'), 'closing_price' : data['closing_price'], 'value' : float (data['acc_trade_value_24H']) }, ignore_index=True)
df.set_index('ticker_symbol', inplace=True)

 해당 내용을 상세하게 이해할려면 파이썬에서의 DataFrame (pandas)를 좀 이해해야 합니다.

 

 쉽게 말씀드리면, 2차원 배열에서 하나의 열 ('value') 를 추가하였고, value 열에 

'value' : float (data['acc_trade_value_24H'])

가 append 될 수 있도록 하였습니다.

 

전체 거래금액의 평균보다 현재 종목의 거래금액이 큰지 구하기

 # 해당 코인의 거래금액이 전체 코인 거래금액 평균 보다 큰지? 
def over_avg_value ( value ) :
    total_value = df['value'].sum()
    avgValue = total_value / len (all)
    if value > avgValue :
        return True
    else :
        return False

 over_avg_value 함수를 이용하여, 해당 코인의 거래금액이 전체 코인 거래금액의 평균보다 큰지 아닌지를 구하게 됩니다.

 인자로 해당 코인의 거래금액이 전달되게 되고, dataframe의 sum() 함수를 이용하여, 해당 열 데이터의 합을 구하게 됩니다.

 해당 열의 전체 합에서 전체 코인의 수 ( len (all) ) 을 나누게 되면 "전체 코인 거래금액의 평균" 을 구할 수 있습니다.

 그리고 전체 코인거래금액의 평균 보다, 현재 종목의 거래금액이 크다면 True 를 리턴합니다.

 

 

DATAFRAME 한 열의 합 

df['value'].sum()

 타 언어와 다르게 파이썬에서는 기본적으로 2차원 배열의 연산 중 여러가지를 지원합니다. 2차원 배열에서의 한 열의 전체 합을 구하기 위해서는 타 언어 같은 경우에는 반복문을 이용하여 합을 구하여야 하지만, sum()함수를 이용하여 한줄에 바로 구할 수 있습니다.

 

 상세한 내용은 pandas API에서 참고가능합니다.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sum.html

 

pandas.DataFrame.sum — pandas 1.3.4 documentation

Include only float, int, boolean columns. If None, will attempt to use everything, then use only numeric data. Not implemented for Series.

pandas.pydata.org

 

 

매수 로직 추가

        # 각 Ticker 에 대한 실시간 시세 변동 시 CallBack 
        while True:
            data = await websocket.recv()
            data = json.loads(data)

            if 'content' in data:
                ticker_data = data['content']['symbol'] # 종목
                closePrice_data = data['content']['closePrice'] # 종목의 현재가
                time_data = data['content']['date'] + data['content']['time'] # 종목이 변화한 시간
                value_data = float ( data['content']['value'] )
                
                diff_rate = diff ( prev_price(ticker_data), closePrice_data ) # 이전 가격과 현재 가격의 차이
                time_gap = int ( time_data ) - int ( prev_time(ticker_data) ) # 이전 시간과, 현재 시간의 간격

                # 급등주 출력 ( X 초 동안, Y % 상승한 경우 매수 체결 신호)
                if time_gap > cycle_time and diff_rate > check_rate :
                    print(current_time(), ticker_data, closePrice_data, prev_price(ticker_data), diff_rate, value_data, over_avg_value(value_data))
                    if balance_won() > 1000 and over_avg_value(value_data) == True :
                        buy ( ticker_data , closePrice_data )

                # 시간 갱신 ( 이전 데이터에 현재 데이터로 업데이트 )
                if time_gap > cycle_time : 
                    df.loc[ticker_data] = (time_data, closePrice_data, value_data)

 1) 체결이 이뤄짐과 동시에, value_data 에 현시간의 24시간 거래금액인 data['content']['value'] 을 얻어오고

 2) 시간 갱신이 이뤄지면 현시간의 24시간 거래금액인 value_data 으로 dataframe 을 업데이트 합니다

 3) over_avg_value (value_data) 함수를 이용하여, 현재 종목의 24시간 거래금액이, 전체 거래금액의 평균보다 크다면 매수를 진행합니다.

 

 

실행결과

 실행 결과를 좀 의미있게 하기 위해서 # 급상승/급하락 조건 변수 를 아래와 같이 설정합니다.

cycle_time = 10 # X초 동안
check_rate = 0.5 # 0.5% 상승하면

 

아래 실행 결과는 아래와 같은 순서의 데이터로 출력이 됩니다.

 

시간 / 종목 / 현재 가격 / 10초 전 가격 / 10초간 상승률 / 거래금액 / 전체 거래금액 평균보다 큰지?

2021-10-29 13:45:51 BFC_KRW 341.3 338.3 0.887 4679300955.060763 False
2021-10-29 13:45:59 BNT_KRW 5220 5135.0 1.655 616182811.9088242 False
2021-10-29 13:46:02 BOA_KRW 162.5 161.0 0.932 512998600.3078313 False
2021-10-29 13:46:06 WOZX_KRW 594 590.9 0.525 925599600.368347 False
2021-10-29 13:46:18 ARW_KRW 2539 2526.0 0.515 458007871.227282 False
2021-10-29 13:46:24 COLA_KRW 986.8 979.1 0.786 67871166818.35679 True
2021-10-29 13:46:35 BIOT_KRW 37.67 37.43 0.641 2408964484.526239 False
2021-10-29 13:46:36 MANA_KRW 1341 1330.0 0.827 23478997134.829018 True
2021-10-29 13:46:50 POLA_KRW 148.9 147.6 0.881 2308696277.2549157 False
2021-10-29 13:47:00 AWO_KRW 49.7 49.09 1.243 28213282633.849537 True
2021-10-29 13:47:01 CHR_KRW 438.5 431.8 1.552 3150133202.636789 False
2021-10-29 13:47:02 CHR_KRW 444.9 438.5 1.46 3151157485.365929 False
2021-10-29 13:47:03 WAXP_KRW 439.9 437.4 0.572 5439366980.344738 False
2021-10-29 13:47:03 GOM2_KRW 13.25 13.15 0.76 1101051958.1287284 False
2021-10-29 13:47:12 COLA_KRW 976 960.0 1.667 68181382058.60178 True
2021-10-29 13:47:18 WOZX_KRW 594 589.2 0.815 929931269.070907 False
2021-10-29 13:47:25 POLA_KRW 149.8 148.7 0.74 2309551045.2549157 False
2021-10-29 13:47:25 FIT_KRW 1.32 1.313 0.533 3076842412.190505 False
2021-10-29 13:47:45 SNX_KRW 12100 12030.0 0.582 875520930.0045134 False
2021-10-29 13:47:53 SUSHI_KRW 13460 13390.0 0.523 766006596.049 False
2021-10-29 13:47:57 EM_KRW 5.165 5.116 0.958 480559211.2477906 False
2021-10-29 13:47:58 HDAC_KRW 94.53 94.01 0.553 1541392523.2350736 False
2021-10-29 13:48:02 COLA_KRW 978.6 966.5 1.252 68366397061.524895 True
2021-10-29 13:48:03 WIKEN_KRW 23.2 23.05 0.651 5577011906.942822 False
2021-10-29 13:48:06 FX_KRW 1477 1468.0 0.613 2424330355.2765317 False
2021-10-29 13:48:09 MAP_KRW 48.4 48.15 0.519 10324963119.021164 False

 

 

728x90
반응형

댓글