본문 바로가기
미래걱정/주식

Yahoo finance에서 Python으로 마켓 데이터 가져오기 [파이썬 왕초보의 친절한 의식의흐름] - 1

by JHistory_ 2023. 1. 22.
반응형

 

 

 코딩에 ㅋ자와 퀀트의 ㅋ자도 잘 모르지만, 2022년 하락장을 맞으면서 내가 매크로를 정확하게 분석하여 시장을 예측할 수 없다면, 과거 비슷한 사례에서의 사람들의 패턴을 추종해보는 전략을 취해보자 → 퀀트 라는 강환국 작가의 말에 매료되어 물고기를 잡는 방법부터 하나 둘 씩 학습해보고자한다. 


https://github.com/ranaroussi/yfinance

 

GitHub - ranaroussi/yfinance: Download market data from Yahoo! Finance's API

Download market data from Yahoo! Finance's API. Contribute to ranaroussi/yfinance development by creating an account on GitHub.

github.com

 파이썬의 설치에 대해서는 생략하도록 하고, 내장되어있는 모듈을 다운받아 하나 씩 실습해보는 일지로 블로그를 활용해보고자 한다. 아마 내가 코딩에 대해 전혀 잘 모르는 초보라 이 글을 읽을 때, 다른 전문 글 보다 더 도움이 될 수도 있을 것 이다.


● 왜 Yahoo Finance?

 일단, 삼프로나 대외적으로 방송을 통해 비춰지는 많은 애널리스트들도 야후 파이넨스를 전통적으로 이용하는 것을 많이 보았다. 오류가 많이 없기로 정평이 나있는 것으로 알려져있기도 하고, 위와 같은 API가 미리 만들어져있기에 제일 먼저 접근해보았다.

pip install yfinance

 pip는

간단히 말해 파이썬에 내장되어 있는 패키지에 관련된 명령어이다. 거기에 install이란 명령어를 써서 yfinance라는 모듈을 다운받는 행위이다. 근데, 주의할 점이 있다. 

 밑에 Terminal 이라고 되어있는 곳에다가 이 명령어를 쳐야한다. 느낌상 python의 일반적인 설정을 건드는 행위이기 때문에 여기다가 쳐야하는 것 같다. 만약 이 창이 나타나지 않으면, 오른쪽 위 구석의 재생 버튼을 누르면 이 창이 뜬다.

● Ticker Module 

 개별종목을 (혹은 ETF 상품을) 검색하기 위해서 제일 기본적인 Ticker Moudle을 이용해보자. 개인적으로 보유종목인 ASML을 이용해보았다.

import yfinance as yf
asml = yf.Ticker("asml")

asml_info=asml.info
print(asml_info)

 첫번째 줄은 yfinance라는 모듈을 yf라는 함수로 줄여서 사용하겠다 라는 의미가 되는듯 해보이고, 두번째 줄에서의 우변은 yf라고 부르기로한 함수에서 Ticker라는 기능을 사용하겠다 라는 의미정도가 되보인다. 거기서 'asml'을 불러오라는 의미이다. 그때 그것을 우리는 'asml'이라고 하자~! 그것이다.

 

 세번째 줄은 ticker 'asml'에 대한 정보를 asml_info라는 변수에 저장하겠다 라는 뜻이고, 4번째 줄은 asm_info에 해당하는 내용을 나에게 출력하라는 뜻이다. 그러면 아래와 같이 출력값이 terminal창에 나타난다.

{'zip': '5504 DR', 'sector': 'Technology', 'fullTimeEmployees': 34720, 'longBusinessSummary': 'ASML Holding N.V. develops, produces, markets, sells, and services advanced semiconductor equipment systems consisting of lithography, metrology, and inspection related systems for memory and logic chipmakers. The company provides extreme ultraviolet lithography systems; and deep ultraviolet 
lithography systems comprising immersion and dry lithography solutions to manufacture various range of semiconductor nodes and technologies. It also offers metrology and inspection systems, including YieldStar optical metrology solutions to measure the quality of patterns on the wafers; and HMI e-beam solutions to locate and analyze individual chip defects. In addition, the company provides computational lithography and software solutions to create applications that enhance the setup of the lithography system; and mature products and services that refurbish used lithography equipment and offers associated services. It operates in Japan, South Korea, Singapore, Taiwan, China, the Netherlands, Europe, the United States, and rest of Asia. The company was formerly known as ASM Lithography Holding N.V. and changed its name to ASML Holding N.V. in 2001. ASML Holding 
N.V. was founded in 1984 and is headquartered in Veldhoven, the Netherlands.', 'city': 'Veldhoven', 'phone': '31 480 235 0934', 'country': 'Netherlands', 'companyOfficers': [], 'website': 'https://www.asml.com', 'maxAge': 1, 'address1': 'De Run 6501', 'industry': 'Semiconductor Equipment & 
Materials', 'ebitdaMargins': 0.33986, 'profitMargins': 0.28289, 'grossMargins': 0.51142, 'operatingCashflow': 9553300480, 'revenueGrowth': 0.102, 'operatingMargins': 0.31396, 'ebitda': 6705099776, 'targetLowPrice': 472, 'recommendationKey': 'buy', 'grossProfits': 9809000000, 'freeCashflow': 4658437632, 'targetMedianPrice': 667.59, 'currentPrice': 648.85, 'earningsGrowth': 0.007, 'currentRatio': 1.259, 'returnOnAssets': 0.12882, 'numberOfAnalystOpinions': 8, 'targetMeanPrice': 693.44, 'debtToEquity': 44.036, 'returnOnEquity': 0.57367, 'targetHighPrice': 917.32, 'totalCash': 3362800128, 'totalDebt': 3503099904, 'totalRevenue': 19728799744, 'totalCashPerShare': 8.488, 'financialCurrency': 'EUR', 'revenuePerShare': 49.224, 'quickRatio': 0.714, 'recommendationMean': 1.9, 'exchange': 'NMS', 'shortName': 'ASML Holding N.V. - New York Re', 'longName': 'ASML Holding N.V.', 'exchangeTimezoneName': 'America/New_York', 'exchangeTimezoneShortName': 'EST', 'isEsgPopulated': False, 'gmtOffSetMilliseconds': '-18000000', 'quoteType': 'EQUITY', 'symbol': 'ASML', 'messageBoardId': 'finmb_388904', 'market': 'us_market', 'annualHoldingsTurnover': None, 'enterpriseToRevenue': 12.664, 'beta3Year': None, 'enterpriseToEbitda': 37.262, '52WeekChange': -0.056108356, 'morningStarRiskRating': None, 'forwardEps': 19.89, 'revenueQuarterlyGrowth': None, 'sharesOutstanding': 403136992, 'fundInceptionDate': None, 'annualReportExpenseRatio': None, 'totalAssets': None, 'bookValue': 20.078, 'sharesShort': 1064938, 'sharesPercentSharesOut': 0.0026, 'fundFamily': None, 'lastFiscalYearEnd': 1640908800, 'heldPercentInstitutions': 0.19837, 'netIncomeToCommon': 5581100032, 'trailingEps': 15, 'lastDividendValue': 1.34, 'SandP52WeekChange': -0.09920794, 'priceToBook': 32.316467, 'heldPercentInsiders': 3.0000001e-05, 'nextFiscalYearEnd': 1672444800, 'yield': None, 'mostRecentQuarter': 1664668800, 'shortRatio': 1.05, 'sharesShortPreviousMonthDate': 1669766400, 'floatShares': 396089064, 'beta': 1.193333, 'enterpriseValue': 249845350400, 'priceHint': 2, 'threeYearAverageReturn': None, 'lastSplitDate': 1191196800, 'lastSplitFactor': '8:9', 'legalType': None, 'lastDividendDate': 1667433600, 'morningStarOverallRating': None, 'earningsQuarterlyGrowth': -0.022, 'priceToSalesTrailing12Months': 13.927181, 'dateShortInterest': 1672358400, 'pegRatio': 1.46, 'ytdReturn': None, 'forwardPE': 32.62192, 'lastCapGain': None, 'shortPercentOfFloat': None, 'sharesShortPriorMonth': 1391590, 'impliedSharesOutstanding': 0, 'category': None, 'fiveYearAverageReturn': None, 'previousClose': 630.25, 'regularMarketOpen': 638.09, 'twoHundredDayAverage': 532.03094, 'trailingAnnualDividendYield': 0.008044427, 'payoutRatio': 0.495, 'volume24Hr': None, 'regularMarketDayHigh': 650.55, 'navPrice': None, 'averageDailyVolume10Day': 1064870, 'regularMarketPreviousClose': 630.25, 'fiftyDayAverage': 590.16, 'trailingAnnualDividendRate': 5.07, 
'open': 638.09, 'toCurrency': None, 'averageVolume10days': 1064870, 'expireDate': None, 'algorithm': None, 'dividendRate': 6.63, 'exDividendDate': 1667433600, 'circulatingSupply': None, 'startDate': None, 'regularMarketDayLow': 634.2, 'currency': 'USD', 'trailingPE': 43.256664, 'regularMarketVolume': 1033429, 'lastMarket': None, 'maxSupply': None, 'openInterest': None, 'marketCap': 274766561280, 'volumeAllCurrencies': None, 'strikePrice': None, 'averageVolume': 1204796, 'dayLow': 
634.2, 'ask': 648.5, 'askSize': 800, 'volume': 1033429, 'fiftyTwoWeekHigh': 714.62, 'fromCurrency': None, 'fiveYearAvgDividendYield': 0.84, 'fiftyTwoWeekLow': 363.15, 'bid': 646.93, 'tradeable': False, 'dividendYield': 0.0105, 'bidSize': 1000, 'dayHigh': 650.55, 'coinMarketCapLink': None, 'regularMarketPrice': 648.85, 'preMarketPrice': None, 'logo_url': 'https://logo.clearbit.com/asml.com', 'trailingPegRatio': None}

 그럼 이 종목이 가지고 있는 거의 모든 정보가 출력된다. 섹터, 직원수, 회사 설명, 창립연도, 도시, 당기순이익, 순이익, 매출총이익, 영업현금흐름 등.. 어떤 규칙인지는 모르겠으나 이것 저것이 출력되는 것을 알 수 있다.

 

 너무 복잡하니, 정리되어있는 중요한 정보인 재무제표를 뽑아보도록 하자.

import yfinance as yf
asml = yf.Ticker("asml")

asml_financials=asml.financials
print(asml_financials)

 여기서는 재무제표를 부르는 함수가 financials이고, 비슷한 과정을 거치면 아래와 같은 결과가 나온다.

                                                       2021-12-31     2020-12-31     2019-12-31
Total Revenue                                       18611000000.0  13978500000.0  11820000000.0  
Operating Revenue                                   18611000000.0  13978500000.0  11820000000.0  
Cost Of Revenue                                      8802000000.0   7181300000.0   6540200000.0  
Gross Profit                                         9809000000.0   6797200000.0   5279800000.0  
Operating Expense                                    3272600000.0   2745700000.0   2489000000.0  
Selling General And Administration                    725600000.0    544900000.0    520500000.0  
Research And Development                             2547000000.0   2200800000.0   1968500000.0  
Operating Income                                     6536400000.0   4051500000.0   2790800000.0  
Net Non Operating Interest Income Expense             -44600000.0    -34900000.0    -25000000.0  
Interest Income Non Operating                          10000000.0      8400000.0     11600000.0  
Interest Expense Non Operating                         54600000.0     43400000.0     36600000.0  
Total Other Finance Cost                               44600000.0     34900000.0     25000000.0  
Other Income Expense                                  213700000.0            NaN            NaN  
Other Non Operating Income Expenses                   213700000.0            NaN            NaN  
Pretax Income                                        6705500000.0   4016600000.0   2765800000.0  
Tax Provision                                        1021400000.0    551500000.0    191700000.0  
Earnings From Equity Interest Net Of Tax              199100000.0     88600000.0            NaN  
Net Income Common Stockholders                       5883200000.0   3553700000.0   2592300000.0  
Net Income                                           5883200000.0   3553700000.0   2574100000.0  
Net Income Including Noncontrolling Interests        5883200000.0   3553700000.0   2574100000.0  
Net Income Continuous Operations                     5883200000.0   3553700000.0   2574100000.0  
Otherunder Preferred Stock Dividend                  -199100000.0    -88600000.0    -18200000.0  
Diluted NI Availto Com Stockholders                  5883200000.0   3553700000.0   2592300000.0  
Basic EPS                                                   14.36           8.49           6.13  
Diluted EPS                                                 14.34           8.48           6.12  
Basic Average Shares                                  409800000.0    418300000.0    420800000.0  
Diluted Average Shares                                410400000.0    419100000.0    421600000.0  
Total Operating Income As Reported                   6750100000.0   4051500000.0   2790800000.0  
Total Expenses                                      12074600000.0   9927000000.0   9029200000.0  
Net Income From Continuing And Discontinued Ope...   5883200000.0   3553700000.0   2574100000.0  
Normalized Income                                    5883200000.0   3553700000.0   2574100000.0  
Interest Income                                        10000000.0      8400000.0     11600000.0  
Interest Expense                                       54600000.0     43400000.0     36600000.0  
Net Interest Income                                   -44600000.0    -34900000.0    -25000000.0  
EBIT                                                 6760100000.0   4051500000.0   2790800000.0  
Reconciled Cost Of Revenue                           8802000000.0   7181300000.0   6540200000.0  
Reconciled Depreciation                               471000000.0    490800000.0    448500000.0  
Net Income From Continuing Operation Net Minori...   5883200000.0   3553700000.0   2574100000.0  
Normalized EBITDA                                    7231100000.0   4542300000.0   3239300000.0  
Tax Rate For Calcs                                          0.152          0.137          0.069  
Tax Effect Of Unusual Items                                   0.0            0.0            0.0

아마 단위는 US달러겠지? 라고 생각했지만, 확인해보니 유로였다. 야후 파이넌스에 적혀있는 DB를 그대로 가져오는 듯 해보인다.

 Ticker Moudle내 다른 많은 기능들이 최 상단에 첨부한 github에 서술되어있다. 포함되어있다. 더 필요한 정보가 있다면 참고하시길바란다.

● Fetching data for multiple tickers

 시간 단위로 여러개의 주가의 흐름을 출력하는 함수를 한 번 입력해보자.

import yfinance as yf
data = yf.download("MSFT ASML", start="2022-01-01", end="2022-12-31")

 근데 이렇게 치기만하면 아주 가독성이 안좋은 data로 나온다. 원하는 작업은 2022년 1월 1일부터 2022년 12월 31일까지의 주가흐름을 표로 보려고 했는데, 아래와 같이 두 종목이 섞인 상태에서 열도 맞지 않고 아주 생 것 그대로의 것이 출력되는 느낌이다. (위에 financial은 yahoo finance에 배열되어 있는 표를 그대로 가져와서 오와열이 딱 맞는 것 같다.)

[*********************100%***********************]  2 of 2 completed
                            Adj Close                   Close  ...        Open   Volume
                                 ASML        MSFT        ASML  ...        MSFT     ASML      MSFTDate                                                           ...
.  334.829987   874100  326743002022-01-05 00:00:00-05:00  736.208557  313.442993720600  288651002022-01-04 00:00:00-05:00  769.303284  325.955750  779.190002  ...  334.82  745.669983  ...  325.859985  1193200  400543002022-01-06 00:00:00-05:00  753.43983  ...  325.859985  1193200  400543002022-01-06 00:00:00-05:00  753.437134  310.966217  7134  310.966217  763.119995  ...  313.149994  2041200  396461002022-01-07 00:00:65  311.124725  756.099976  ...  314.149994  1363300  32720000...00-05:00  746.506165  311.124725  756.099976  ...  314.149994  1363300  32720000.0:00:00-05:00  551.369995  238.729996  551.369995  ...  236.110001   602600  212070002022-..                               ...         ...         ...  ...         ...    0  166886002022-12-28 00:00:00-05:00  531.640015  234.529999  531.640015  ...  236.889999 
  ...       ...2022-12-23 00:00:00-05:00  551.369995  238.729996  551.369995  ......  235.649994   841000  197707002022-12-30 00:00:00-05:00  546.400024  239.820007  546.4  236.110001   602600  212070002022-12-27 00:00:00-05:00  537.179993  236.960007 
 537.179993  ...  238.699997   802600  166886002022-12-28 00:00:00-05:00  531.640015  234.529999  531.640015  ...  236.889999   609900  174571002022-12-29 00:00:00-05:00  551.469971  241.009995  551.469971  ...  235.649994   841000  197707002022-12-30 00:00:00-05:00  546.400024  239.820007  546.400024  ...  238.210007   701900  21930800
[251 rows x 12 columns]

 이걸 가독성이 좋은 data array로 만들기 위해서는 pandas라는 것을 배워야한다고 한다. pandas는 다음 글에서 배워보겠다 !

반응형

댓글