야후 파이낸스 API를 이용하여 주가정보 수집하기
주식정보 중 가장 기초적인 정보라고 할 수 있는 것이 주가정보이다. 현재 국내에서는 증권사에서 제공하고 있는 Open API를 이용하여 수집할 수 있으나, 증권사에 계좌 개설이 필요하고 각각의 API에 맞는 프로그램을 작성해야 하는 문제가 있어 아주 쉽지는 않다. 야후 파이낸스(http://finance.yahoo.com)에서는 별도 계좌개설이나 프로그램 설치 없이 다운로드 할 수 있는 API를 제공하고 있고, 파이썬에서 활용할 수 있는 API가 공개되어 있어 이용하기 가장 편리한 축에 든다. 데이터가 사전 형태로 제공되기 때문에 pandas DataFrame형태로 변환하기 편리하다.
야후에서 제공하는 데이터에는 한국 상장기업 데이터도 포함되어 있다. 한국 상장회사 데이터를 받을 때는 꼭 주식코드 뒤에 ‘.KS’를 붙여야 다운로드할 수 있는 점만 주의하면 어려운 점은 없다.
데이터를 받아 보니 회사 이름, 배당 정보, EPS 등을 제공하지 않아 본격적으로 활용하기에는 무리가 있으나, 간편하게 사용하기에는 충분한 정도라고 생각된다.
Yahoo Finance API 설치
pip를 이용해 쉽게 설치할 수 있다.
$ pip install yahoo-finance
Yahoo Finance API 사용하기
pip로 설치한 후 아래와 같이 import 한다
>>> from yahoo_finance import Share
예시로 삼성전자 주가정보를 다운받아 보려고 한다. 주식코드 뒤에 ‘.KS’를 꼭 붙여주여야 한다. get_info 메소드로 기본정보를 얻을 수 있다. 야후에서 제공하는 데이터에 문제가 있어 회사 이름이 출력되지 않는다.
>>> samsung = Share('005930.KS') # 객체 초기화
>>> samsung.get_info() #삼성전자 기본정보
{'CompanyName': None,
'end': '2016-07-10',
'start': '2000-01-04',
'symbol': '005930.KS'}
시계열 주가정보를 다운받기 위해서는 get_historical 메소드를 사용하여 자료를 다운로드한다.
>>> samsung.get_historical('2016-07-04','2016-07-08')
[{'Adj_Close': '1460000.00',
'Close': '1460000.00',
'Date': '2016-07-08',
'High': '1475000.00',
'Low': '1449000.00',
'Open': '1450000.00',
'Symbol': '005930.KS',
'Volume': '269900'},
...
{'Adj_Close': '1466000.00',
'Close': '1466000.00',
'Date': '2016-07-04',
'High': '1474000.00',
'Low': '1451000.00',
'Open': '1464000.00',
'Symbol': '005930.KS',
'Volume': '159900'}]
데이터가 사전의 리스트로 제공되기 때문에 pandas DataFrame형태로 변환하기 쉽다. 먼저 pandas, DataFrame, Series를 import한다.
>>> import pandas as pd
>>> from pandas import DataFrame, Series
주가정보를 DataFrame형태로 변환하여 출력한다.
>>> df = DataFrame(samsung.get_historical('2016-07-04','2016-07-08'))
>>> df
Adj_Close Close Date High Low Open \
0 1460000.00 1460000.00 2016-07-08 1475000.00 1449000.00 1450000.00
1 1450000.00 1450000.00 2016-07-07 1450000.00 1416000.00 1421000.00
2 1421000.00 1421000.00 2016-07-06 1452000.00 1412000.00 1447000.00
3 1469000.00 1469000.00 2016-07-05 1475000.00 1462000.00 1466000.00
4 1466000.00 1466000.00 2016-07-04 1474000.00 1451000.00 1464000.00
Symbol Volume
0 005930.KS 269900
1 005930.KS 229900
2 005930.KS 334900
3 005930.KS 157400
4 005930.KS 159900
시계열 데이터로 사용하기 쉽게 데이터를 변형한다.
>>> df = df.drop('Symbol', axis=1) # 주식코드 삭제
>>> df.Date = pd.to_datetime(df.Date) # 날짜 문자열을 날짜 데이터 타입으로 변경
>>> df = df.set_index('Date') # 인덱스를 Date로 설정
>>> df = df[['Open', 'High', 'Low', 'Close', 'Adj_Close']] # 열 순서 정렬
>>> df
Open High Low Close Adj_Close
Date
2016-07-08 1450000.00 1475000.00 1449000.00 1460000.00 1460000.00
2016-07-07 1421000.00 1450000.00 1416000.00 1450000.00 1450000.00
2016-07-06 1447000.00 1452000.00 1412000.00 1421000.00 1421000.00
2016-07-05 1466000.00 1475000.00 1462000.00 1469000.00 1469000.00
2016-07-04 1464000.00 1474000.00 1451000.00 1466000.00 1466000.00
더 쉬운 방법
pandas-datareader를 설치하면 지금까지 과정을 한방에 할 수 있다.
$ pip install pandas-datareader
이제 데이터 데려오기만 하면 된다. pip로 설치할 때는 pandas-datareader, import할 때는 pandas_datareader임에 주의;;
>>> from pandas_datareader import data
>>> data.DataReader('005930.KS','yahoo','2016-07-04','2016-07-08')
Open High Low Close Volume Adj Close
Date
2016-07-04 1464000.0 1474000.0 1451000.0 1466000.0 159900 1466000.0
2016-07-05 1466000.0 1475000.0 1462000.0 1469000.0 157400 1469000.0
2016-07-06 1447000.0 1452000.0 1412000.0 1421000.0 334900 1421000.0
2016-07-07 1421000.0 1450000.0 1416000.0 1450000.0 229900 1450000.0
2016-07-08 1450000.0 1475000.0 1449000.0 1460000.0 269900 1460000.0
ohlc(시고저종) 데이터를 수정주가에 맞게 출력도 가능하다
>>> data.YahooDailyReader('005930.KS', '2010-07-04','2016-07-08', adjust_price=True).read()
ohlc 데이터가 수정주가에 맞춰서 조정되고, Adj_Close 대신 Adj_Ratio로 조정계수를 바로 받을 수 있다.
Open High Low Close Volume Adj_Ratio
Date
2010-07-05 719991.540 726596.967 718104.275 723766.07 199900 0.944
2010-07-06 719047.908 731315.130 712442.481 731315.13 357500 0.944
2010-07-07 736033.287 736976.919 721878.800 725653.33 323600 0.944
2010-07-08 738864.189 739807.822 726596.968 731315.13 295000 0.944
2010-07-09 735089.659 751131.410 729427.864 751131.41 372100 0.944
... ... ... ... ... ... ...
2016-07-04 1464000.000 1474000.000 1451000.000 1466000.00 159900 1.000
2016-07-05 1466000.000 1475000.000 1462000.000 1469000.00 157400 1.000
2016-07-06 1447000.000 1452000.000 1412000.000 1421000.00 334900 1.000
2016-07-07 1421000.000 1450000.000 1416000.000 1450000.00 229900 1.000
2016-07-08 1450000.000 1475000.000 1449000.000 1460000.00 269900 1.000
[1556 rows x 6 columns]