«
in 정보수집  / #yahoo #finance #python #pandas #주가  

야후 파이낸스 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]