import pandas as pd
import pandas_datareader.data as readData

import tkinter as tk
from tkinter import ttk
from tkinter import Menu

Main_win = tk.Tk()

Main_win.title('Stock BigData')
Main_win.geometry("840x525")
Main_win.resizable(False, False)

def _quit():
Main_win.quit()
Main_win.destroy()
exit()

def _check_search():
stock_code = str(_find_code()) + '.KS'
start_day = topFrame_start_day_entered.get()
end_day = topFrame_end_day_entered.get()

df = pd.DataFrame(readData.DataReader(stock_code, "yahoo", pd.to_datetime(start_day), pd.to_datetime(end_day)))
print(df)

def _find_code():
url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download'
df = pd.read_html(url, header=0)[0]
df = df[['회사명', '종목코드']]
df['종목코드'] = df['종목코드'].astype(str)
df['종목코드'] = df['종목코드'].apply(lambda x: x.zfill(6))

stock_name = topFrame_name_entered.get()

stock_code = df[df['회사명'] == stock_name].iloc[0][1]

return stock_code

topFrame = tk.Frame(Main_win, relief='solid')
topFrame.pack(side='top', fill='both', expand=1)

topFrame_label_1 = ttk.Label(topFrame, text=" 종목명 ")
topFrame_label_1.grid(column=0, row=0, sticky='w', padx=5, pady=5)

topFrame_name = tk.StringVar()
topFrame_name_entered = ttk.Entry(topFrame, width=24, textvariable=topFrame_name)
topFrame_name_entered.grid(column=1, row=0, sticky='w', padx=5, pady=5)

topFrame_label_2 = ttk.Label(topFrame, text=" 시작일 ")
topFrame_label_2.grid(column=2, row=0, sticky='w', padx=5, pady=5)

topFrame_start_day = tk.StringVar()
topFrame_start_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_start_day)
topFrame_start_day_entered.grid(column=3, row=0, sticky='w', padx=5, pady=5)
topFrame_start_day_entered.insert(0, "2000.01.01")

topFrame_label_3 = ttk.Label(topFrame, text=" 종료일 ")
topFrame_label_3.grid(column=4, row=0, sticky='w', padx=5, pady=5)

topFrame_end_day = tk.StringVar()
topFrame_end_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_end_day)
topFrame_end_day_entered.grid(column=5, row=0, sticky='w', padx=5, pady=5)
topFrame_end_day_entered.insert(0, "2020.12.31")

topFrame_button_1 = ttk.Button(topFrame, text="OK", command=_check_search)
topFrame_button_1.grid(column=6, row=0, sticky='w', padx=5, pady=5)

tab_Control = ttk.Notebook(Main_win)
tab1 = ttk.Frame(tab_Control)
tab_Control.add(tab1, text=" 주식 차트 ")
tab_Control.pack(expand=1, fill='both')

tab1_canvas = tk.Canvas(tab1, relief='solid', bg='white', width='800', height='400')
tab1_canvas.grid(column=0, row=0, sticky='w', padx=17, pady=30)

menu_bar = Menu(Main_win)
Main_win.config(menu=menu_bar)

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Save")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label='File', menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_quit)
menu_bar.add_cascade(label='Help', menu=help_menu)

Main_win.mainloop()



[결과]





종목명의 Text Box에 차트를 그리고 싶은 종목명을 넣으면 그 회사의 주식 데이터를 불러오도록 하자.

야후 파이낸스에서 주가 데이터를 얻기 위해서는 종목코드를 알아야 한다.

회사명을 입력하면 종목코드를 찾을 수 있게 만들자.

한국거래소에서 상장된 주식 리스트를 얻을 수 있다. 리스트에서 종목 코드를 얻을 수 있다.


종목 코드를 얻고 야후 파이낸스로부터 입력된 시작일에서 종료일까지 데이터를 불러오자.


GUI를 실행하고 종목명에 삼성전자를 넣고 OK 버튼을 누르면 다음과 같은 결과가 나온다.





 

[이전]



def RSI(data):
    theta = 14 #RSI 주기
    delta = data['Close'].diff(1) # 다음 값과의 차이
    delta = delta.dropna() # NaN 값 제거

    Up = delta.copy() # 결과 복사
    Down = delta.copy() # 결과 복사

    Up[Up < 0] = 0 # RS 값 구하기 위한 0 보다 큰 값만 정렬
    Down[Down > 0] = 0 # RS 값 구하기 위한 0 보다 작은 값만 정렬

    data['Up'] = Up # DataFrame에 추가
    data['Down'] = Down # DataFrame에 추가

    AU = data['Up'].rolling(window=theta).mean() # 0 보다 큰 값들의 14일 평균 값
    AD = abs(data['Down'].rolling(window=theta).mean()) # 0 보다 작은 값들의 14일 평균 값

    RS = AU / AD

    RSI = 100.0 - (100.0 / (1.0 + RS))

    data['AU'] = AU # DataFrame에 추가
    data['AD'] = AD # DataFrame에 추가
    data['RS'] = RS # DataFrame에 추가
    data['RSI'] = RSI # DataFrame에 추가

    return data # RSI Function 결과 값 리턴

df = RSI(df)

df.to_csv('stock.csv') # DataFrame을 csv 파일로 저장


[결과]

 

                      High         Low         Open      ...          AD        RS        RSI
Date                                                              ...                                 
2010-01-04  16180.0  16000.0  16060.0  ...         NaN       NaN        NaN
2010-01-05  16580.0  16300.0  16520.0  ...         NaN       NaN        NaN
2010-01-06  16820.0  16520.0  16580.0  ...         NaN       NaN        NaN
2010-01-07  16820.0  16260.0  16820.0  ...         NaN       NaN        NaN
2010-01-08  16420.0  16120.0  16400.0  ...         NaN       NaN        NaN
...                        ...               ...            ...      ...           ...           ...           ...
2020-12-23  74000.0  72300.0  72400.0  ...  264.285714  2.135135  68.103448
2020-12-24  78800.0  74000.0  74100.0  ...  264.285714  2.702703  72.992701
2020-12-28  80100.0  78200.0  79000.0  ...  264.285714  2.567568  71.969697
2020-12-29  78900.0  77300.0  78800.0  ...  207.142857  3.275862  76.612903
2020-12-30  81300.0  77300.0  77400.0  ...  207.142857  3.448276  77.519380

[2708 rows x 12 columns]

 

 


import pandas as pd
import pandas_datareader.data as readData

stock_code = '005930.KS' # 삼성전자주식번호
start_day = '20100101' # 불러올 주식 데이터 시작일
end_day = '20201231' # 불러올 주식 데이터 마지막일
df = pd.DataFrame(readData.DataReader(stock_code, "yahoo", pd.to_datetime(start_day), pd.to_datetime(end_day))) # pandas_datareader 사용한 yahoo에서 주식데이터 로드

print(df)


 

[결과] 

 

                    High        Low          Open       Close       Volume          Adj Close
Date                                                                    
2010-01-04  16180.0  16000.0  16060.0  16180.0  11950800.0  13076.119141
2010-01-05  16580.0  16300.0  16520.0  16440.0  27925850.0  13286.241211
2010-01-06  16820.0  16520.0  16580.0  16820.0  22948850.0  13593.344727
2010-01-07  16820.0  16260.0  16820.0  16260.0  22107950.0  13140.774414
2010-01-08  16420.0  16120.0  16400.0  16420.0  14777550.0  13270.078125
...             ...      ...      ...      ...         ...           ...
2020-12-23  74000.0  72300.0  72400.0  73900.0  19411326.0  71450.585938
2020-12-24  78800.0  74000.0  74100.0  77800.0  32502870.0  75221.320312
2020-12-28  80100.0  78200.0  79000.0  78700.0  40085044.0  76091.492188
2020-12-29  78900.0  77300.0  78800.0  78300.0  30339449.0  77609.992188
2020-12-30  81300.0  77300.0  77400.0  81000.0  29417421.0  80286.203125

[2708 rows x 6 columns]

 

 

 

 

 



가장 먼저 할 일은 주식 데이터를 갖고 왔습니다. 파이썬에서 주식 데이터를 갖고 오는 방법인 pandas-datareader 를 활용하여 Yahoo에서 제공하는 주식 데이터를 불러왔습니다.

 

 

다음과 같은 데이터가 저장되었습니다.

 

 

 

 

 

+ Recent posts