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

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

by 큰공 2021. 9. 5.
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 - 시뮬레이션 첫 수익률은?

 

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

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

coinpipe.tistory.com

이전글을 못 보고 오신분들은 순차적으로 글을 보시고 오시는것을 추천드립니다.

 

목표

 지난글에서의 목표는

X초 동안 Y% 상승한 종목을 시장가에 매수하고,

Z% 추가 상승하면 매도하고, A초 후에는 무조건 시장가에 매도한다.

 

 이였습니다. 하지만, 이 로직의 문제점은 매수 매도가 너무 자주 일어나고, 손절(STOP LOSS)기능이 없어서, 잃고 매도하고 잃고 매도하는 상태가 지속이 되어서, 수익률이 현저히 낮게 측정되었습니다.

 

 

 이번에 적용할 로직은, 

A초 동안 B% 상승한 종목을 시장가에 매수하고,

C% 추가 상승하면 매도하고, D% 하락하면 손절하고,

E초 후에는 무조건 시장가에 매도한다.

 

 여기서 진행될 로직에서는 바로 "STOP LOSS" 손절 이라는 항목이 추가되게 됩니다.

 

STOP LOSS 란?

손절 (損切, StopLoss, 스탑로스)은 손실을 차단 또는 절단한다는 뜻입니다.
거래에서 포지션을 가지고 있는 상태에서, 시장의 가격이 포지션과 반대 방향으로 움직이면 손실이 발생하게 됩니다. 그러한 손실을 어느 정도에서 중단시킬 것인가를 결정하고, 손실이 그 지점에 다다르면 포지션이 무조건 청산되도록 하는 것입니다.

 

 우리는 매도를 현재가 보다 높은 가격에 걸어둘 경우, 그 가격이 오게 되면 팔 수가 있으나, 매도가격를 현재가 보다 낮은 가격에 주문은 하면, 그 즉시 현재가격으로 거래가 되어 버립니다.

 

 

 STOP LOSS 기능은 더 이상 손해를 입지 않기 위해서 내가 정한 가격이 현재가가 되어 버리면 현재가에 바로 그 즉시 매도를 하게 됩니다.

 

 주식에서는 이 STOP LOSS 는 MTS 상에서 지원하는 APP은 없는거 같으며, 보통 HTS 상에서 지원하며, 이 마저도 HTS 를 켜두고 있어야 하는 것이 많습니다.

 

 

 어차피 만들고자 하는 코인 자동매매 봇은 계속해서 실시간으로 모니터링을 하면서 해야 하므로, 이 기능을 넣으면 좋겠다는 생각이 들어서 해당 로직을 추가하여 코딩을 해보았습니다.

 

파이썬 코인 자동매매 봇 만들기#6 - STOP LOSS 기능을 추가 전체 추가

 기존에 사용했던, 상승률 로직이라던지, 큰 구조는 아니고, 살짝씩 변수가 변경되어 전체 코드를 올립니다.

import pybithumb
import time
from datetime import datetime

all = pybithumb.get_current_price("ALL") 
sort_all = sorted(all.items(), key = lambda x : float(x[1]['fluctate_rate_24H']), reverse=True)

cycle_time = 10 # 매수를 위해서 X 초 간격으로 체크
ascent = 3 # % 상승

sell_ascent = 3 # 매수후 % 상승 후 매도
stop_loss = -3 # % 하락일 경우 매도

sell_cycle_time = 1 # 파는 간격을 초 간격으로 체크
sell_time = 600 # 초 안에는 무조건 팔기

init_balance = 1000000 # 원
balance = init_balance
count_deal = 0

while True :

    buy_sec = 0
    sell_sec = 0
    prev_ticker = ''
    prev_rate = 0
    prev_dict = { 'ticker' : 0 }

    for ticker, data in sort_all :        
        prev_dict[ticker] = data['closing_price']

    buy_flag = False

    while buy_flag == False :
        all = pybithumb.get_current_price("ALL") 
        sort_all = sorted(all.items(), key = lambda x : float(x[1]['fluctate_rate_24H']), reverse=True)

        for ticker, data in sort_all :        
            diff = ( float(data['closing_price']) - float(prev_dict[ticker]) ) / float(prev_dict[ticker]) * 100
            if diff >= ascent :
                buy = [ str(datetime.now()), ticker, float(prev_dict[ticker]), float(data['closing_price']), float('%.2f' % diff) ]
                print ('BUY ' , buy ) 
                buy_flag = True
                break;

            prev_dict[ticker] = data['closing_price']
            
        time.sleep(cycle_time)
        buy_sec+=cycle_time

    # 팔기 로직
    sell_flag = False
    buy_price = float (buy[3])

    while sell_flag == False :
        buy_ticker = buy[1]
        current_price = pybithumb.get_current_price(buy_ticker)
        yield_rate = ( current_price - buy_price ) / buy_price * 100

        if ( yield_rate >= sell_ascent) :
            sell = [ str(datetime.now()), buy_ticker, buy_price, current_price , float('%.2f' % yield_rate) ]
            print ( 'SELL', sell )
            sell_flag = True
            break
        
        if ( yield_rate <= stop_loss) :
            sell = [ str(datetime.now()), buy_ticker, buy_price, current_price , float('%.2f' % yield_rate) ]
            print ( 'SELL', sell , "STOP LOSS")
            sell_flag = True
            break
        
        if ( sell_sec > sell_time ) :
            sell = [ str(datetime.now()), buy_ticker, buy_price, current_price , float('%.2f' % yield_rate) ]
            print ( 'SELL', sell , "TIME_OUT" )
            sell_flag = True
            break

        time.sleep(sell_cycle_time)
        sell_sec += sell_cycle_time

    count_deal +=1 
    current_balance = balance + (current_price - buy_price) * ( balance / buy_price )
    rate = ( current_balance - init_balance ) / init_balance * 100
    print (count_deal, "Current Balance : ", float('%.2f' % current_balance), "(", float('%.2f' % rate), "% )" )
    balance = current_balance

 

STOP LOSS 부분 코드 설명

#팔기 로직
.
.

        if ( yield_rate <= stop_loss) :
            sell = [ str(datetime.now()), buy[1], current_price , buy_price, float('%.2f' % yield_rate) ]
            print ( 'SELL', sell , "STOP LOSS")
            sell_flag = True
            break
.
.

로직은 쉽습니다.

1) STOP_LOSS 라는 변수를 하나 추가하고, 정해진 D 값을 지정해 줍니다.

2) 변동률이 STOP LOSS보다 작으면 자로 매도해 버립니다.

 

상수값을 찾아서 시뮬레이션해보기

.
.
cycle_time = 10 # 매수를 위해서 X 초 간격으로 체크
ascent = 3 # % 상승

sell_ascent = 3 # 매수후 % 상승 후 매도
stop_loss = -3 # % 하락일 경우 매도

sell_cycle_time = 1 # 파는 간격을 초 간격으로 체크
sell_time = 600 # 초 안에는 무조건 팔기

init_balance = 1000000 # 원
.
.

10초 동안 3% 상승한 종목을 시장가에 매수하고,

3% 추가 상승하면 매도하고, -3% 하락하면 손절하고,

10분 후에는 무조건 시장가에 매도한다.

 

시뮬레이션 결과

 9/4일 22시 부터 9/5일 8시까지 약 10시간 수행한 결과입니다.

 

 장중 최고 수익률 15.78% 까지 수익이 났으나, 결국에는 잦은 STOP LOSS 설계로 인하여, -51.37% 으로 마무리 되었습니다. ㅠ_ㅠ

 

시간당 수익률은 -5.13%

이겠군요

 

 한시간에 5%씩 까먹다니, 역시 돈벌기 쉽지 않나 봅니다. ㅎㅎ

BUY  ['2021-09-04 22:03:59.394933', 'RINGX', 42.17, 44.54, 5.62]
SELL ['2021-09-04 22:08:53.849636', 'RINGX', 44.54, 45.91, 3.08]
1 Current Balance :  1030758.87 ( 3.08 % )
BUY  ['2021-09-04 22:08:53.943723', 'POWR', 551.2, 571.3, 3.65]
SELL ['2021-09-04 22:12:11.766107', 'POWR', 571.3, 559.7, -2.03] STOP LOSS
2 Current Balance :  1009829.75 ( 0.98 % )
BUY  ['2021-09-04 23:23:25.673700', 'WOM', 194.1, 203.0, 4.59]
SELL ['2021-09-04 23:23:45.763974', 'WOM', 203.0, 196.6, -3.15] STOP LOSS
3 Current Balance :  977992.76 ( -2.2 % )
BUY  ['2021-09-04 23:56:11.782045', 'DVI', 480.6, 500.0, 4.04]
SELL ['2021-09-04 23:56:42.037748', 'DVI', 500.0, 489.5, -2.1] STOP LOSS
4 Current Balance :  957454.91 ( -4.25 % )
BUY  ['2021-09-05 00:00:22.806776', 'APIX', 77.34, 80.99, 4.72]
SELL ['2021-09-05 00:00:42.891697', 'APIX', 80.99, 84.97, 4.91]
5 Current Balance :  1004506.03 ( 0.45 % )
BUY  ['2021-09-05 00:00:42.955752', 'APIX', 80.99, 84.0, 3.72]
SELL ['2021-09-05 00:01:03.004179', 'APIX', 84.0, 88.08, 4.86]
6 Current Balance :  1053296.33 ( 5.33 % )
BUY  ['2021-09-05 00:01:03.086453', 'APIX', 84.0, 88.08, 4.86]
SELL ['2021-09-05 00:01:23.193689', 'APIX', 88.08, 91.7, 4.11]
7 Current Balance :  1096585.75 ( 9.66 % )
BUY  ['2021-09-05 00:01:43.306631', 'APIX', 88.08, 91.63, 4.03]
SELL ['2021-09-05 00:02:23.763385', 'APIX', 91.63, 89.19, -2.66] STOP LOSS
8 Current Balance :  1067384.95 ( 6.74 % )
BUY  ['2021-09-05 00:03:44.051033', 'APIX', 82.93, 87.0, 4.91]
SELL ['2021-09-05 00:05:30.490013', 'APIX', 87.0, 91.11, 4.72]
9 Current Balance :  1117809.69 ( 11.78 % )
BUY  ['2021-09-05 00:05:30.550883', 'ANW', 47.54, 49.52, 4.16]
SELL ['2021-09-05 00:07:52.442562', 'ANW', 49.52, 51.29, 3.57]
10 Current Balance :  1157763.71 ( 15.78 % )
BUY  ['2021-09-05 00:07:52.532667', 'COLA', 263.2, 292.2, 11.02]
SELL ['2021-09-05 00:08:43.007927', 'COLA', 292.2, 285.0, -2.46] STOP LOSS
11 Current Balance :  1129235.65 ( 12.92 % )
BUY  ['2021-09-05 00:09:03.132840', 'EL', 9.5, 9.81, 3.26]
SELL ['2021-09-05 00:09:33.372738', 'EL', 9.81, 9.6, -2.14] STOP LOSS
12 Current Balance :  1105062.41 ( 10.51 % )
BUY  ['2021-09-05 00:10:33.686069', 'COLA', 278.0, 289.0, 3.96]
SELL ['2021-09-05 00:11:24.218273', 'COLA', 289.0, 282.0, -2.42] STOP LOSS
13 Current Balance :  1078296.2 ( 7.83 % )
BUY  ['2021-09-05 00:11:24.279767', 'DVI', 519.7, 538.7, 3.66]
SELL ['2021-09-05 00:11:49.419450', 'DVI', 538.7, 555.5, 3.12]
14 Current Balance :  1111924.15 ( 11.19 % )
BUY  ['2021-09-05 00:11:49.494845', 'DVI', 538.7, 555.5, 3.12]
SELL ['2021-09-05 00:12:09.591177', 'DVI', 555.5, 529.8, -4.63] STOP LOSS
15 Current Balance :  1060481.39 ( 6.05 % )
BUY  ['2021-09-05 00:15:30.225125', 'DVI', 586.1, 605.7, 3.34]
SELL ['2021-09-05 00:16:00.418104', 'DVI', 605.7, 590.0, -2.59] STOP LOSS
16 Current Balance :  1032993.26 ( 3.3 % )
BUY  ['2021-09-05 00:16:20.535420', 'RINGX', 45.53, 47.9, 5.21]
SELL ['2021-09-05 00:18:02.003116', 'RINGX', 47.9, 46.33, -3.28] STOP LOSS
17 Current Balance :  999135.24 ( -0.09 % )
BUY  ['2021-09-05 00:18:02.077044', 'DVI', 583.0, 634.7, 8.87]
SELL ['2021-09-05 00:19:18.034528', 'DVI', 634.7, 611.0, -3.73] STOP LOSS
18 Current Balance :  961827.05 ( -3.82 % )
BUY  ['2021-09-05 00:21:18.449839', 'FIT', 1.278, 1.336, 4.54]
SELL ['2021-09-05 00:21:48.690055', 'FIT', 1.336, 1.3, -2.69] STOP LOSS
19 Current Balance :  935909.56 ( -6.41 % )
BUY  ['2021-09-05 00:22:28.894538', 'DVI', 580.0, 598.9, 3.26]
SELL ['2021-09-05 00:23:29.688965', 'DVI', 598.9, 585.0, -2.32] STOP LOSS
20 Current Balance :  914187.83 ( -8.58 % )
BUY  ['2021-09-05 00:26:30.284396', 'ANV', 1317.0, 1365.0, 3.64]
SELL ['2021-09-05 00:27:46.317863', 'ANV', 1365.0, 1334.0, -2.27] STOP LOSS
21 Current Balance :  893426.06 ( -10.66 % )
BUY  ['2021-09-05 00:33:07.365104', 'COLA', 261.4, 272.2, 4.13]
SELL ['2021-09-05 00:34:28.374199', 'COLA', 272.2, 265.6, -2.42] STOP LOSS
22 Current Balance :  871763.26 ( -12.82 % )
BUY  ['2021-09-05 00:43:10.038544', 'CKB', 18.84, 19.48, 3.4]
SELL ['2021-09-05 00:43:45.388287', 'CKB', 19.48, 19.04, -2.26] STOP LOSS
23 Current Balance :  852072.51 ( -14.79 % )
BUY  ['2021-09-05 00:43:45.446461', 'DVI', 579.2, 599.9, 3.57]
SELL ['2021-09-05 00:44:51.301312', 'DVI', 599.9, 579.9, -3.33] STOP LOSS
24 Current Balance :  823665.36 ( -17.63 % )
BUY  ['2021-09-05 00:50:32.385133', 'BOA', 154.7, 162.4, 4.98]
SELL ['2021-09-05 00:51:43.120175', 'BOA', 162.4, 168.1, 3.51]
25 Current Balance :  852574.8 ( -14.74 % )
BUY  ['2021-09-05 00:51:43.180593', 'BOA', 162.4, 168.1, 3.51]
SELL ['2021-09-05 00:52:08.290255', 'BOA', 168.1, 155.3, -7.61] STOP LOSS
26 Current Balance :  787655.36 ( -21.23 % )
BUY  ['2021-09-05 01:13:12.123276', 'BLY', 38.28, 39.58, 3.4]
SELL ['2021-09-05 01:14:12.863142', 'BLY', 39.58, 38.72, -2.17] STOP LOSS
27 Current Balance :  770541.07 ( -22.95 % )
BUY  ['2021-09-05 01:14:12.937179', 'BOA', 151.8, 158.4, 4.35]
SELL ['2021-09-05 01:14:38.078496', 'BOA', 158.4, 155.0, -2.15] STOP LOSS
28 Current Balance :  754001.68 ( -24.6 % )
BUY  ['2021-09-05 01:17:18.597869', 'BLY', 38.33, 39.58, 3.26]
SELL ['2021-09-05 01:18:34.526942', 'BLY', 39.58, 38.45, -2.85] STOP LOSS
29 Current Balance :  732475.1 ( -26.75 % )
BUY  ['2021-09-05 01:21:35.126764', 'BOA', 151.6, 156.2, 3.03]
SELL ['2021-09-05 01:22:00.245429', 'BOA', 156.2, 152.0, -2.69] STOP LOSS
30 Current Balance :  712779.87 ( -28.72 % )
BUY  ['2021-09-05 01:44:04.297515', 'DVI', 558.7, 589.9, 5.58]
SELL ['2021-09-05 01:48:43.535764', 'DVI', 589.9, 571.9, -3.05] STOP LOSS
31 Current Balance :  691030.36 ( -30.9 % )
BUY  ['2021-09-05 02:06:06.876886', 'CON', 3.125, 3.283, 5.06]
SELL ['2021-09-05 02:06:26.929185', 'CON', 3.283, 3.16, -3.75] STOP LOSS
32 Current Balance :  665140.4 ( -33.49 % )
BUY  ['2021-09-05 02:30:11.162022', 'BOA', 149.0, 155.6, 4.43]
SELL ['2021-09-05 02:30:36.312330', 'BOA', 155.6, 151.6, -2.57] STOP LOSS
33 Current Balance :  648041.67 ( -35.2 % )
BUY  ['2021-09-05 02:44:38.845873', 'COLA', 252.8, 261.1, 3.28]
SELL ['2021-09-05 02:44:58.895269', 'COLA', 261.1, 255.1, -2.3] STOP LOSS
34 Current Balance :  633149.87 ( -36.69 % )
BUY  ['2021-09-05 02:59:41.494577', 'LOOM', 157.1, 162.0, 3.12]
SELL ['2021-09-05 03:00:21.951977', 'LOOM', 162.0, 157.2, -2.96] STOP LOSS
35 Current Balance :  614389.87 ( -38.56 % )
BUY  ['2021-09-05 03:02:22.375092', 'DAC', 2.883, 2.98, 3.36]
SELL ['2021-09-05 03:12:56.519391', 'DAC', 2.98, 2.956, -0.81] TIME_OUT
36 Current Balance :  609441.77 ( -39.06 % )
BUY  ['2021-09-05 03:39:21.577756', 'COLA', 251.4, 260.0, 3.42]
SELL ['2021-09-05 03:39:41.665343', 'COLA', 260.0, 253.5, -2.5] STOP LOSS
37 Current Balance :  594205.72 ( -40.58 % )
BUY  ['2021-09-05 04:30:51.268710', 'CYCLUB', 28.56, 29.57, 3.54]
SELL ['2021-09-05 04:41:26.018244', 'CYCLUB', 29.57, 29.22, -1.18] TIME_OUT
38 Current Balance :  587172.51 ( -41.28 % )
BUY  ['2021-09-05 04:45:26.778634', 'VRA', 51.86, 54.65, 5.38]
SELL ['2021-09-05 04:45:46.817361', 'VRA', 54.65, 51.96, -4.92] STOP LOSS
39 Current Balance :  558270.52 ( -44.17 % )
BUY  ['2021-09-05 05:33:15.674054', 'WOZX', 996.2, 1029.0, 3.29]
SELL ['2021-09-05 05:33:35.763082', 'WOZX', 1029.0, 1005.0, -2.33] STOP LOSS
40 Current Balance :  545249.63 ( -45.48 % )
BUY  ['2021-09-05 05:57:20.415414', 'DVI', 557.0, 578.8, 3.91]
SELL ['2021-09-05 05:57:40.468785', 'DVI', 578.8, 559.9, -3.27] STOP LOSS
41 Current Balance :  527445.18 ( -47.26 % )
BUY  ['2021-09-05 06:01:21.157063', 'REN', 1211.0, 1256.0, 3.72]
SELL ['2021-09-05 06:01:41.227624', 'REN', 1256.0, 1204.0, -4.14] STOP LOSS
42 Current Balance :  505608.27 ( -49.44 % )
BUY  ['2021-09-05 06:15:03.686291', 'APIX', 85.0, 87.83, 3.33]
SELL ['2021-09-05 06:25:38.497116', 'APIX', 87.83, 88.27, 0.5] TIME_OUT
43 Current Balance :  508141.21 ( -49.19 % )
BUY  ['2021-09-05 06:49:43.263319', 'REN', 1229.0, 1268.0, 3.17]
SELL ['2021-09-05 06:52:56.168606', 'REN', 1268.0, 1234.0, -2.68] STOP LOSS
44 Current Balance :  494515.97 ( -50.55 % )
BUY  ['2021-09-05 07:24:41.777341', 'REN', 1232.0, 1271.0, 3.17]
SELL ['2021-09-05 07:25:01.844899', 'REN', 1271.0, 1245.0, -2.05] STOP LOSS
45 Current Balance :  484399.99 ( -51.56 % )
BUY  ['2021-09-05 07:25:42.027309', 'MIX', 4.904, 5.066, 3.3]
SELL ['2021-09-05 07:36:16.389068', 'MIX', 5.066, 5.099, 0.65] TIME_OUT
46 Current Balance :  487555.38 ( -51.24 % )
BUY  ['2021-09-05 07:36:16.442793', 'WTC', 1150.0, 1193.0, 3.74]
SELL ['2021-09-05 07:46:51.304681', 'WTC', 1193.0, 1190.0, -0.25] TIME_OUT
47 Current Balance :  486329.34 ( -51.37 % )

 

문제점 분석

 상승 추세가 바로 하락 추세로 전환하게 되며, 잦은 STOP LOSS가 일어남으로 인하여, 손실이 누적되는것으로 판단됩니다. 결국 상승 추세에 대한 사기로직을 보완하여, 하루에 1번 매수주문을 하더라도 수익을 낼 수 있는 구조로 변경하는것이 바람직하다고 생각됩니다.

 

 다음에는 매수 로직을 좀 더 다듬어 봐야 겠습니다.

 

 

728x90
반응형

댓글