파이썬 주식 데이터 다운 및 표시

써보고 느낀점 : 국내 증권사 API 사용이 더 편하고 안정적이다. 

 

1) yfinance (야후파이낸스 API 이용)

pip install yfinance

 

한국 주식, ETF 도 다운 가능

import yfinance as yf

# get ohlcv data for any ticker by period.
data = yf.download("MSFT", period='1mo', interval="5m")

# get ohlcv data for any ticker by start date and end date
data = yf.download("MSFT", start="2017-01-01", end="2020-04-24")

# get intraday data for any ticker by period.
data = yf.download("MSFT", period='1mo', interval="5m")

예시 코드)

import datetime as dt
import yfinance as yf
import pandas as pd

stocks = ["AMZN","MSFT","INTC","GOOG","INFY.NS","3988.HK"]
start = dt.datetime.today()-dt.timedelta(360)
end = dt.datetime.today()
cl_price = pd.DataFrame() # empty dataframe which will be filled with closing prices of each stock
ohlcv_data = {} # empty dictionary which will be filled with ohlcv dataframe for each ticker

# looping over tickers and creating a dataframe with close prices
for ticker in stocks:
    cl_price[ticker] = yf.download(ticker,start,end)["Adj Close"]
    

# looping over tickers and storing OHLCV dataframe in dictionary
for ticker in stocks:
    ohlcv_data[ticker] = yf.download(ticker,start,end)

 

2) yahoofinancials (야후파이낸스 웹스크랩핑)

pip install yahoofinancials

 

1)번의 API의 경우 서포트가 유지보수를 그만두거나 api가 변경되면 못쓰므로, 여러 옵션을 갖춰두는 것이 좋음

안정적이지만 웹스크래핑 기반이므로 속도가 느리다.

 

예시 코드)

import pandas as pd
from yahoofinancials import YahooFinancials
import datetime as dt

all_tickers = ["AAPL","MSFT","CSCO","AMZN","INTC"]

# extracting stock data (historical close price) for the stocks identified
close_prices = pd.DataFrame()
end_date = (dt.date.today()).strftime('%Y-%m-%d')
beg_date = (dt.date.today()-dt.timedelta(1825)).strftime('%Y-%m-%d')
for ticker in all_tickers:
    yahoo_financials = YahooFinancials(ticker)
    json_obj = yahoo_financials.get_historical_price_data(beg_date,end_date,"daily")
    ohlv = json_obj[ticker]['prices']
    temp = pd.DataFrame(ohlv)[["formatted_date","adjclose"]]
    temp.set_index("formatted_date",inplace=True)
    temp.dropna(inplace=True)
    close_prices[ticker] = temp["adjclose"]
    
    
# extracting stock data (ohlcv) for the stocks identified
ohlv_dict = {}
end_date = (dt.date.today()).strftime('%Y-%m-%d')
beg_date = (dt.date.today()-dt.timedelta(1825)).strftime('%Y-%m-%d')
for ticker in all_tickers:
    yahoo_financials = YahooFinancials(ticker)
    json_obj = yahoo_financials.get_historical_price_data(beg_date,end_date,"daily")
    ohlv = json_obj[ticker]['prices']
    temp = pd.DataFrame(ohlv)[["formatted_date","adjclose","open","low","high","volume"]]
    temp.set_index("formatted_date",inplace=True)
    temp.dropna(inplace=True)
    ohlv_dict[ticker] = temp

 

 

3) 데이터 살펴보기

 

살펴볼 데이터를 가져온다

import datetime as dt
import yfinance as yf
import pandas as pd

stocks = ["AMZN", "MSFT", "INFY.NS"]

start = dt.datetime.today()-dt.timedelta(360)
end = dt.datetime.today()
cl_price = pd.DataFrame()
ohlcv_data = {}

for ticker in stocks:
    cl_price[ticker] = yf.download(ticker, start, end)["Adj Close"]

for ticker in stocks:
    ohlcv_data[ticker] = yf.download(ticker, start, end)

 

데이터프레임으로 받은 데이터 확인

cl_price.head()

 

여러 종목 데이터가 있는 딕셔너리 확인

ohlcv_data.keys()
ohlcv_data['AMZN'].head()

 

값 확인

cl_price["INFY.NS"].values

 

 

위에 사진에는 안 보이나 곳곳에 NaN이 있음.

NaN 값이 있는 행을 통째로 삭제

cl_price.dropna(axis=0, how='any', inplace=True)
cl_price["INFY.NS"].values

 

 

 

평균, 표준편차 등 기본 통계 확인

cl_price.describe()

print(cl_price.mean())
print(cl_price.median())
print(cl_price.std())

 

일일 수익률 계산

# Return calculation
daily_return = cl_price.pct_change()
daily_return.head()

# 아래 코드도 결과 동일
# daily_return = cl_price/cl_price.shift(1)-1

 

 

수익률 데이터의 산술평균 확인

daily_return.mean(axis=0)
daily_return.mean(axis=1)
daily_return.std()

 

 

10일 이동동평균 계산

daily_return.rolling(window=10).mean()
# daily_return.rolling(window=10).std()
# daily_return.rolling(window=10).max()
# daily_return.rolling(window=10).sum()

 

 

평균 계산할때 적용하는 지수가중함수 -> 기술적 지표 계산할 때 자주 사용됨

Exponentially weighted (EW) calculations.

daily_return.ewm(com=10, min_periods=10).mean()
# daily_return.ewm(com=10, min_periods=10).std()

 

 

4) 데이터 차트로 살펴보기( 간단)

 

cl_price.plot()

 

cl_price.plot(subplots=True, layout = (2,2), title = "Stock Price Evolution", grid =True) # Subplots of the stocks

 

 

daily_return.plot()
(1+daily_return).cumprod().plot(title = "Stock Price Evolution", grid =True)

 

 

matplotlib를 직접 사용하여 그려보자

import matplotlib.pyplot as plt

# Pyplot demo
fig, ax = plt.subplots()
plt.style.available
plt.style.use('ggplot')
ax.set(title="Daily return on tech stocks", xlabel="Tech Stocks", ylabel = "Daily Returns")
plt.bar(daily_return.columns,daily_return.mean(),color=["red","blue","green","orange"])

 

 

 

 

5) 끝

현재는 pykrx 씁니다.

댓글

Designed by JB FACTORY