반응형

안녕하세요. 이번 포스팅에서는 달러 환율을 가져와서, 이전 포스팅에서 받아온 거래소별 보유자산에 환율을 적용해 계산 및 정리하는 코드를 작성해 보겠습니다. 이번 포스팅의 브라우저는 크롬을 사용했습니다.

 

1. 환율 사이트 분석

 네이버나 구글 등 포털사이트에 환율을 검색해도 나오지만, 업데이트 속도가 느린 것 같아서 아래의 사이트에서 환율을 조회하고자 합니다.

https://kr.investing.com/currencies/usd-krw

 

USD KRW | 미달러 원 환율 - Investing.com

USD/KRW 미달러 원 환율 실시간 스트리밍 차트, 변환기와 기술 분석

kr.investing.com

 

Investing.com

 사이트에 접속한 모습입니다. 빨간색으로 동그라미 친 부분을 크롤링해 보겠습니다. 

 

사이트 분석

 먼저 f12를 눌러 개발자 모드에 진입해줍니다. 그 후 사진의 1번(검사할 페이지 요소 선택)을 클릭한 뒤 크롤링하고자 하는 부분인 2번(현재의 환율)을 클릭합니다. 그럼 html에서 환율에 해당하는 부분이 선택되게 됩니다. 해당 부분은 아래와 같습니다. 파이썬에서 이 부분을 이용해 환율을 가져와 보도록 하겠습니다.

<span class="text-2xl" data-test="instrument-price-last">1,403.91</span>

 

2. 환율 크롤링

 Beautifulsoup을 이용해 환율 크롤링을 해보겠습니다.

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

req = Request('https://kr.investing.com/currencies/usd-krw', headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req)
soup = BeautifulSoup(html, 'html.parser')

dollar = soup.find("span", attrs={"class":"text-2xl"}).get_text()
dollar = float(dollar.replace(",", ""))

print(dollar)

 크롤링하고자 하는 사이트의 URL을 입력하고, 사이트의 차단을 방지하고자 headers값을 넣어줍니다. beautifulsoup을 통해 html을 가져와주고, 앞서 사이트에서 분석한 html부분을 이용해 환율을 얻어줍니다. 해당 부분의 태그인 span과 속성인 class="text-2xl"을 soup.find를 통해 찾아주고, get_text()를 이용해 텍스트 부분(1,403.91)만 얻어줍니다. 후에 계산을 위해 ','를 제거해주고, str에서 float로 바꿔주었습니다. 결과는 아래와 같습니다. 

1403.91

 

3. 환율 적용(계산)

 이전 포스팅에서 가져온 업비트와 바이낸스의 보유자산에 환율을 곱해서 원화와 달러로 얼마인지 계산해 보겠습니다. 

import dotenv
import os
import ccxt
import pandas as pd
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

apikeyUp = os.environ['up_apikey']
apisecretUp = os.environ['up_secret']
apikeyBn = os.environ['bn_apikey']
apisecretBn = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikeyBn, 'secret': apisecretBn})
upbit = ccxt.upbit(config={'apiKey': apikeyUp, 'secret': apisecretUp})

def receiveUp():
    global upbit_krw
    print('업비트에서 받아오는 중...')
    # 보유자산 조회
    balance = upbit.fetch_balance()['total']

    # 원화 마켓만 저장
    markets = upbit.fetch_tickers()
    coins = []
    amount = []
    price = []
    for key in balance.keys():
        try:
            price.append(markets[key+'/KRW']['last'])
            coins.append(key)
            amount.append(balance[key])
        except:
            pass

    # 소액 자산 제거
    acc_krw = balance['KRW']
    nameUp = ['KRW']
    amountUp = [acc_krw]
    priceUp = [1]
    krwUp = [acc_krw]

    for i in range(len(coins)):
        krw = amount[i] * price[i]
        if krw > 10000:
            nameUp.append(coins[i])
            amountUp.append(amount[i])
            priceUp.append(price[i])
            krwUp.append(krw)

    # 업비트 종합
    dfUp = []
    dfUp.append(nameUp)
    dfUp.append(amountUp)
    dfUp.append(priceUp)
    dfUp.append(krwUp)
    dfUp = pd.DataFrame(dfUp)
    dfUp = dfUp.transpose()
    dfUp.columns = ['Name', 'Amount', 'Price', 'KRW']
    upbit_krw = dfUp.sum(axis=0)['KRW']

    print(dfUp)
    print("Upbit KRW: {:,.0f} KRW".format(upbit_krw))

def receiveBn():
    global binance_usd
    print('바이낸스에서 받아오는 중...')
    # spot 
    balanceSpot = binance.fetch_balance()['total']
    spot = pd.DataFrame(list(balanceSpot.items()), columns=['name', 'balance'])

    # coin-m
    balanceCoinm = binance.fetch_balance(params={"type": 'delivery'})['total']
    Coinm = pd.DataFrame(list(balanceCoinm.items()), columns=['name', 'balance'])

    # spot and coin-m
    total = pd.concat([spot, Coinm])
    total = total[total['balance'] > 0]

    ############################################################
    # 중복데이터 정리
    dfBn = total.drop_duplicates("name", keep=False)

    df1 = total[total.duplicated('name', keep = 'first')]
    df2 = total[total.duplicated('name', keep = 'last')]

    # 분리된 데이터 더하기
    nameBn = []
    amountBn = []
    for coin in df1['name']:
        nameBn.append(coin)
        am = df1[df1['name'] == coin]['balance'].values[0] + df2[df2['name'] == coin]['balance'].values[0]
        amountBn.append(am)

    dfz = []
    dfz.append(nameBn)
    dfz.append(amountBn)
    dfz = pd.DataFrame(dfz)
    dfz =dfz.transpose()
    dfz.columns = ['name', 'balance']
    # dfBn: 중복 제거, dfz: 중복된 것들
    dfBn = pd.concat([dfz, dfBn])

    ############################################################
    # 비상장/소액 제거하기
    nameBn = []
    usdBn = []
    amountBn = []
    priceBn = []

    # 페어 및 가격 가져오기
    markets = binance.fetch_tickers()
    keys = markets.keys()

    for coin in dfBn['name']:
        amount = dfBn[dfBn['name'] == coin]['balance'].values[0]
        coin2 = coin + "/USDT"
        for pair in keys:
            if pair == coin2: # usdt 페어 있는 경우만
                price = markets[pair]['last']
                usd = price * amount
                if usd > 10: # 10$ 이상만
                    nameBn.append(coin)
                    usdBn.append(usd)
                    amountBn.append(amount)
                    priceBn.append(price)

    dfBn = [nameBn, amountBn, priceBn, usdBn]
    dfBn = pd.DataFrame(dfBn)
    dfBn = dfBn.transpose()
    dfBn.columns = ['Name', 'Amount', 'Price', 'USD']

    ############################################################
    # spot usdt + futures usds
    spot_usdt = balanceSpot['USDT']

    balanceUsds = binance.fetch_balance(params={"type": "future"})
    future_usd = balanceUsds['total']['USDT'] + balanceUsds['total']['BUSD']

    total_usd = spot_usdt + future_usd
    dfBn.loc[len(dfBn)+1] = ['USD', total_usd, 1, total_usd]

    binance_usd = dfBn.sum(axis=0)['USD']

    print(dfBn)
    print("Binance USD: {0:,.2f} USD".format(binance_usd))

def exchange():
    req = Request('https://kr.investing.com/currencies/usd-krw', headers={'User-Agent': 'Mozilla/5.0'})
    html = urlopen(req)

    soup = BeautifulSoup(html, 'html.parser')
    dollar = soup.find("span", attrs={"class":"text-2xl"}).get_text()
    dollar = float(dollar.replace(",", ""))

    return dollar

receiveUp()
receiveBn()

dollar = exchange()
totalKrw = upbit_krw + binance_usd*dollar
totalUsd = upbit_krw/dollar + binance_usd

print('현재 환율: {}'.format(dollar))
print('Total KRW: {:,.0f} KRW'.format(totalKrw))
print('Total USD: {:,.2f} USD'.format(totalUsd))

 이전에 작성한 코드의 보유자산에 환율을 대입해 모든 거래소의 총가치를 계산하고 출력했습니다. 결과는 아래와 같습니다. 

 

Total Finance

 

 추가적으로 수정한 사항을 적자면, 각각의 포스팅(업비트/바이낸스/환율)에서 작성한 코드들을 def 해주었고, 환율 계산을 위해 필요한 값들을 global을 통해 전역 변수로 지정해주었습니다. 각 거래소별로 보유자산을 받아오기 전에 문구를 출력해, 과정을 알 수 있게 했습니다.

 


 다음 포스팅에서는 계산한 결과들 중 필요한 정보들만 엑셀에 저장해, 지난 자산흐름을 알아보기 쉽게 해 보겠습니다. 읽어주셔서 감사합니다.

반응형

+ Recent posts