프로그래밍/파이썬

[Python] 파이썬 바이낸스 시세 가져와서 웹으로 출력하기(feat. ccxt)

매 석 2022. 10. 6. 11:12
반응형

 

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를 이용하였기에 아래 링크를 참조하면 된다.

 

[Python] 파이썬 pyupbit - 비트코인 시세 웹 페이지에 출력하기

1. pyupbit란 ? pyupbit는 업비트 사이트에 있는 여러 코인들의 이름과 시세를 가져올 수 있게 만든 라이브러리입니다. 이번 포스팅에서는 pyupbit 라이브러리를 이용하여 비트코인 시세를 가져와 html

maeseok.tistory.com

 

- 위 코드에 나오는 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. 최종 결과

위와 같이 입력하면 조회가 되는 페이지를 만들 수 있다!

더 자세한 소스 코드는 아래 링크를 참조하길 바란다.

 

GitHub - maeseok/FIANCE_PORTFOLIO_SERVICE-PAGE: python + html + css + flask + mongodb (Last)

python + html + css + flask + mongodb (Last). Contribute to maeseok/FIANCE_PORTFOLIO_SERVICE-PAGE development by creating an account on GitHub.

github.com