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
반응형
'44.개발로먹고사는남편하루 > 개발&코딩TIP' 카테고리의 다른 글
마이크로비트(micro:bit) 미세먼지 센서 구동(Feat. SZH-MN01) (0) | 2023.09.16 |
---|