상세 컨텐츠

본문 제목

파이썬 디스코드로 주식 조회하기 #2

Economic discord bot 만들기

by grizzly 2025. 2. 12. 16:01

본문

오늘은 지난 번 포스팅에 이해 주식 조회하기를 이어서 구현할 것이다.

지난 번 코드에서 kis 로그인과 디스코드 로그인 부분의 코드를 따로 나누지 않았고 개별 주식에 대한 조회를 디스코드의 입력을 통하여 처리하도록 해놓았기 때문에 이 부분에 대해서 일단 건드리지 않고 코랩과 python 단일 창을 통해서 새로 구현할 것이다.

from pykis import PyKis, KisAuth, KisBalance,KisQuote
class private_kis:
  def __init__(self):
    self.token = None
    self.kis = None

  def connect_token(self, token_path):
    self.kis = PyKis(token_path, keep_token = True)
    self.kis = PyKis(KisAuth.load(token_path), keep_token = True)
    token_kis = self.kis
    return token_kis # 연결된 객체를 반환함

class private_account:
  def __init__(self, kis):
    self.account = None
    self.Kis = kis

  def connect_account(self):
    self.account = self.Kis.account()
    balance: KisBalance = self.account.balance()
    return balance

class KIS_stock:
  def __init__ (self, kis):
    self.stock = None
    self.kis = kis # connect_token 에서 반환된 연결된 token임

  def connect_stock(self, name):
    self.stock = self.kis.stock(name) # name 에 해당하는 주식과 객체를 연결함.

  def search_stock(self):
    quote: KisQuote = self.stock.quote() # name으로 저장된 주식을 반환함
    quote: KisQuote = self.stock.quote(extended = True)
    return quote

기본 구현 클래스를 만들어뒀다.

이를 통해서 토큰 연결, 계좌 연동(실제로 쓰이진 않았음), kis_stock 객체를 통해서 kis 주식 데이터를 가져올 코드를 작성하였다.

 

이제 이를 통해서 실제 데이터를 가져오겠다.

 

sp100_tickers = [
    "AAPL","MSFT", "AMZN", "TSLA", "NVDA", "META", "JNJ", "GOOGL","V",
    "XOM", "PG", "CVX", "PFE", "KO", "INTC", "WMT", "MCD", "PEP", "HD", "ABBV",
    "VZ",]
    # "ABT", "CRM", "DIS", "NKE", "MRK", "BMY", "TXN", "LMT", "ORCL", "AMGN",
    # "CVS", "HON", "UNH", "GE", "MMM", "GS", "CAT", "MDT", "NKE", "HD", "PFE",
    # "BLK", "MS", "CL", "RTX", "JCI", "GM", "BA", "LLY", "NEE", "D", "TMUS",
    # "AXP", "PM", "COP", "LUMN", "SPGI", "IBM",
    # "SCHW", "MCD", "HSY", "BIIB",
    # "AMD", "TMUS", "BMY", "LLY", "CI", "MS", "HPE", "MAR", "DAL", "AIG",
    # "UPS", "SYY", "CI", "SLB", "CTSH", "CTVA", "MOS", "ILMN", "EXC", "DIS",
    # "ANTM", "BLK", "KR", "LLY", "REGN", "LUMN", "QCOM", "GD", "AZN", "WFC",
    # "C", "LMT", "CB", "ANTM", "AMT", "WM"

일단 이렇게 넣었다.

(주석처리를 한 이유는 먼저 코랩에서 작성을 하였는데 일정 개수 이상의 주식 이름을 넣으면 오류가 난다.)

해당 코드를 통하여 조회를 하면

json = []
p_kis = private_kis()
p_stock = p_kis.connect_token('secret.json') #json 파일로 저장된 secret key를 통해 api 연결
for name in sp100_tickers:
  kis_stock = KIS_stock(p_stock)
  kis_stock.connect_stock(name)
  stock_data = kis_stock.search_stock()
  dic_data = {
    "CODE":name,
    "NAME":stock_data.name,
    "PER":float(stock_data.indicator.per),
    "PBR":float(stock_data.indicator.pbr),
    "eps":float(stock_data.indicator.eps),
    "bps":float(stock_data.indicator.bps)
  }
  print(dic_data)
  json.append(dic_data)
{'CODE': 'AAPL', 'NAME': '애플', 'PER': 36.92, 'PBR': 52.41, 'eps': 6.3, 'bps': 4.44}
{'CODE': 'MSFT', 'NAME': '마이크로소프트', 'PER': 33.14, 'PBR': 10.11, 'eps': 12.42, 'bps': 40.71}
{'CODE': 'AMZN', 'NAME': '아마존닷컴', 'PER': 42.15, 'PBR': 8.62, 'eps': 5.52, 'bps': 27.0}
[02/12 15:30:14] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'TSLA', 'NAME': '테슬라', 'PER': 161.16, 'PBR': 14.49, 'eps': 2.04, 'bps': 22.67}
{'CODE': 'NVDA', 'NAME': '엔비디아', 'PER': 52.31, 'PBR': 49.39, 'eps': 2.54, 'bps': 2.69}
{'CODE': 'META', 'NAME': '메타 플랫폼스(페이스북)', 'PER': 30.09, 'PBR': 9.99, 'eps': 23.92, 'bps': 72.07}
[02/12 15:30:15] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'JNJ', 'NAME': '존슨 앤드 존슨', 'PER': 26.93, 'PBR': 5.36, 'eps': 5.8, 'bps': 29.14}
{'CODE': 'GOOGL', 'NAME': '알파벳 A', 'PER': 23.03, 'PBR': 6.96, 'eps': 8.05, 'bps': 26.62}
{'CODE': 'V', 'NAME': '비자', 'PER': 35.83, 'PBR': 18.34, 'eps': 9.79, 'bps': 19.13}
[02/12 15:30:16] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'XOM', 'NAME': '엑슨 모빌', 'PER': 14.23, 'PBR': 1.84, 'eps': 7.85, 'bps': 60.58}
{'CODE': 'PG', 'NAME': '프록터 앤드 갬블', 'PER': 26.99, 'PBR': 7.89, 'eps': 6.28, 'bps': 21.49}
{'CODE': 'CVX', 'NAME': '셰브론', 'PER': 16.23, 'PBR': 1.81, 'eps': 9.7, 'bps': 86.92}
{'CODE': 'PFE', 'NAME': '화이자', 'PER': 18.13, 'PBR': 1.57, 'eps': 1.41, 'bps': 16.29}
[02/12 15:30:18] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'KO', 'NAME': '코카콜라', 'PER': 28.08, 'PBR': 10.99, 'eps': 2.41, 'bps': 6.15}
{'CODE': 'INTC', 'NAME': '인텔', 'PER': 4.8, 'PBR': 0.91, 'eps': 4.37, 'bps': 22.93}
{'CODE': 'WMT', 'NAME': '월마트', 'PER': 42.08, 'PBR': 9.34, 'eps': 2.44, 'bps': 10.97}
[02/12 15:30:19] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'MCD', 'NAME': '맥도날드', 'PER': 27.23, 'PBR': 0.0, 'eps': 11.39, 'bps': 0.0}
{'CODE': 'PEP', 'NAME': '펩시코', 'PER': 20.96, 'PBR': 11.08, 'eps': 6.95, 'bps': 13.15}
{'CODE': 'HD', 'NAME': '홈 디포', 'PER': 28.29, 'PBR': 71.46, 'eps': 14.72, 'bps': 5.83}
[02/12 15:30:20] WARNING: API 호출 횟수를 초과하여 호출 유량 획득까지 대기합니다.
{'CODE': 'ABBV', 'NAME': '애브비', 'PER': 80.02, 'PBR': 56.2, 'eps': 2.4, 'bps': 3.41}
{'CODE': 'VZ', 'NAME': '버라이존 커뮤니케이션스', 'PER': 9.78, 'PBR': 1.72, 'eps': 4.14, 'bps': 23.57}

아래와 같이 나오게 된다. 이제 이렇게 나온 해당 데이터들을 이리저리 만져보겠다. 기본적으로 뭔가 시각화하면 있어보인다 생각하여 기본적인 시각화를 시작하겠다. 아직 따로 실제 서비스를 위하여 만든다기 보다는 구현해서 확인하는 용도이기 때문에 class로 묶거나 함수로 묶지는 않겠다.

 

dic_data = [{'CODE': 'AAPL', 'NAME': '애플', 'PER': 36.92, 'PBR': 52.41, 'eps': 6.3, 'bps': 4.44}
            , {'CODE': 'MSFT', 'NAME': '마이크로소프트', 'PER': 33.14, 'PBR': 10.11, 'eps': 12.42, 'bps': 40.71}
            , {'CODE': 'AMZN', 'NAME': '아마존닷컴', 'PER': 42.15, 'PBR': 8.62, 'eps': 5.52, 'bps': 27.0}
            , {'CODE': 'TSLA', 'NAME': '테슬라', 'PER': 161.16, 'PBR': 14.49, 'eps': 2.04, 'bps': 22.67}
            , {'CODE': 'NVDA', 'NAME': '엔비디아', 'PER': 52.31, 'PBR': 49.39, 'eps': 2.54, 'bps': 2.69}
            , {'CODE': 'META', 'NAME': '메타 플랫폼스(페이스북)', 'PER': 30.09, 'PBR': 9.99, 'eps': 23.92, 'bps': 72.07}
            , {'CODE': 'JNJ', 'NAME': '존슨 앤드 존슨', 'PER': 26.93, 'PBR': 5.36, 'eps': 5.8, 'bps': 29.14}
            , {'CODE': 'GOOGL', 'NAME': '알파벳 A', 'PER': 23.03, 'PBR': 6.96, 'eps': 8.05, 'bps': 26.62}
            , {'CODE': 'V', 'NAME': '비자', 'PER': 35.83, 'PBR': 18.34, 'eps': 9.79, 'bps': 19.13}
            , {'CODE': 'XOM', 'NAME': '엑슨 모빌', 'PER': 14.23, 'PBR': 1.84, 'eps': 7.85, 'bps': 60.58}
            , {'CODE': 'PG', 'NAME': '프록터 앤드 갬블', 'PER': 26.99, 'PBR': 7.89, 'eps': 6.28, 'bps': 21.49}
            , {'CODE': 'CVX', 'NAME': '셰브론', 'PER': 16.23, 'PBR': 1.81, 'eps': 9.7, 'bps': 86.92}
            , {'CODE': 'PFE', 'NAME': '화이자', 'PER': 18.13, 'PBR': 1.57, 'eps': 1.41, 'bps': 16.29}
            , {'CODE': 'KO', 'NAME': '코카콜라', 'PER': 28.08, 'PBR': 10.99, 'eps': 2.41, 'bps': 6.15}
            , {'CODE': 'INTC', 'NAME': '인텔', 'PER': 4.8, 'PBR': 0.91, 'eps': 4.37, 'bps': 22.93}
            , {'CODE': 'WMT', 'NAME': '월마트', 'PER': 42.08, 'PBR': 9.34, 'eps': 2.44, 'bps': 10.97}
            , {'CODE': 'MCD', 'NAME': '맥도날드', 'PER': 27.23, 'PBR': 0.0, 'eps': 11.39, 'bps': 0.0}
            , {'CODE': 'PEP', 'NAME': '펩시코', 'PER': 20.96, 'PBR': 11.08, 'eps': 6.95, 'bps': 13.15}
            , {'CODE': 'HD', 'NAME': '홈 디포', 'PER': 28.29, 'PBR': 71.46, 'eps': 14.72, 'bps': 5.83}
            , {'CODE': 'ABBV', 'NAME': '애브비', 'PER': 80.02, 'PBR': 56.2, 'eps': 2.4, 'bps': 3.41}
            , {'CODE': 'VZ', 'NAME': '버라이존 커뮤니케이션스', 'PER': 9.78, 'PBR': 1.72, 'eps': 4.14, 'bps': 23.57}]

json_data에 배열의 형태로 append 한 결과는 다음과 같다. 이제 이거로 그래프를 그려보겠다.

 

 

import matplotlib.pyplot as plt
import numpy as np

name = []
per = []

for stock in dic_data:
    name.append(stock["CODE"])
    per.append(stock["PER"])

plt.plot(name, per)
plt.show()

해당 코드를 실행하면 Plot 그래프를 그리게 된다. 그림은 아래와 같다.

이렇게 되면 per과 주식 code에 관련한 plot 그래프를 그리게 된다.

이어서 주식 #3 에서 이어서 하겠다.

관련글 더보기