업비트 기준으로 113개 정도 되는 원화시장 상장 코인 중 113개 모든 코인을 감시할지, 아니면 상위 코인 30개 정도만 감시할지 고민이 필요하다.
나는 후자를 선택했다. 설정된 로직(기준)에 따라 거래량이 매우 적은 코인을 매수해버리면, 적은 거래량 때문에 매도하기가 매우 어렵기 때문이다.
내가 선택한 방법은 지난 24시간 동안의 거래량을 기준으로 정렬하여 상위 30개를 매수 감시대상으로 삼았다. 매수 감시대상에서 제외하고 싶은 코인은 "pass_tickers"에 담아 제거했다. 함수화한 코드는 다음과 같다.
import pandas as pd
import pyupbit
import requests
def get_tickers(watch_range=30, pass_tickers=['KRW-BTT', 'KRW-XEC']):
ticker_df = pd.DataFrame()
tickers = pyupbit.get_tickers(fiat="KRW")
for ticker in tickers:
url = "https://api.upbit.com/v1/ticker?markets=" + ticker
response = requests.get(url)
ticker_df = ticker_df.append(pd.DataFrame(response.json()))
time.sleep(0.05)
ticker_df = ticker_df.sort_values(by='acc_trade_price_24h', ascending=False).reset_index(drop=True)
ticker_df = list(ticker_df['market'][0:watch_range])
for pt in pass_tickers:
if pt in tickers:
tickers.remove(pt)
else:
pass
return tickers
거래량 상위 30개만 매수 감시대상에 포함할 것이므로, watch_range 변수를 30으로 하고, 거래량이 아무리 많아도 매수 감시대상에서 제외할 코인을 리스트로 pass_tickers에 담았다.
BTT(비트토렌트)와 XEC(이캐시) 코인은 현재 가격이 각 0.0024원, 0.1130원이다. 비트토렌트는 가격이 너무 낮다보니 1호가 변동폭이 4%에 달한다.
업비트 비트토렌드 현재가격(2022.04.13. 00:06)
비트토렌트는 1호가당 가격변동폭이 4%를 넘어서며, 호가당 매매물량도 엄청나다. 어쩌다가 0.0024원에 매수가 돼버리면, 0.0025원까지 가면 좋겠지만 가기가 매우 힘들다. 손절을 하려면 0.0023원에 해야 하는데, 순식간에 -4% 손실이 생긴다.
개인적 취향에 따라 이러한 코인을 매수 감시대상에서 제외할 수 있다.
"tickers = pyupbit.get_tickers(fiat="KRW")"을 실행하면 업비트 한화 마켓에 상장된 모든 코인(ticker) 목록을 받을 수 있다. "fiat="KRW""으로 한화 마켓 상종 코인만 검색했다. 생략하면 한화, 미화, 비트코인 시장에 상장된 코인들이 모두 다운로드 된다.
pyupbit.get_tickers(fiat="KRW")
"https://api.upbit.com/v1/ticker"로 업비트 api를 통해 현재가 정보를 조회할 수 있다. 끝부분에 "?markets=KRW-ETH" 등과 같이 코인 이름을 파라미터로 붙여주면 해당 코인의 현재를 조회할 수 있다.
업비트 이더리움 현재가 조회
현재가를 조회하면 위와 같이 json형태의 데이터를 확인할 수 있다. 필드명별 정의는 업비트의 api 페이지에서 확인할 수 있다.
업비트 api 현재가 조회
requests 라이브러리에 url을 넘기면 위에서 본 json 형태의 데이터를 다운로드할 수 있다. 그 데이터를 pandas의 dataframe 형태로 변환하면 보기 좋게 변환된다.
업비트 이더리움 현재가 조회 결과를 dataframe으로 변환
위 활동을 한화 마켓에 상장된 113개의 모든 코인에 적용하는 for 문을 실행하면 다음의 결과를 확인할 수 있다.
업비트 한화마켓 코인들의 현재가 조회 결과의 dataframe
이제 113개 코인의 현재가 정보를 모두 다운로드하였다.
"ticker_df = ticker_df.sort_values(by='acc_trade_price_24h', ascending=False).reset_index(drop=True)"를 통해 24시간 누적거래량(acc_trade_price_24h)을 기준으로 내림차순 정렬하고, index를 초기화한다.
"ticker_df = list(ticker_df['market'][0:watch_range])"를 통해 24시간 누적 거래량 상위 30개를 리스트로 생성한다.
이제 매수 감시대상 30개 코인이 선정되었다.
30개 코인중에 "KRW-XEC(이캐시)"가 있어 제거해보자.
불필요 코인 삭제
총 코인 수가 30개에서 29개로 줄었고, "KRW-XEC"가 리스트에서 제외된 것을 확인할 수 있다.
업비트에 종종 새로운 코인들을 상장된다. 2022년에 들어서도 4개의 신규 코인이 한화 마켓에 상장되었다.
- 2022.03.17. : CELO 셀로
- 2022.03.02. : T 쓰레스홀드
- 2022.02.08. : AVAX 아발란체
- 2022.01.11. : WEMIX 위믹스
신규 상장 코인은 상장 즉시 급증하는 경우가 잦았다. 지난 1월 11일에 상장된 WEMIX 위믹스는 시가 5,400원에 고가 13,490원을 기록하며 149.8% 상승하였다.
WEMIX 위믹스 신규 상장 일봉
하지만, 신규 상장 코인이 항상 상승하는 것은 아니다.
2021년 2월 24일 신규 상장한 도지코인(DOGE)은 130원으로 시작하여 고가 241원을 기록하며 85.4% 상승하였지만, 상승분을 모두 반납하고 저가 58.4원으로 -55.1%로 급락하였다.
도지코인(DOGE) 신규상장 일봉
다만, 한 가지 분명해 보이는 것은 신규 상장 코인은 상장 직후 엄청난 폭으로 상승한다.
심지어 셀로(CELO)는 특정 가격 이하로는 매도가 되지 않도록 하였다.
업비트 신규 상장 공지사항
신규 코인 상장을 탐지하여 매수하고 목표가(5% 등)에 도달하면 매도하여 매매차익을 실현하기 위해 "신규 코인 자동매매"를 운영하였다.
현재 코인 목록과 잠시 후 코인 목록을 비교하여, 새로운 코인이 발견되면 매수 대상으로 지정하여 관찰 및 매수하는 방식이다.
2022.02.08. AVAX 아발란체가 신규 상장되었다.
AVAX 아발렌체 신규 상장 5분봉
나의 신규 코인 자동매매가 AVAX를 탐지하고 매수 주문을 넣었다.
84,900원으로 시작했는데, 나의 주문은 111,000원에 체결되었다. 고가가 113,400원이었으니 매수 후 약 2% 상승이 있었지만 당연히 고가에 팔지 못하고 꼬꾸라졌다. 상당한 손실을 감안하고 손절해야만 했다.
10만원 미만으로 매수할 수 없었던 건 운이 없었다고 생각했다.
신규 코인 자동매매 개선을 적용해서 다음 기회에는 조금 더 빨리 매수할 수 있을 거 같았다.
2022.03.17. CELO 셀로가 신규 상장되었다.
개선된 자동매매에 기대를 걸어보았지만, 결과는 매수하지 못했다. 너무 빨리 매수를 시도해서 오류가 반환되었다.
CELO 셀로 상장 매수 실패
3월 17일 16시까지 없던 신규코인(CELO 셀로)을 탐지했다.
신규 상장 후 5분 동안 매수 주문이 제한되므로 5분 대기 후 매수 주문을 넣었는데, 5분이 다 지나기 전에 주문이 들어가 버렸는지 업비트에서 오류는 반환하고 매수에 실패했다. 아쉬운 마음을 뒤로하고 또다시 개선을 다짐했다. 신규 상장이 정말 가끔 발생하는 이벤트이기 때문에 내가 만든 코드가 오류 없이 잘 실행되는지 알기가 너무 힘들다.
ssid에 사용자의 집에 설치된 무선 인터넷 이름을 넣어주고, psk에 무선 인터넷 비밀번호를 입력한다.
micro sd 카드를 제거해서 라즈베리파이에 꽂아준다.이제 50% 이상 완료되었다.
pc에 putty라는 프로그램을 하나 더 설치해야 한다. "PuTTY는 SSH, 텔넷, rlogin, raw TCP를 위한 클라이언트로 동작하는 자유 및 오픈 소스 단말 에뮬레이터 응용 프로그램이다." 1)
음.. 무슨 말인지 모르겠다. 간단히 생각하면... 리눅스 계열의 서버에 원격으로 접속할 수 있는 프로그램이다. 라즈베리파이가 리눅스 기반이니, 라즈베리파이에 원격으로 접속해서 몇 가지 설정을 하기 위해 필요하다. pc에서 putty 공식 홈페이지로 이동하여 간단히 설치할 수 있다.
pc에 putty를 설치한 후, 실행하면 아래 그림과 같은 프로그램이 실행된다. Host Name과 Port에 라즈베리파이로 연결하기 위한 ip 주소와 포트를 입력한다.
라즈베리파이 원격 접속 putty
중요한 point
무선 인터넷으로 연결된 라즈베리파이와 유선 인터넷으로 연결된 pc가 동일한 공유기로 연결되어 있다면, 라즈베리파이의 ip만 알면 된다.
라즈베리파이의 ip를 아는 방법은 라즈베리파이와 같은 공유기에 연결된 핸드폰 등의 ip 주소를 찾아서 끝자리 숫자를 바꿔가며 입력해보는 방법이 있다. 휴대폰이 172.30.1.9 라는 ip를 할당받은 경우, "172.30.1.1 ~ 172.30.1.99"을 하나씩 입력해보면 찾을 수 있다. 다소 시간이 걸리지만 찾아야 한다.
무선 인터넷 신호를 발사하는 공유기와 유선 인터넷으로 연결된 pc가 각자 벽에서 나오는 인터넷 선에 연결되어 있다면(무선 공유기는 거실에 있고, pc는 방에 설치된 경우 등), 포트포워딩을 해줘야 한다.
라즈베리파이를 하나 샀다. 라즈베리파이는 와이파이로 인터넷에 연결이 되었고, 방에서 사용하는 데스크톱은 유선으로 인터넷에 연결되어 있다. 데스크톱에서 라즈베리파이로 원격으로 접속하고 싶은데 구글링으로 찾은 많은 방법들을 시도해봤고, KT 와이파이 관련 포트포워딩도 해봤지만 뭐가 잘못되었는지 나는 안되었다. 그 과정에서 라즈베리파이도 몇 번이나 초기화했고, 나도 너무 지쳤다.
거의 포기 단계에 이르렀을때, 전산 출신 직장 상사에게 포트포워딩에 대한 기본 개념을 설명 듣고 깨우쳤다. 모를 때는 미칠 것 같았는데, 알고 나니 ((뿌듯한 마음도 들지만)) 이거 때문에 그렇게나 많이 고생했나 싶었다.
우리집 네트워크 개념도
포트포워딩을 이해하기 위해선 우리 집 네트워크 개념도 이해가 먼저 필요했다.
① : 우리집으로 들어오는 라인이다. 우리 집은 신발장에 KT 허브가 있다.
② : 방에서 사용하는 유선 네트워크는 KT허브에서 나온 선에 연결되어 있다.
③ : 집에서 사용하는 무슨 네트워크는 유선으로 연결된 KT 공유기가 제공한다.
④ : KT 공유기는 무선 인터넷 신호를 발사한다.
⑤ : 라즈베리파이는 KT 공유기 발사한 무선 신호를 받아 인터넷에 연결된다.
내가 기존에 시도한 다양한 포트포워딩이 실패한 이유는 ②번에서 ⑤번으로 연결을 시도했기 때문이다. ②번은 공인IP인데 ⑤번은 사설IP이기 때문에 둘 사이의 연결은 안 된다.
②번이 ⑤번으로 연결하려면, "②→KT허브→③→④→⑤"의 경로를 타야 한다. ②와 ③은 똑같이 공인IP이니 연결이 되고, ⑤는 ③을 통해 무선으로 연결되어 있으니, "②→③→⑤"로 연결이 가능하다.
"②→③"으로 특정 포트로 연결되면, 그 연결을 "③→⑤"로 전달(forwarding) 해 주기 때문에 포트포워딩이 필요한 것이다.
공인IP와 사설IP에 대해 간단히 살펴보면 다음과 같다. 1)
1. 공인IP, 외부IP, Public IP ①을 통해 외부에서 집으로 들어온 네트워크를 의미한다. 허브를 통해 여러 곳으로 연결될 수 있다. 외부에서 우리 집 네트워크로 접속할 때 필요한 공인된 IP이다. "공인된 IP로 해당 IP를 통해 특정 내부 네트워크에 접속할 수 있다."
2. 사설IP, 내부IP, Private IP 집안에 형성되어 있는 내부 네트워크 안에 있는 기기(컴퓨터, 스마트폰 등)에 할당되어 있는 IP이다. 내부 IP는 인터넷에 연결되지 않기 때문에 내부 IP로는 외부 네트워크와 통신할 수 없다.