Browsing Stock Data
주가 데이터 열람
- 파이썬 코드상에서 주가 데이터를 불러오고 열람하는 방법을 다룬다.
Downloading Stock Price Data (주가 데이터 다운로드)
Yahoo Finance (URL)
- Pandas에서는 야후 파이낸스에서 주가 데이터를 다운로드하는 기능을 제공하고 있다.
- 세계 증권 시장 Suffix (URL)
Example. Downloading Stock Price Data from Yahoo Finance using \(\texttt{Pandas}\)
# stock_data.py
import pandas as pd
import pandas_datareader.data as web
import datetime
def download_stock_data(file_name, company_code, year1, month1, date1, year2, month2, date2):
'''
Arguments:
file_name 다운로드한 주가 데이터를 저장할 파일 이름
company_code 종목코드
year1/month1/date1 데이터를 다운로드할 시작일자
year2/month2/date2 데이터를 다운로드할 마감일자
'''
start = datetime.datetime(year1, month1, date1)
end = datetime.datetime(year2, month2, date2)
df = web.DataReader("%s.KS" % (company_code), "yahoo", start, end)
df.to_pickle(file_name)
return df
def load_stock_data(file_name):
df = pd.read_pickle(file_name)
return df
# Stock Data를 파일로 저장하고 열람
download_stock_data('samsung.data', '005930', 2020,1,1,2020,2,28)
df = load_stock_data('samsung.data')
print(df.describe()) # pandas에서 제공하는 describe() 함수
- 2020년 1월 1일부터 2020년 2월 28일까지의 삼성전자(005930) 주식의 통계를 다운로드 받고 출력한다.
- 또한, 삼성전가의 주가에 대한 Histogram, Bin, Frequency 데이터도 출력한다.
* Statistics Overview (통계학 개요) (URL)
Execution:
High Low Open Close Volume Adj Close
count 40.000000 40.000000 40.000000 40.000000 4.000000e+01 40.000000
mean 59575.000000 58262.500000 58880.000000 58950.000000 1.699747e+07 55858.975391
std 2062.951582 2127.920316 2189.157431 2174.915265 5.190990e+06 2060.874548
min 55500.000000 54200.000000 54900.000000 54200.000000 8.740596e+06 51358.039062
25% 58075.000000 56350.000000 56900.000000 57100.000000 1.307865e+07 54105.978516
50% 59800.000000 58900.000000 59300.000000 59500.000000 1.571121e+07 56380.136719
75% 61125.000000 59700.000000 60550.000000 60550.000000 2.106650e+07 57375.081055
max 62800.000000 61700.000000 62000.000000 62400.000000 3.005423e+07 59128.074219
Column | Meaning | Row | Meaning |
High | - 고가 | count | - 데이터 개수 |
Low | - 저가 | mean | - 산술평균값 |
Open | - 시가 | std | - 표준편차 |
Close | - 종가 | min | - 최솟값 |
Volume | - 거래량 | 25% | - Quantile (사분위수) - Q1값 (하위 25%) |
Adj Close | - 분할·배당·배분 등을 고려해 조정한 종가 |
50% | - Quantile (사분위수) - Q2값 (하위 50%) |
75% | - Quantile (사분위수) - Q3값 (하위 75%) |
||
max | - 최댓값 |
Browsing by Histogram (히스토그램 표현)
# browsing_by_histogram.py
# Stock Data에 대한 Histogram, Bin, Frequency 정보를 열람
import stock_data as sd
import matplotlib.pyplot as plt
df = sd.load_stock_data('samsung.data')
(n, bins, patched) = plt.hist(df['Open'])
plt.axvline(df['Open'].mean(), color='red')
plt.show()
for index in range(len(n)):
print("Bin : %0.f, Frequency = %0.f" % (bins[index], n[index]))
Execution:
Bin : 54900, Frequency = 4
Bin : 55610, Frequency = 6
Bin : 56320, Frequency = 0
Bin : 57030, Frequency = 2
Bin : 57740, Frequency = 2
Bin : 58450, Frequency = 5
Bin : 59160, Frequency = 6
Bin : 59870, Frequency = 5
Bin : 60580, Frequency = 5
Bin : 61290, Frequency = 5
Browsing by Scatter Plot (산점도 표현)
# browsing_by_scatter_plot.py
# Stock Data에 대한 산점도를 열람
import stock_data as sd
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
df = sd.load_stock_data('samsung.data')
scatter_matrix(df[['Open', 'High', 'Low', 'Close']], alpha=0.2, figsize=(6, 6), diagonal='kde')
df[['Open','High','Low','Close','Adj Close']].plot(kind='box')
plt.show()
Execution:
Browsing by Autocorrelation Graph (자기상관 그래프 표현)
# browsing_by_autocorrelation_graph.py
import pandas as pd
import stock_data as sd
from pandas.tools.plotting import scatter_matrix.autocorrelation_plot
df_samsung = sd.load_stock_data('samsung.data')
df_hanmi = sd.load_stock_data('hanmi.data')
# draw autocorrelation graph
fig, axs = plt.subplots(2, 1)
df_samsung['Close'].plot(ax=axs[0])
autocorrelation_plot(df_samsung['Close'], ax=axs[1])
plt.show()
Browsing by Autocorrelation Plot (상관도표 표현)
# browsing_by_autocorrelation_plot.py
# Stock Data에 대한 상관도표를 열람
import stock_data as sd
def get_autocorrelation_dataframe(series):
def r(h):
return ((data[:n - h] - mean) * (data[h:] - mean)).sum() / float(n) / c0
n = len(series)
data = np.asarray(series)
mean = np.mean(data)
c0 = np.sum((data - mean) ** 2) / float(n)
x = np.arange(n) + 1
y = lmap(r, x)
df = pd.DataFrame(y, index=x)
return df
df_samsung = sd.load_stock_data('samsung.data')
df_samsung_corr = get_autocorrelation_dataframe(df_samsung['Close'])
fig, axs = plt.subplots(2, 1)
axs[1].xaxis.set_visible(False)
df_samsung['Close'].plot(ax=axs[0])
df_samsung_corr[0].plot(kind='bar', ax=axs[1])
plt.show()
Execution:
Calculation of Statistics (통계량 계산)
# get_statistics.py
import stock_data as sd
from pandas.tools.plotting import scatter_matrix.autocorrelation_plot
df_samsung = sd.load_stock_data('samsung.data')
df_hanmi = sd.load_stock_data('hanmi.data')
# print covariance
print(df_samsung['Close'].cov(df_hanmi['Close'])
# print correlation
print(df_samsung['Close'].corr(df_hanmi['Close'])
# draw autocorrelation graph
fig, axs = plt.subplots(2, 1)
df_samsung['Close'].plot(ax=axs[0])
autocorrelation_plot(df_samsung['Close'], ax=axs[1])
plt.show()
Reference: 머신러닝을 이용한 알고리즘 트레이딩 시스템 개발
(안명호, 류미현 저, 한빛미디어, 2016)