1. ccxt란?
CCXT (CryptoCurrency eXchange Trading Library) 모듈은 자바스크립트, 파이썬, PHP와 같이
다양한 언어에서 범용적으로 사용할 수 있는 가상화폐 거래소 모듈입니다.
바이낸스 뿐만 아니라 비트파이넥스 (Bitfinex), 비트렉스 (bittrex), 크라켄 (kraken) 등등
125개 거래소의 API를 지원합니다.
출처 : https://wikidocs.net/31065
2. ccxt 설치하기
pip3 install ccxt
import ccxt
import re
re 모듈의 경우는 아래 코드에서 사용할 예정이라
미리 import를 했습니다.
3. 바이낸스 객체 생성 후 ticker 가져오기 (COIN.py)
#USDT 종목 생성
def usd_made():
#바이낸스 객체 생성
exchange = ccxt.binance()
#티커의 각종 정보를 딕셔너리로 불러옴
exchange.fetch_tickers()
#딕셔너리의 key값만 뽑아내서 리스트로 만들음
ticker = list(exchange.fetch_tickers().keys())
USDT_ticker = []
p = re.compile(r'\w+[/]USDT')
for i in ticker:
#레버리지 관련 토큰은 필터링함
if p.match(i) and 'UP' not in i and 'DOWN' not in i:
USDT_ticker.append(i)
path="/nomadcoders/boot/DB/usdcode.txt"
file = open(path, 'w')
for i in USDT_ticker:
file.write(i)
file.write("\n")
file.close()
- ccxt.binance를 이용하여 객체를 생성 후 리스트 값만 추출하여 ticker에 저장합니다.
- 이후 re.compile을 이용하여 '문자'+'/USDT'인 티커들을 P 값에 저장합니다.
- 이후 조건문을 사용하여 p값에 레버리지 토큰을 제외한 값을 USDT_ticker에 저장시키고
그 값을 usdcode.txt.에 저장합니다.
3. 파일에 저장 결과 (usdcode.txt)
- 이런 형식으로 356개의 ticker를 저장했습니다.
4. 입력받은 값과 ticker 연결 (COIN.py)
def usd_connect(coinname):
path="/nomadcoders/boot/DB/usdcode.txt"
file = open(path, 'r')
USDT_ticker = file.read().splitlines()
USDT = []
for i in USDT_ticker:
USDT.append(i)
file.close()
TICKER = ""
for i in range (len(usdcoin)):
if(coinname == usdcoin[i]):
TICKER = USDT[i]
return TICKER
- usdcode 값을 가져와 USDT_ticker에 저장한 후, USDT 리스트에 모두 추가해줍니다.
- 또한 입력받은 coinname 변수와 같은 usdcoin[i]값을 찾았을 때 TICKER 값에
USDT[i] 값을 저장하고 반환합니다.
+ 추가 설명
- coinname 값은 아래에서 입력받은 값이다.
- usdcoin 리스트는 356개의 코인이 한글로 저장되어 있다.
- usdcoin 리스트와 USDT의 ticker 값은 서로 매칭 되어있다.
EX) usdcoin[0] = 비트코인(BTC-USDT) 이면
USDT[0] = BTC/USDT
(이렇게 매칭된 USDT 값을 TICKER에
저장하는 이유는 ccxt를 이용하여 데이터프레임을
얻기 위해서는 영어 ticker 값이 필요하기 때문입니다.)
- 얻은 ticker 값으로 데이터프레임을 만든다. (finance_web.py)
#코인 시세 결과
@app.route("/inquiry/coinrate")
def coinreturn():
try:
moneyvalue = request.args.get('moneyValue')
coinname = request.args.get('coinname')
if(moneyvalue== "KRW"):
df_coin= COIN.coin_connect(moneyvalue,coinname,500)
coinrate = COIN.coin_rate(moneyvalue,coinname,df_coin)
elif(moneyvalue == "USD"):
ticker = COIN.usd_connect(coinname)
df_coin = COIN.get_df_binance(ticker, "1d")
coinrate = COIN.coin_rate(moneyvalue, coinname, df_coin)
COIN.basic_chart(df_coin, coinname,moneyvalue)
COIN.real_chart(df_coin,coinname)
except:
return redirect("/")
return render_template("inquiryCoinrate.html",searchingBy=coinname,
stockRate=coinrate)
- moneyvalue, coinname은 앞서 사용자에게 입력받은 값을 가져오는 것입니다.
- moneyvalue가 "KRW"일 경우에는 pyupbit를 이용하였기에 아래 링크를 참조하면 된다.
- 위 코드에 나오는 get_df_binance 함수 소스 코드(COIN.py)
#df 생성
def get_df_binance(ticker,time_interval):
exchange = ccxt.binance() #바이낸스 객체 생성
exchange.fetch_tickers() #티커의 각종 정보를 딕셔너리로 불러옴
data = exchange.fetch_ohlcv(ticker,time_interval) #값이 리스트로 반환된다
df = pd.DataFrame(data) #데이터프레임으로 만든다
df.columns = (['date','open','high','low','close','volume']) #컬럼 지정
def parse_dates(ts):
return datetime.datetime.fromtimestamp(ts/1000.0) #타임스탬프를 시간형식으로 전환
df['date'] = df['date'].apply(parse_dates) #Date컬럼에 적용
return df #데이터프레임 반환
- df_coin = COIN.get_df_binance(ticker, "1d")는 ccxt를 이용하여 fetch_ohlcv를 이용하여
특정 ticker의 "1d" 1일 기준으로 data에 저장한다.
- 이후 df에 data를 데이터프레임 형태로 컬럼을 지정하여 저장한다.
- 하지만 date의 경우 timestamp 형태로 저장되기 때문에 다시 "2022-04-01 00:00:00"과
같은 형태로 바꾸기 위해 def parse_dates(ts)를 이용한다.
- 이후 데이터프레임을 반환한다. 반환한 데이터프레임을 이용하여,
coinrate = COIN.coin_rate(moneyvalue, coinname, df_coin) 를 실행한다.
- 위 코드에 나오는 coin_rate 함수 소스 코드(COIN.py)
#코인 가격 리스트에 저장
def coin_rate(moneyvalue,coinitem,df):
nowDATE = time_format()
#오픈 가격만 뒤에서 2줄만 가져옴
df_open = df[['open']]
df_open = df_open[-2:]
df_close = df[['close']]
df_close = df_close[-1:]
#해당 값을 두 개의 변수에 저장
firstrate = df_open['open'].values[0]
lastrate = df_close['close'].values[0]
coinrate =[]
#날짜와 코인 이름, 현재 가격을 추가
coinrate.append(nowDATE)
coinrate.append(coinitem)
if(int(firstrate) > 100):
gap = "{0:,.0f}".format(lastrate-firstrate)
elif(int(firstrate)<1):
gap = "{0:,.3f}".format(lastrate-firstrate)
else:
gap = "{0:,.2f}".format(lastrate-firstrate)
if(moneyvalue == "KRW"):
#변동 계산 및 추가
coinrate.append("{0:,.0f}".format(lastrate)+"원")
coinrate.append(gap+"원")
elif(moneyvalue == "USD"):
#변동 계산 및 추가
if(int(firstrate)> 100):
coinrate.append("$"+"{0:,.0f}".format(lastrate))
elif(int(firstrate<1)):
coinrate.append("$"+"{0:,.3f}".format(lastrate))
else:
coinrate.append("$"+"{0:,.2f}".format(lastrate))
coinrate.append("$"+gap)
#수익률 계산 및 추가
profit = "{:.2f}".format((lastrate-firstrate)/firstrate*100)
coinrate.append("{0:,}".format(float(profit))+"%")
return coinrate
- coinrate 값은 함수를 실행한 finance_web.py로 반환된다.
- 그 값을 flask 함수로 html 파일에 coinrate 값(stockRate)을 넘겨
html 페이지의 테이블에 출력시키면 된다.
5. 최종 결과
위와 같이 입력하면 조회가 되는 페이지를 만들 수 있다!
더 자세한 소스 코드는 아래 링크를 참조하길 바란다.
'프로그래밍 > 파이썬' 카테고리의 다른 글
[Python] 파이썬 FinanceDataReader - 미국 ETF 시세 조회 (2) | 2022.10.07 |
---|---|
[Python] 파이썬 FianceDataReader - 미국 주식 가격 조회하기 (6) | 2022.10.07 |
[Python] 파이썬 데이터 분석 - 야후 파이낸스 데이터의 문제점과 보완방법 (1) | 2022.10.05 |
[Python] 파이썬 pyupbit - 비트코인 시세 웹 페이지에 출력하기 (0) | 2022.10.05 |
[Python] 파이썬 mplfinance로 캔들차트 그리기 (feat. OHLC) (1) | 2022.10.03 |