44.개발로먹고사는남편하루/개발&코딩TIP

JupyterLab(Python)을 이용해서 나의 주식 현재가격을 알아보자

amymom 2022. 9. 28. 12:40
728x90
반응형
주피터 파이썬을 이용해서 입력한(json) 주식의 현재 가격을 알아보는 프로그램을 간단하게 만들어 보겠다. 

 

따라해보는데는 한 30분이면 가능할 것이다. 

제가 사용할 주피터는 시놀로지 나스에 설치되어 있는 주피터이고 웹으로 접속해서 작성하였다.

 

이제 바로 코딩을 하기전에 구조를 약간 만들고 가보겠다.

폴더는 json_c_data , json_data , json_maker 이렇게 만들고 stock.ipynb 파일을 만든다

json_maker 폴더에 현재 내가 가지고 있는 주식 정보를 json으로 만들어줄 python을 만들어줍니다.

파일이름은 stock_kr_maker.ipynb 으로 만들자

 

 

 

요렇게 구조를 만든다...

 

#1 stock_kr_maker.ipynb 에 들어가서 이제 코딩을 해보자

# 데이터를 json으로 만드는 소스이므로 json만 import하여 사용하면 됩니다.
import json

# 딕셔너리구조로 만들기 위해서 정의한다
stock_group = dict()

# 현재가지고 있는 주식수 및 매수가격을 json으로 만들어 주는 부분이다.
K005180 = dict()             # 해당 주식번호로 딕셔너리를 만들어준다.
K005180["avg_cost"] = 44321  # 키를 이용하여 값을 넣어준다.
K005180["shares"] = 200      # 키를 이용하여 값을 넣어준다.

# 위 처럼 만들게 되면 {'avg_cost': 44321, 'shares': 200} <= 이런식으로 만들어준다.
stock_group["005180.KS"] = K005180
# 이렇게 만들어진 것을 아까 정의한 stock_group 딕셔너리에 넣어주면
# {'005180.KS' : {'avg_cost':44321, 'shares':200}} 이런식으로 이중구조를 가지게 된다.

K402340 = dict()
K402340["avg_cost"] = 42300
K402340["shares"] = 2000
stock_group["402340.KS"] = K402340

# json 파일을 json_data 폴더에 user_stock_share_kr.json으로 저장한다.
# "w" 옵션은 무조건 다시 쓰는 것이다.
# encoding 형식은 UTF-8
# json.dump를 아래처럼해주면 된다.
with open('../json_data/user_stock_share_kr.json', 'w', encodin='utf-8') as make_file:
	json.dump(stock_group, make_file, indent="\t")

# 저장된 파일을 json_data에 로드하여 저장하는 부분
with open('../json_data/user_stock_share_kr.json', 'r') as f:
	json_data = json.load(f)
    
# 로드된 json_data를 확인하기 위해서 프린트 해준다.
print(json_data)

# json 형식에서 키와 값을 받아오는 방법이다.
# 제대로 저장되었는지 확인하는 부분
for key, value in sorted(json_data.items()):
	for key1, value1 in sorted(value.items()):
    	print(key1)
        print(value1)

print("데이터 개수 : %d" % len(json_data.items()))

 

위처럼 코딩을 하게 되면 아래와 같은 결과를 얻을 수 있다.

 

 

파일생성은 잘되었는지 확인

 

 

생성된 파일이다. 확내부를 확인해봐야겠다 제대로 만들어 졌는지

 

 

정상적으로 결과가 들어왔다...

 

#2 이제 본 프로그램을 작성해보겠다. stock.ipynb

 

위 에서는 내가 매수한 주식을 등록하는 코드였다. json으로 잘 작성되었다면 다음 코드를 작성해보자...

# 이번에는 import 되는 것이 많이 있다.

import json
import pandas as pd
import pandas_datareader as pdr
import yfinance as yf
import requests
from bs4 import BeautifulSoup

# 002 -> 저장된 데이터를 가져와서 현재가격을 포함해서 json파일로 만드는 부분
def user_share_data_analyzer(path, type):
	share_path = str(path)
    stock_list = []   # 키값을 받아오기 위한 배열
    
    # 데이터 user_stock_share_kr.json 파일을 로드하는 부분
    with open(share_path, 'r') as f:
    	json_data = json.load()
    
    # 키값만 받아오는 부분
    for key, value in sorted(json_data.items()):
    	stock_list.append(key)
        
    # 키값을 출력하는 부분
    print(stock_list)
        
    # 현재시세를 받아와서 저장하는 json을 위해서 정의
    stock_group = dict()
    
    # 주식의 길이를 확인해서 정보를 받아오는 부분
    for i in range(0, len(stock_list)):
    	name = dict()
        ticker = stock_list[i]
        share = user_share(ticker, "share", json_data)
        avg_cost = user_share(ticker, "avg_cost", json_data)
        
        try:
        	# 현재 주식가격을 받아오는 함수를 만들어서 데이터를 가져온다.
        	current_price = stock_info(ticker, "current_price", 1)
            stock_name = stock_info(ticker, "company_name", 0)
        except:
        	# 에러가 났을때 계속 다음 데이터를 가져오기 위함
        	print("(" + stock_list[i] + ")=> Ticker가 잘못되었습니다!")
            continue
            
        name["name"] = stock_name
        name["c_price"] = round(currnet_price, 2)
        name["avg_cost"] = avg_cost
        name["shares"] = share
        stock_group[ticker] = name
        
        # 프로그래스를 이용해서 기다리는 시간을 확인
        printProgress(i+1, len(stock_list))
        
    save_path = './json_c_data/user_' + type + '_stock.json'
    
    # 현재시세를 가져와서 저장하는 부분이다.
    with open(save_path, 'w', encoding='utf-8') as make_file:
    	json.dump(stock_group, make_file, indent="\t")

# 003 -> json데이터에서 내가 원하는 값을 받아온다 user_share 함수를 정의한다.
def user_share(ticker, symbol, data):
	for key, value in data.items():
    	if ticker == key:
        	if symbol == "share":
            	return value['shares']
            elif symbol == "avg_cost":
            	return value['avg_cost']

# 004 -> 주식데이터를 받아오는 함수
def stock_info(ticker, command, option):
	COMPANY = yf.Ticker(ticker)
    DEBUG = 0
    
    # 현재가격확인 : current_price : 0->현재가격확인 , 1->현재가격리턴
    if (command == "current_price"):
    	price = COMPANY.history(period="0d")['Close'][0]
        if (option == 0):
        	print('현재가격 : %s' % price)
        elif (option == 1):
        	return price
    # 회사이름확인 : company_name : 0->shortName(회사이름), 1->longName(회사이름)
    elif (command == "company_name"):
    	if (option == 0):
        	name = COMPANY.info['shortName']
            if (DEBUG == 1):
            	debug_log("회사이름", name)
            return name
        elif (option == 1):
        	name = COMPANY.info['longName']
            if (DEBUG == 1):
            	debug_log("회사이름" name)
            return name
            
# 005 -> 프로그래스바 함수
def printProgress(iteration, total, prefix='진행중', suffix='완료', decimals=1):
	percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(100 * iteration // total)
    bar = ']' * filledLength + '-' * (100 - filledLength)
    print(f'\r{prefix} |{bar}| {percent}%{suffix}', end='')
    if iteration == total:
    	print()

# 006 -> 데이터를 받아와서 출력을 해주는 함수
def user_total_stock(path, type, debug):
	share_path = path
    total_price = 0      # 총금액
    total_buy_price = 0  # 매수총금액
    exchange_cost = '{0}'.format(exchange_info("USD", 1))
    exchange_cost = float(exchange_cost.replace(',', '')  # 금액에 ,을 넣어주는부분
    
    # 데이터를 로드하는 부분 
    with open(share_path, 'r') as f:
        json_data = json.load(f)
    
    total_price = 0
    total_buy_price = 0
    # 키값만 받아오는 부분
    print("--------------------------------------------------------------------------------------------------------------------------------------")
    print("| %10s | %35s | %5s | %18s | %8s | %39s |" % 
            ("Stock Code", "Company Name", "Share", "Buy Market Value", "Change", "Korea cost"))
    print("--------------------------------------------------------------------------------------------------------------------------------------")
        
    for key, value in json_data.items():
        key_price = value['c_price'] * value['shares']
        total_price = total_price + key_price
        key_buy_price = value['avg_cost'] * value['shares']
        total_buy_price = total_buy_price + key_buy_price
        
    for key, value in json_data.items():
        key_price = value['c_price'] * value['shares']
        stkShare = value['shares']                           # 주식갯수
        name = value['name']                                 # 주식이름
        rate = (key_price / total_price) * 100
        key_buy_price = value['avg_cost'] * value['shares']
        buy_rate = (key_buy_price / total_buy_price) * 100
        
        up = (((key_price / key_buy_price) * 100) - 100)
        value = float(round(up, 2))
            
        if debug == 1:
            if type == "kr":
                print("| %10s | %35s | %5s | %11s(%5.1f) | %8.2f | %17s  %13s(%5.1f) |" % (
                    key,
                    name,
                    stkShare,
                    format(round(key_buy_price), ","),
                    round(buy_rate, 2),
                    value,
                    "",
                    format(round(key_price), ","),
                    round(rate, 2)
                    ))
                
        print("--------------------------------------------------------------------------------------------------------------------------------------")
    

    if type == "kr":
        if debug == 1:
            print("KOREA Cost : %s" % format(round(total_price), ","))
        return total_price
    
    

# 007 -> 환율을 가져오는 함수
def exchange_info(currency, option):
	# 네이버 환율 정보가 있는 페이지를 크롤링한다.
    res = requests.get('https://finance.naver.com/marketindex/exchangeList.naver')
    soup = BeautifulSoup(res.content, 'html.parser')
    items = soup.select('body > div > table > tbody > tr')
    
    for item in items:
        # \n \t 를 제거하여 환율이름만 잘라내는 부분
        name = item.select('td')[0].text.replace("\n", "")
        name = name.replace("\t", "")
        full_name = name.split(' ')
        
        if (full_name[1] == "공화국") and (currency == "ZAR"):
            company = full_name[0] + full_name[1]
            exc_ticker = full_name[2]
        else:
            company = full_name[0]              # 나라이름
            exc_ticker = full_name[1]           # 환율단위
            
        price = item.select('td')[1].text   # 환율가격
       
        if (exc_ticker == currency):
            if(option == 0):
                print(company + "(" + exc_ticker + ") : " + price)
            elif(option == 1):
                return price

debug = 1
# 001 -> 함수는 처음 만든 데이터를 로드해서 분석하는 함수이다.
# 001 ~ 005 까지 작성했다면 현재시세가 입력된 json이 저장된다.
user_share_data_analyzer('./json_data/user_stock_share_kr.json', 'kr')


total_kr = user_total_stock('./json_c_data/user_kr_stock.json', 'kr', debug)
print("=============================")
print("Total Stock Cost : %s" % format(total_kr, ","))

 

두번째 소스까지 다 했다면 이제 실행을 해보자

 

 

 

 

 

그럼 다음에 다시 보시죠~ -_-) 가끔 올릴께요 ㅋ

728x90
반응형