python으로 주식이나 지수 데이터를 불러오는 다양한 방법이 있습니다. 그중 Yahoo Finance의 정보를 제공해 주는 pythion 오픈 소스가 있습니다. 바로
yfinance
입니다.
yfinance tool 을 사용하기 위하여 python 코드에 우선
import yfinance as yf
import를 해줍니다.
자 그럼, 삼성전자(005930.KS) 주가를 yfinance로 불러오는 방법을 알아보겠습니다.
1. 삼성전자 ticker 찾기
yahoo finance 홈페이지에서 지수나 종목의 ticker를 찾을 수 있습니다. 검색을 해보면
영어로 검색해야 하는 부담이 있으나, 종목 코드를 알고 있으면 찾기 더 쉽습니다. 어쨌든 삼성전자의 종목 코드는
005930.KS
입니다.
2. history 함수나 download 함수를 이용하여 정보 가져오기
□ yfinance.history 사용
name = '005930.KS'
ticker = yf.Ticker(name)
df = ticker.history(interval='1d', period='5y', auto_adjust=False)
○ yfinance.Ticker 함수를 이용하여 삼성전자(005930.KS)의 ticker 를 생성합니다.
○ history 함수를 사용하여 data 를 불러옵니다. (예시: 1 day 즉 일봉 정보, 5년간, 수정주가 아닌 데이터)
○ python에서 지원하는 dataframe 이라는 형식의 결과를 얻습니다.
○ yfinance 의 base.py 안에 있는 history 함수를 열어보면 다음과 같습니다. 중요한 parameter들을 살펴보면
parameters | 내용 |
period | 조회 기간, 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y,1 0y, ytd, max, 오늘부터 과거까지의 기간, 생략하면 max 값이 default |
interval | 일/주/월/분기 봉 등과 1분/2분/5분/15분/30분/60분/90분 봉, 생략하면 '1d'가 default |
start | 조회 시작일을 지정할 때, 'YYYY-MM-DD' 형식 또는 datetime 형식 |
end | 조회 종료일을 지정할 때, 'YYYY-MM-DD' 형식 또는 datetime 형식 |
auto_adjust | 수정 주가를 얻고 싶을 때, default 는 True, 즉 수정주가를 조회하여 줌 |
def history(self, period="1mo", interval="1d",
start=None, end=None, prepost=False, actions=True,
auto_adjust=True, back_adjust=False,
proxy=None, rounding=False, tz=None, timeout=None, **kwargs):
"""
:Parameters:
period : str
Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
Either Use period parameter or use start and end
interval : str
Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
Intraday data cannot extend last 60 days
start: str
Download start date string (YYYY-MM-DD) or _datetime.
Default is 1900-01-01
end: str
Download end date string (YYYY-MM-DD) or _datetime.
Default is now
prepost : bool
Include Pre and Post market data in results?
Default is False
auto_adjust: bool
Adjust all OHLC automatically? Default is True
back_adjust: bool
Back-adjusted data to mimic true historical prices
proxy: str
Optional. Proxy server URL scheme. Default is None
rounding: bool
Round values to 2 decimal places?
Optional. Default is False = precision suggested by Yahoo!
tz: str
Optional timezone locale for dates.
(default data is returned as non-localized dates)
timeout: None or float
If not None stops waiting for a response after given number of
seconds. (Can also be a fraction of a second e.g. 0.01)
Default is None.
**kwargs: dict
debug: bool
Optional. If passed as False, will suppress
error message printing to console.
"""
반환되는 결과는 Dataframe으로서 다음과 같습니다.
- index : Date
- column
Open | High | Low | Close | Adj Close | Volume | Dividends | Stock Splits |
시가 | 고가 | 저가 | 종가 | 수정 주가 | 거래량 | 배당금액 | 주식분할 |
: 소위 시고저종 이라고 불리는 가격과 액면분할, 권리락 등을 반영한 수정주가, 또 거래량, 배당금, 주식분할을 column으로 합니다.
- 만일 auto_adjust = True 라 하면 수정주가를 반환합니다. 따라서 위의 표에서 Adj Close를 제외한 결과를 보여줍니다.
□ yfinance.download사용
name = '005930.KS'
df = yf.download(name, period='5y')
○ history 함수와 다른 점은 ticker를 파라미터로 받는다는 것입니다.
○ interval은 생략하면 '1d'가 default입니다.
○ yfinance의 multi.py 안에 함수 설명이 있습니다.
def download(tickers, start=None, end=None, actions=False, threads=True,
group_by='column', auto_adjust=False, back_adjust=False,
progress=True, period="max", show_errors=True, interval="1d", prepost=False,
proxy=None, rounding=False, timeout=None, **kwargs):
"""Download yahoo tickers
:Parameters:
tickers : str, list
List of tickers to download
period : str
Valid periods: 1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max
Either Use period parameter or use start and end
interval : str
Valid intervals: 1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo
Intraday data cannot extend last 60 days
start: str
Download start date string (YYYY-MM-DD) or _datetime.
Default is 1900-01-01
end: str
Download end date string (YYYY-MM-DD) or _datetime.
Default is now
group_by : str
Group by 'ticker' or 'column' (default)
prepost : bool
Include Pre and Post market data in results?
Default is False
auto_adjust: bool
Adjust all OHLC automatically? Default is False
actions: bool
Download dividend + stock splits data. Default is False
threads: bool / int
How many threads to use for mass downloading. Default is True
proxy: str
Optional. Proxy server URL scheme. Default is None
rounding: bool
Optional. Round values to 2 decimal places?
show_errors: bool
Optional. Doesn't print errors if True
timeout: None or float
If not None stops waiting for a response after given number of
seconds. (Can also be a fraction of a second e.g. 0.01)
"""
반환되는 결과는 Dataframe으로서 다음과 같습니다.
- index : Date
- column
Open | High | Low | Close | Adj Close | Volume |
시가 | 고가 | 저가 | 종가 | 수정 주가 | 거래량 |
: 소위 시고저종 이라고 불리는 가격과 액면분할, 권리락 등을 반영한 수정주가, 또 거래량을 column으로 합니다.
예제
yfinance의 download로 조회하는 예제입니다.
if __name__ == '__main__':
# pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 500)
# pd.set_option('display.colheader_justify', 'center')
# pd.set_option('display.precision', 0)
# name = 'SPY'
name = '005930.KS'
ticker = yf.Ticker(name)
# df = ticker.history(interval='1d', period='5y')
# print(df)
df1 = yf.download(name, period='5y')
print('Result of yf.download(name, period=5y)')
print(df1)
print('\n')
df2 = yf.download(name, interval='1h', period='1d')
print('Result of yf.download(name, interval=1h, period=1d)')
print(df2)
print('\n')
raw_datas = 100
t_end = datetime.today()
t_start = t_end - timedelta(days=raw_datas)
df3 = yf.download(name, start= t_start, end= t_end)
print('Result of yf.download(name, start= t_start, end= t_end)')
print(df3)
print('\n')
df4 = yf.download(name, start='2022-01-01', end='2022-06-30')
print('Result of yf.download(name, start=2022-01-01, end=2022-06-30)')
print(df4)
print('\n')
구체적으로 보면,
import yfinance as yf
from datetime import datetime, timedelta
import pandas as pd
○ yfinance를 import 합니다.
○ 오늘 날짜, 날짜 사이의 차이 등 날짜에 관련된 계산을 위해 datetime을 import 합니다.
○ dataframe을 다루기 위해 pandas를 pd라는 이름으로 import 합니다.
# pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
○ 일반적으로 dataframe을 print 함수로 출력을 하게 되면 열과 행을 줄임표를 사용하여 간략하게 보여줍니다. 만일 모든 열의 데이터를 보고 싶을 때는 pandas안의 set_option에 모든 열을 보여주는 display.max_columns를 선택해 주면 됩니다.
○ 만일 모든 행의 데이터를 보고 싶으면 주석 처리되어 있는 display.max_rows를 선택해 주면 됩니다.
name = '005930.KS'
df1 = yf.download(name, period='5y')
print('Result of yf.download(name, period=5y)')
print(df1)
print('\n')
○ start , end 가 지정되어 있지 않으므로 가장 최근일(오늘 포함)부터 5 year 기간 동안 조회합니다.
df2 = yf.download(name, interval='1h', period='1d')
print('Result of yf.download(name, interval=1h, period=1d)')
print(df2)
print('\n')
○ 1h봉, 즉 1시간 봉을 1일(1d) 기간을 조회하여 출력합니다. 오늘로부터 1d 기간이니 오늘 하루 동안의 1시간 봉이겠네요.
raw_datas = 100
t_end = datetime.today()
t_start = t_end - timedelta(days=raw_datas)
df3 = yf.download(name, start= t_start, end= t_end)
print(df3)
○ 조회일자를 특정한 예제입니다. 오늘과 오늘로부터 raw_dates =100일 사이의 기간 동안 주가를 조회하고 싶습니다.
○ datetime.today()를 하면 오늘 날짜를 datetime 형식으로 반환합니다.
○ 며칠 전의 날짜를 계산하기 위해 datetime 안의 timedelta를 사용해 줍니다.
df4 = yf.download(name, start='2022-01-01', end='2022-06-30')
print('yf.download(name, start=2022-01-01, end=2022-06-30)')
print(df4)
print('\n')
○ 조회 기간의 날짜를 특정일자로 지정합니다.
결과는 아래와 같습니다.
[*********************100%***********************] 1 of 1 completed
Result of yf.download(name, period=5y)
Open High Low Close Adj Close Volume
Date
2017-07-07 47740.0 48120.0 47620.0 47860.0 41580.144531 8131900
2017-07-10 48500.0 48900.0 48320.0 48660.0 42275.179688 10792750
2017-07-11 48640.0 49000.0 48280.0 49000.0 42570.566406 9717800
2017-07-12 49000.0 50000.0 48840.0 49880.0 43335.097656 9486150
2017-07-13 50080.0 50940.0 50040.0 50560.0 43925.867188 16034150
... ... ... ... ... ... ...
2022-07-01 56900.0 57500.0 55900.0 56200.0 56200.000000 24982097
2022-07-04 56100.0 57400.0 55700.0 57100.0 57100.000000 17807126
2022-07-05 57600.0 58200.0 57200.0 57200.0 57200.000000 14216539
2022-07-06 57300.0 57300.0 56400.0 56400.0 56400.000000 16820461
2022-07-07 56400.0 58700.0 56300.0 58200.0 58200.000000 21034193
[1225 rows x 6 columns]
[*********************100%***********************] 1 of 1 completed
Result of yf.download(name, interval=1h, period=1d)
Open High Low Close Adj Close Volume
2022-07-07 09:00:00+09:00 56400.0 58200.0 56300.0 57800.0 57800.0 0
2022-07-07 10:00:00+09:00 57900.0 58000.0 57400.0 57700.0 57700.0 2402583
2022-07-07 11:00:00+09:00 57700.0 58200.0 57600.0 58100.0 58100.0 2004404
2022-07-07 12:00:00+09:00 58100.0 58200.0 58000.0 58200.0 58200.0 1233166
2022-07-07 13:00:00+09:00 58200.0 58500.0 58000.0 58500.0 58500.0 2838654
2022-07-07 14:00:00+09:00 58400.0 58700.0 58300.0 58300.0 58300.0 2554807
2022-07-07 15:00:00+09:00 58200.0 58200.0 58200.0 58200.0 58200.0 0
[*********************100%***********************] 1 of 1 completed
Result of yf.download(name, start= t_start, end= t_end)
Open High Low Close Adj Close Volume
Date
2022-03-29 70000.0 70300.0 69800.0 70200.0 69839.0 13686208
2022-03-30 70300.0 70500.0 69800.0 69900.0 69900.0 12670187
2022-03-31 69900.0 70200.0 69600.0 69600.0 69600.0 12510366
2022-04-01 69500.0 69500.0 69000.0 69100.0 69100.0 15916846
2022-04-04 68900.0 69300.0 68600.0 69300.0 69300.0 11107905
... ... ... ... ... ... ...
2022-07-01 56900.0 57500.0 55900.0 56200.0 56200.0 24982097
2022-07-04 56100.0 57400.0 55700.0 57100.0 57100.0 17807126
2022-07-05 57600.0 58200.0 57200.0 57200.0 57200.0 14216539
2022-07-06 57300.0 57300.0 56400.0 56400.0 56400.0 16820461
2022-07-07 56400.0 58700.0 56300.0 58200.0 58200.0 21034193
[69 rows x 6 columns]
[*********************100%***********************] 1 of 1 completed
Result of yf.download(name, start=2022-01-01, end=2022-06-30)
Open High Low Close Adj Close Volume
Date
2022-01-04 78800.0 79200.0 78300.0 78700.0 78295.289062 12427416
2022-01-05 78800.0 79000.0 76400.0 77400.0 77001.976562 25470640
2022-01-06 76700.0 77600.0 76600.0 76900.0 76504.546875 12931954
2022-01-07 78100.0 78400.0 77400.0 78300.0 77897.343750 15163757
2022-01-10 78100.0 78100.0 77100.0 78000.0 77598.890625 9947422
... ... ... ... ... ... ...
2022-06-23 57700.0 58000.0 56800.0 57400.0 57400.000000 28338608
2022-06-24 57900.0 59100.0 57700.0 58400.0 58400.000000 23256103
2022-06-27 59000.0 59900.0 58300.0 58800.0 58800.000000 18122236
2022-06-28 59200.0 59500.0 58700.0 59400.0 59400.000000 13540538
2022-06-29 58500.0 58800.0 58000.0 58000.0 58000.000000 14677138
[118 rows x 6 columns]
Process finished with exit code 0
○ 결과 모두 Date를 index로 하고 column이 Open, High, Low, Close, Adj Close, Volume을 column으로 하는 주가 데이터를 잘 출력했습니다.
시고저종 데이터를 얻을 수 있으니, 이제 차트도 한번 그려봐야겠죠. 차트는 다음 글에서 그려보도록 하겠습니다.
'주식분석 > Quant 분석(프로그래밍)' 카테고리의 다른 글
기술적 지표 #1. AB Ratio (0) | 2023.03.08 |
---|---|
지지선과 저항선 (0) | 2023.03.05 |
주식 데이터 불러오기 : FinanceDataReader 라이브러리 (0) | 2023.03.02 |
주식 차트 그리기 #2: candlestick_ohlc 시고저종 봉차트 (0) | 2022.07.16 |
주식 차트 그리기 #1 : mplfinance (0) | 2022.07.08 |
댓글