HAN's BLOG

파이썬을 이용한 미국주식의 가격, 시세, 종가등을 얻기

Stock’s price

이번 포스트에서 파이썬 (Python) API를 이용해서 미국의 단위주식의 가격을 소개할 예정입니다.

주로 사용하는 API로는 두가지가 있습니다.

  • pandas_datareader API

대표적으로 널리 사용되는 API이입니다. 사용법은 구글위에 다양한 정보가 있으니 참고해주시길 바랍니다.

pip install pandas-datareader

  • yahoo_fin API

제가 자주 이용하는 API 입니다. 공식적이 API가 아니라 안정성이 떨어지지만 직접적으로 야후 파이넨셜 사이트에서 정보를 가져오기 떄문에 알기쉽게 데이터를 크롤링 할 수 있습니다.

pip install yahoo_fin

2가지 전부 평가가 좋은 API입니다. 사용에 따라 두가지를 적절히 이용해주시기 바랍니다.

Code to get stock’s price

import pandas as pd
import pandas_datareader as pdr
import yahoo_fin.stock_info as yfs

from tqdm import tqdm
import datetime
import json

def main(url, index_list, index_name, start, end, run_yfs=False, run_pdr=True):

    ## Configuration directory url
    url_data = url+'data_origin/'

    print('Example Apple inc')
    if run_pdr:
        df_aapl = pdr.DataReader('AAPL', 'yahoo', start_day, today)

    if run_yfs:
        start_day.strftime('%m/%d/%y')
        today.strftime('%m/%d/%y')
        df_aapl = yfs.get_data('AAPL',start_date=start_day, end_date = today)
        df_aapl = df_aapl.reset_index()
        df_aapl = df_aapl.rename(columns={'open':'Open', 'index':'Date', 'high':'High','low':'Low','close':'Close','adjclose':'Adj Close','volume':'Volume','ticker':'Ticker'})
        df_aapl = df_aapl[['Ticker','Date','High','Low','Open','Close','Volume','Adj Close']]
    print(df_aapl)

    df_recent = pd.DataFrame({'Recent_price': []})
    etf_values = {}
    error_symbols = []
    for ticker in tqdm(index_list):
        try:
            if run_pdr:
                df = pdr.DataReader(ticker,'yahoo', start_day, today)
            if run_yfs:
                df = yfs.get_data(ticker,start_date=start_day, end_date = today)
                df = df.reset_index()
                df = df.rename(columns={'open':'Open', 'index':'Date', 'high':'High','low':'Low','close':'Close','adjclose':'Adj Close','volume':'Volume','ticker':'Ticker'})
                df = df[['Ticker','Date','High','Low','Open','Close','Volume','Adj Close']]
            df_recent.loc[ticker, 'Recent_price'] = yfs.get_live_price(ticker)
            etf_values[ticker] = df
        except:
            error_symbols.append(ticker)
            print('Error: ', error_symbols)
            df_recent.loc[ticker, 'Recent_price'] = yfs.get_live_price(ticker)

    if run_pdr:
        combined_value = pd.concat(etf_values)
        combined_value = combined_value.reset_index()
        combined_value= combined_value.rename(columns={'level_0': 'Ticker'})
    if run_yfs:
        combined_value = pd.concat(etf_values)
        combined_value = combined_value.reset_index()
        combined_value = combined_value.drop(['level_0','level_1'], axis=1)

    print(combined_value)
    print(df_recent)

    url_value_data = url_data+'FS_{0}_Value'.format(index_name)
    combined_value.to_json(url_value_data+'.json')
    combined_value.to_csv(url_value_data+'.csv')

    url_recent_value_data = url_data+'FS_{0}_Recent_Value'.format(index_name)
    df_recent.to_json(url_recent_value_data+'.json')
    df_recent.to_csv(url_recent_value_data+'.csv')

if __name__ == '__main__':
    with open('../config/config.json', 'r') as f:
        config = json.load(f)
    root_url = config['root_dir']

    filename= input("Choice of stock's list (dow, sp500, nasdaq, other, selected): ")

    dow_list = yfs.tickers_dow()
    if filename == 'dow':
        dow_list = yfs.tickers_dow()
    elif filename == 'sp500':
        dow_list = yfs.tickers_sp500()
    elif filename == 'nasdaq':
        dow_list = yfs.tickers_nasdaq()
    elif filename == 'other':
        dow_list = yfs.tickers_other()
    elif filename == 'selected':
        url = root_url+'/data_ForTrading/selected_ticker.json'
        temp_pd = pd.read_json(url)
        temp_pd = temp_pd['Ticker']
        dow_list = temp_pd.values.tolist()

    print(dow_list)

    ## Define time of start to end ##
    #td_1y = datetime.timedelta(weeks=52/2)
    start_day = datetime.datetime(2010,1,1)
    today = datetime.datetime.now()
    #start_day = today-td_1y

    print('Price of stcok in {0} for date series and recent price'.format(filename))
    main(url=root_url, index_list = dow_list, index_name=filename, start= start_day, end = today, run_yfs = True, run_pdr=False)

else:
    pass

원하는 인덱스(Index)에 대해 yahoo_fin API를 이용하여 각 주식(Ticker)을 리스트로 부릅니다.

각각의 Ticker에 대해 지정하 날로부터 오늘까지의 종가를 포함한 각 시간열에 대해 가격 정보를 얻어옵니다. 또한, 현재 가격만을 따로 데이터프레임으로 저장합니다. 추후 데이터 해석을 위해 미리 뽑아옵니다. Nasdaq과 other의 인덱스는 꽤 시간이 걸리므로 주의 해 주시길 바랍니다.

Result

위 코드를 진행할 경우 밑과 같은 결과가 나타납니다. yahoo_fin API에 의한 원시 데이터는 대표적으로 다우 인덱스 대해 뽑아봤습니다.

     Ticker       Date        High         Low        Open       Close       Volume   Adj Close
0       AAPL 2009-12-31    7.619643    7.520000    7.611786    7.526072  352410800.0    6.471693
1       AAPL 2010-01-04    7.660714    7.585000    7.622500    7.643214  493729600.0    6.572423
2       AAPL 2010-01-05    7.699643    7.616071    7.664286    7.656428  601904800.0    6.583786
3       AAPL 2010-01-06    7.686786    7.526786    7.656428    7.534643  552160000.0    6.479064
4       AAPL 2010-01-07    7.571429    7.466072    7.562500    7.520714  477131200.0    6.467088
...      ...        ...         ...         ...         ...         ...          ...         ...
84407    WMT 2021-06-21  136.750000  135.350006  135.660004  136.399994    6925000.0  136.399994
84408    WMT 2021-06-22  137.720001  136.229996  136.229996  137.029999    6369000.0  137.029999
84409    WMT 2021-06-23  136.990005  135.929993  136.500000  135.960007    6463500.0  135.960007
84410    WMT 2021-06-24  137.240005  136.100006  136.169998  136.910004    7814700.0  136.910004
84411    WMT 2021-06-25  138.860001  136.919998  137.130005  138.529999    9544400.0  138.529999

[84412 rows x 8 columns]
     Recent_price
AAPL    133.110001
AMGN    242.679993
AXP     169.449997
BA      248.380005
CAT     216.309998
CRM     241.869995
CSCO     53.060001
CVX     107.300003
DIS     178.350006
DOW      63.290001
GS      368.769989
HD      313.630005
HON     218.740005
IBM     146.839996
INTC     55.910000
JNJ     164.210007
JPM     154.050003
KO       54.320000
MCD     232.419998
MMM     194.750000
MRK      77.199997
MSFT    265.019989
NKE     154.350006
PG      134.919998
TRV     151.720001
UNH     404.950012
V       237.320007
VZ       56.380001
WBA      52.160000
WMT     138.529999

Conclusion

이렇게 미국 주식의 시간열에 대한 주식 가격(시세, 종가) 및 현재가를 얻어봤습니다.

만약, 실제로 이 코드를 실행하고 싶으시다면, 폴더 Url을 변경해서 사용해주세요.

이 코드는 구글 위에 다양한 사람들에게 도움을 받았습니다. 대단히 감사합니다.

만약 이 포스트가 만족스럽다면 GithubStar 부탁드립니다 :)