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

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

by 큰공 2021. 8. 21.
728x90
반응형

들어가며

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

 

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

들어가며  coinpipe 의 큰공입니다.  파이썬 자동화에 관심이 많은 큰공이, 이번에는 암호화폐(코인) 자동매매 봇 만들기에 도전해보고자 합니다.  기본적으로 "파이썬을 이용한 비트코인 자동매

coinpipe.tistory.com

 이전 글에 이어서, 자동매매 봇 만들기 #2 를 시작해보도록 하겠습니다. 혹시나, #1 편을 못보신 분들은 위의 링크로 보시고 오는것을 추천드립니다.

 

목표

 지난번 포스팅에서는 빗썸에서 제공하는 모든 가상화폐의 현재가를 출력하는 것을 해보았습니다. 이번 포스팅에서는 모든 가상화폐의 현재가와 24시간 변동률를 출력하고, 24시간 변동률을 토대로 내림차순 정렬하는것을 해보도록 하겠습니다.

 

 이번 포스팅에서는 데이터를 나타내는 중첩 딕셔너리 (nested dictionary), 와 sorted(), lambda 를 이해하는데 도움이 될 것입니다.

 

빗썸 API - 현재가 얻는 속도

 이전 포스팅에서 빗썸 API를 이용하여, get_current_price(ticker)를 이용하여, ticker에 해당되는 현재가격을 출력하는 것을 해보았습니다. 다만 이것의 문제점은 하나의 ticker의 현재가를 얻어오는것이 각각의 API를 사용하는것이라, 각 ticker 마다 네트워크 호출을 하여, 전체 가상화폐의 현재가를 얻어오는데 "시간" 이 꽤 소요됨을 파악했습니다.

 

 

빗썸의 Public API는 1초에 20회, Private API는 1초에 10회 사용 가능합니다.
Pubic API / Private API 모두 1초에 95회 요청이 가능합니다.
만약 초과해서 API를 호출하면 API의 사용이 제한될 수 있기 때문에 API 사용 횟수를 고려해서 프로그래밍해야 합니다. 예를 들어 빗썸에서 거래되는 모든 가상화폐에 대한 현재가를 조회하기 위해 get_current_price() 함수를 반복 호출하면 API 호출 제한에 걸릴 수 있습니다

 

 

 이에 빗썸에서는 해당 API를 호출하는데, 일정한 시간에 대한 제약을 두었습니다. 만약 시간의 제한이 없다면, 무수히 많은 요청으로 서버가 감당하기가 어렵게 되겠죠.

 

 개정판 책에서 해당 API 요청 횟수가 변경되어 있는걸로 봐서는 속도를 점점 향상시키고 있는것으로 보여집니다.

 

한번에 얻어오기 - 중첩 딕셔너리

 그래서 해당 부분을 해결하기 위해서는 get_current_price("ALL")을 사용해서 한 번에 모든 암호 화폐의 가격을 가져오는 것이 좋습니다.

 

 이 리턴된 값이 딕셔너리 라는 자료형으로 넘어오는데요. 또한 상세히 보면 이것은 중첩 딕셔너리 형태를 띄고 있다고 볼수 있습니다.

 

 딕셔너리는 key와 value 의 쌍으로 이뤄지는 자료형인데, get_current_price으로 리턴되는 딕셔너리는 value 의 값에 또 

딕셔너리가 있는 중첩 딕셔너리 구조입니다.

 

 즉, key : value ( key : value ) 의 구조를 가지고 있습니다. 다중 배열이라고 생각하면 이해가 좀 더 쉬울거 같습니다.

{
 'BTC': 
    {'opening_price': '56830000', 
    'closing_price': '57408000', 
    'min_price': '56369000', 
    'max_price': '57536000', 
    'units_traded': '822.48852726', 
    'acc_trade_value': '46947013060.4316', 
    'prev_closing_price': '56822000', 
    'units_traded_24H': '3041.85434618', 
    'acc_trade_value_24H': '169909195192.7267', 
    'fluctate_24H': '2959000', 
    'fluctate_rate_24H': '5.43'
    }, 
 'ETH': 
    {'opening_price': '3843000', 
     'closing_price': '3844000',
     'min_price': '3798000',
     'max_price': '3864000',
     'units_traded': '7019.69520816',
     'acc_trade_value': '26911848429.2441',
     'prev_closing_price': '3843000',
     'units_traded_24H': '31273.88351526',
     'acc_trade_value_24H': '118496764045.3036',
     'fluctate_24H': '156000',
     'fluctate_rate_24H': '4.23'}
     
     ,,,,,

 

그럼, BTC의 현재가격을 얻고 싶으면 어떻게 할까요?

 

중첩 딕셔너리에 첫번째 KEY 값에는 ticker를 넣고, 두번째 KEY 값에는 원하는 속성 값을 지정해 주면 됩니다.

print (all['BTC']['closing_price'])

 

 

정렬하기

 딕셔너리를 정렬하기 위해서는 sorted(), items(), lambda 를 사용할 수 있습니다.

 sorted(d.items(), key=lambda x : x[1])
  • 딕셔너리에 items() 메서드를 사용해주면 {"key" : value}의 형태를 [(key, value)]의 형태로 만들어 준다.
  • 이를 sorted해주면 key값을 기준으로 오름차순으로 정렬해준다. value값으로 정렬하려면 lambda를 사용해주면 된다.
  • 위와 같은 코드를 실행하면, value 로 정렬되어 표시됩니다.
sort_all = sorted(all.items(), key = lambda x : x[1]['fluctate_rate_24H'])

다중 딕셔너리를 정렬하기 위해서는 위와 같이, value 의 위치와, 하위 딕셔너리의 key 값을 2차원 배열처럼 읽어오면 정렬이 가능합니다.

 

 

완성된 코드

import pybithumb

all = pybithumb.get_current_price("ALL") 

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

count = 0

for ticker, data in sort_all :
    count+=1
    print(count, ticker, data['closing_price'], data['fluctate_rate_24H'])

 내림차순으로 정렬하기 위해서, reverse=True를 사용하였고, 실수형으로 정렬하기 위해서 float으로 형변환을 하였습니다.

 

 

 

결과물

 현시각 기준 24시간 변동률로 내림차순 정렬한, 가상화폐 목록입니다. 살짝의 시간차이가 있긴 하지만 빗썸에서 보는 내용과 동일한 내용이 나옴을 알 수 있습니다.

 

 오늘의 1등 가상화폐는 왐토큰 이네요~?

1 WOM 229.4 57.12
2 RSR 60.71 20.12
3 VALOR 555.6 19.64
4 VRA 34.55 18.65
5 ICX 1704 16
6 HIVE 624.2 15.19
7 FX 646.7 14.22
8 WTC 1117 13.62
9 NU 380.9 13.4
10 OCEAN 1052 13.01
11 BCHA 75600 12.58
12 REN 743.2 11.76
13 MIX 5.756 11.64
14 WOZX 1140 10.79
15 ALGO 1334 10.16
16 FLETA 16.36 10.02
17 MATIC 1819 9.58
18 CAKE 28620 9.53
19 BEL 2830 9.52
20 LRC 416.1 9.38
21 TRUE 205.7 9.36
22 GRT 1230 9.04
23 CTK 2570 8.99
24 BAL 34560 7.8
25 LINK 33760 7.55
26 AERGO 245.6 7.25
27 ARPA 90.56 7.21
28 HDAC 65.76 7.03
29 CTSI 939.5 6.98
30 LF 1605 6.93
31 VET 158.5 6.66
32 COMP 567500 6.57
33 BSV 198900 6.53
34 DOT 33040 6.48
35 BTG 79000 6.47
36 NMR 50850 6.47
37 BLY 38.75 6.46
38 AION 234.1 6.36
39 SOL 93400 6.32
40 BNB 535000 6.26
41 WIKEN 11.82 6.10
42 POWR 369.1 6.00
43 CRO 181.8 5.94
44 BTC 57797000 5.89
45 KNC 2320 5.84
46 CKB 17.51 5.80
47 SNT 119.3 5.76
48 MAP 39.53 5.75
49 MVC 42.03 5.71
50 XLM 451.5 5.71
51 TEMCO 9.007 5.62
52 RLC 5465 5.60
53 OXT 462.6 5.59
54 RLY 663.8 5.5
55 ZIL 128.1 5.43
56 RINGX 35.99 5.33
57 ALICE 15400 5.12
58 SXP 4350 5.07
59 ADA 2927 4.99
60 BOA 157.7 4.99
61 LUNA 36570 4.85
62 MXC 53.96 4.8
63 LTC 214000 4.7
64 ONG 1072 4.69
65 GXC 888.5 4.62
66 ENJ 1928 4.61
67 ETC 81200 4.57
68 BNT 5055 4.53
69 JST 83.35 4.50
70 AQT 5100 4.38
71 BAT 917.1 4.37
72 COS 21.8 4.36
73 STEEM 663.5 4.29
74 ORBS 116.4 4.21
75 DOGE 385.4 4.16
76 DAD 318.5 4.15
77 BCH 801500 4.09
78 COLA 353.2 4.00
79 XRP 1485 3.99
80 ANKR 120.3 3.98
81 AXS 86150 3.98
82 EM 6.626 3.94
83 PUNDIX 2082 3.94
84 GLM 512.2 3.89
85 FCT 143.4 3.84
86 VSYS 26.09 3.78
87 KLAY 2271 3.75
88 ELF 345.1 3.73
89 STRAX 2572 3.71
90 ONT 1268 3.68
91 BTT 5.279 3.67
92 CTXC 243.5 3.66
93 SSX 73.66 3.66
94 QKC 24.36 3.62
95 RAI 881.1 3.61
96 EOS 6345 3.59
97 CHZ 417.1 3.58
98 AWO 27.96 3.56
99 MLK 1368 3.56
100 ETH 3850000 3.52
101 AMO 3.74 3.52
102 XEM 241.7 3.51
103 LPT 25770 3.45
104 AAVE 486600 3.36
105 MANA 980.3 3.3
106 ZRX 1229 3.28
107 WICC 220.3 3.28
108 WAVES 28670 3.13
109 XPR 5.138 3.13
110 XVS 42860 3.13
111 BURGER 6455 3.12
112 BIOT 25.46 3.08
113 UNI 33650 3.06
114 BORA 271 3.04
115 ATOM 22500 3.02
116 MTL 3452 2.92
117 SAND 717.8 2.91
118 XTZ 4367 2.9
119 MBL 11.49 2.86
120 TRX 105.7 2.82
121 QTUM 16030 2.69
122 DAC 2.905 2.51
123 YFI 46436000 2.48
124 REP 32470 2.43
125 BAKE 3111 2.40
126 IOST 37.98 2.37
127 CON 3.901 2.33
128 LOOM 114 2.24
129 TFUEL 395.1 2.23
130 MM 446.7 2.2
131 TRV 20.19 2.18
132 BCD 3182 1.99
133 ASM 77.45 1.96
134 DVI 422.7 1.86
135 THETA 8525 1.85
136 META 148 1.79
137 MKR 4397000 1.78
138 WAXP 211.8 1.73
139 BASIC 7.868 1.71
140 IPX 46.8 1.67
141 UMA 14590 1.46
142 SNX 14800 1.37
143 CHR 453.8 1.29
144 MSB 319.4 1.27
145 EL 12.06 1.17
146 MIR 5325 1.04
147 EVZ 68.5 0.91
148 CENNZ 92.7 0.72
149 DAI 1179 0.43
150 XYM 181.8 0.33
151 SUSHI 16650 0.30
152 HIBS 6.046 0.3
153 CYCLUB 36.72 0.22
154 ANV 1355 0.22
155 PCI 739.9 -0.01
156 OMG 7180 -0.21
157 EGG 6.005 -0.27
158 VELO 677.5 -0.29
159 SRM 9250 -0.59
160 ORC 1339 -0.67
161 APIX 70.11 -0.75
162 SUN 41.5 -0.84
163 GOM2 13.24 -1.05
164 APM 42.53 -1.32
165 TMTG 3.926 -1.46
166 ANW 70.12 -1.61
167 LINA 74.95 -1.64
168 WEMIX 669 -1.76
169 FIT 2.106 -1.77
170 CELR 67.82 -1.77
171 GHX 82.27 -2.05
172 QTCON 20.65 -2.13
173 POLA 107 -2.28
174 SOC 153.3 -2.29
175 ARW 3989 -2.61
176 ADP 92.4 -3.65
177 OBSR 9.359 -5.93
178 KSM 797000 -9.48
179 XNO 140.7 -11.17

 

 

 

728x90
반응형

댓글