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

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

by 큰공 2021. 9. 6.
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 기능을 추가

 

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

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

coinpipe.tistory.com

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

 

목표

 이번에 말씀드릴 내용은, 코인 시세 조회를 하면서 발생하는 "NONE TYPE ERROR" 에 대해서 공부한 내용에 대해서 공유하고자합니다. 해당 내용은 코인 로직이라기보다는, 파이썬 문법에 관련된 내용이오니, 관련하여 이해하기 위해서는 코딩에 관련된 살짝의 지식이 필요합니다.

 

 또한, 포스팅 말미에서 또다른 로직으로 상수값을 찾는 시뮬레이션을 공개토록 하겠습니다.

 

지속 가능성의 문제

 시뮬레이션을 하기위해서는 지속적으로 약 1초 간격으로 코인의 시세를 빗썸 API 를 이용하여, 지속적으로 체크를 하는데, 이 시점에서 빗썸 API의 문제로 인하여, 해당 값이 정상적으로 읽어 오지 못하는 문제점이 발생합니다.

 24시간 쉬지않고 시뮬레이션을 하여야 하는 특성상, 네트워크 사정이라던지, 서버 사정으로 인한 오류는 언제든지 발생할 수 있습니다.

 발생한 에러는 "It failed TypeError" , "TypeError: float() argument must be a string or a number, not 'NoneType' " 입니다.

It failed TypeError
Traceback (most recent call last):
  File "d:\Work\coin\coinpipe.py", line 58, in <module>
    current_price = float(pybithumb.get_current_price(buy_ticker))
TypeError: float() argument must be a string or a number, not 'NoneType'

 

에러 발생 부분

 에러는 아래 발생 부분에서 발생합니다.

 

current_price = float(pybithumb.get_current_price(buy_ticker))

 해당 값을 읽어 왔는데, 소수점 계산을 위해서 float 형으로 형변환을 시도했지만, 형변환을 시도하는 값의 원래 타입이 NoneType 이기때문에, float 형으로 형변환을 할 수 없어서 발생합니다.

 

 float을 이용해서 형변환을 하기 위해서는 인자로 String 또는 number 타입의 변수가 지정되어야 하나, 빗썸 API로 해당 값이 리턴될 때는 오류로 인하여 NoneType 으로 리턴되기 때문입니다.

 

 현재 가격을 얻어오는데 해당 return 값이 원래 String 으로 리턴이 되는데, 이것이 NoneType 으로 리턴되는 현상이 발생합니다. 이는 아래와 같은 로직에서 발생할 개연성이 존재합니다.

 

all = pybithumb.get_current_price("ALL")
current_price = pybithumb.get_current_price(buy_ticker)

 

 

NoneType 이란?

 python 에서 NoneType 을 정의하는 부분은 살짝 인용해 보았습니다.

python에서 NoneType은 값이 존재하지 않음(None Object)을 나타내는 Type 입니다. java에서 null과 유사한 의미를 가진다고 할 수 있을 것 같습니다.

 

NoneType is the type for the None object, which is an object that indicates no value. None is the return value of functions that "don't return anything". It is also a common default return value for functions that search for something and may or may not find it

NoneType은 값이 없음을 나타내는 객체인 None 객체의 유형입니다. None은 "아무것도 반환하지 않는" 함수의 반환 값입니다. 또한 무언가를 검색하고 찾을 수도 있고 찾지 못할 수도 있는 함수에 대한 일반적인 기본 반환 값입니다.

 pyhton 에서는 null 처리를 어떻게 하나 했는데, 이 None 객체를 사용하는군요. 

 그냥 쉽게 생각해서

NoneType 은 파이썬의 None 을 나타내는 Type 의 한 종류이다.

라고 이해해봅니다.

 

해결책

.
.
all = pybithumb.get_current_price("ALL") 
if all is None:
	break

current_price = pybithumb.get_current_price(buy_ticker)
if current_price is None:
	break
.
.

 해결책은 위와 같습니다. 해당 값이 None 인지 체크하고, while 문을 break 한뒤, 다시 재수행하면 됩니다.

 Java와 비교해보았을 때, null 체크를 하면 된다 라고 이해하면 빠를거 같습니다.

 

 Try - Catch 로 묶어서 예외처리를 하는것도 또 하나의 방법입니다!

 

시뮬레이션

 이제 본격적으로 에러도 잡았으니 시뮬레이션 결과를 또 공개 안할 수가 없죠!

 

 

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

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

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

 

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

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

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

 

거래가 가장 활발한 오전 9시에 딱 시작해서, 오후 5시까지의 결과입니다. 약 8시간 결과에 -4.44% 의 수익률이며, 장중 최고치 18.9% 까지 수익을 줬다가, -8.6% 까지도 내려갔다가, -4.44%에 마쳤네요.

 

시간당 수익률은

-0.55%

입니다.

 

BUY  ['2021-09-06 09:00:56.896860', 'FCT', 215.5, 225.0, 4.41]
SELL ['2021-09-06 09:02:56.982910', 'FCT', 225.0, 261.0, 16.0]
1 Current Balance :  1160000.0 ( 16.0 % )
BUY  ['2021-09-06 09:02:57.042755', 'FCT', 225.0, 260.0, 15.56]
SELL ['2021-09-06 09:05:02.195140', 'FCT', 260.0, 266.5, 2.5]
2 Current Balance :  1189000.0 ( 18.9 % )
BUY  ['2021-09-06 09:07:02.306503', 'ELF', 768.2, 799.9, 4.13]
SELL ['2021-09-06 09:09:53.113352', 'ELF', 799.9, 783.7, -2.03] STOP LOSS
3 Current Balance :  1164919.74 ( 16.49 % )
BUY  ['2021-09-06 09:11:53.220982', 'HIVE', 898.1, 978.2, 8.92]
SELL ['2021-09-06 09:13:53.268429', 'HIVE', 978.2, 956.0, -2.27] STOP LOSS
4 Current Balance :  1138482.18 ( 13.85 % )
BUY  ['2021-09-06 09:25:53.704539', 'BORA', 295.5, 312.0, 5.58]
SELL ['2021-09-06 09:27:58.861956', 'BORA', 312.0, 301.6, -3.33] STOP LOSS
5 Current Balance :  1100532.78 ( 10.05 % )
BUY  ['2021-09-06 09:33:59.156942', 'FCT', 256.7, 269.7, 5.06]
SELL ['2021-09-06 09:35:59.279771', 'FCT', 269.7, 287.9, 6.75]
6 Current Balance :  1174799.36 ( 17.48 % )
BUY  ['2021-09-06 09:35:59.347679', 'FCT', 269.7, 288.1, 6.82]
SELL ['2021-09-06 09:38:24.939268', 'FCT', 288.1, 281.6, -2.26] STOP LOSS
7 Current Balance :  1148293.99 ( 14.83 % )
BUY  ['2021-09-06 09:40:25.079254', 'STRAX', 3294.0, 3451.0, 4.77]
SELL ['2021-09-06 09:42:25.174569', 'STRAX', 3451.0, 3300.0, -4.38] STOP LOSS
8 Current Balance :  1098049.89 ( 9.8 % )
BUY  ['2021-09-06 09:48:25.465989', 'FCT', 286.7, 298.7, 4.19]
SELL ['2021-09-06 09:51:06.381755', 'FCT', 298.7, 292.3, -2.14] STOP LOSS
9 Current Balance :  1074522.88 ( 7.45 % )
BUY  ['2021-09-06 10:05:06.983042', 'FCT', 276.8, 292.1, 5.53]
SELL ['2021-09-06 10:10:15.642864', 'FCT', 292.1, 285.0, -2.43] STOP LOSS
10 Current Balance :  1048404.72 ( 4.84 % )
BUY  ['2021-09-06 10:26:16.363377', 'XPR', 8.099, 8.485, 4.77]
SELL ['2021-09-06 10:28:16.453011', 'XPR', 8.485, 8.305, -2.12] STOP LOSS
11 Current Balance :  1026163.96 ( 2.62 % )
BUY  ['2021-09-06 11:30:19.168618', 'FCT', 268.0, 282.6, 5.45]
SELL ['2021-09-06 11:34:52.222777', 'FCT', 282.6, 276.1, -2.3] STOP LOSS
12 Current Balance :  1002561.47 ( 0.26 % )
BUY  ['2021-09-06 12:28:54.987693', 'WOZX', 1074.0, 1143.0, 6.42]
SELL ['2021-09-06 12:30:55.098433', 'WOZX', 1143.0, 1083.0, -5.25] STOP LOSS
13 Current Balance :  949933.57 ( -5.01 % )
BUY  ['2021-09-06 15:31:02.566084', 'VELO', 1147.0, 1294.0, 12.82]
SELL ['2021-09-06 15:33:02.645078', 'VELO', 1294.0, 1245.0, -3.79] STOP LOSS
14 Current Balance :  913962.36 ( -8.6 % )
BUY  ['2021-09-06 15:39:02.931241', 'VELO', 1248.0, 1420.0, 13.78]
SELL ['2021-09-06 15:42:14.248335', 'VELO', 1420.0, 1455.0, 2.46]
15 Current Balance :  936489.6 ( -6.35 % )
BUY  ['2021-09-06 16:28:16.137288', 'VELO', 1413.0, 1470.0, 4.03]
SELL ['2021-09-06 16:30:51.864048', 'VELO', 1470.0, 1500.0, 2.04]
16 Current Balance :  955601.63 ( -4.44 % )

 

분석

 

 STOP LOSS 를 -2%에 제한 했음에도 불구하고, 순식간적으로 가격이 빠짐으로 인하여, -5.25%에 손절하는 현상도 발생하고, 같은 종목을 연속된 시간에 추가 구매를 해서 손해가 발생하는 현상도 나왔습니다. 

 또한, 거래량이 정말 적은 (소위 잡 코인) 까지 매매하는 현상도 나오고 있네요.

 

 일단, 전체적으로 수익과 손해의 횟수의 비중으로 보았을때 16번 매수/매도 중에 4번만 수익을 내고, 12번을 손해를 보았네요. 

 

 전체적으로 STOP LOSS 의 횟수를 줄이는 상수값을 좀 더 찾아 봐야겠습니다.

 

 긴 글 읽어주셔서 감사드립니다.

 

 

 

728x90
반응형

댓글9