코딩에 ㅋ자와 퀀트의 ㅋ자도 잘 모르지만, 2022년 하락장을 맞으면서 내가 매크로를 정확하게 분석하여 시장을 예측할 수 없다면, 과거 비슷한 사례에서의 사람들의 패턴을 추종해보는 전략을 취해보자 → 퀀트 라는 강환국 작가의 말에 매료되어 물고기를 잡는 방법부터 하나 둘 씩 학습해보고자한다.
https://github.com/ranaroussi/yfinance
파이썬의 설치에 대해서는 생략하도록 하고, 내장되어있는 모듈을 다운받아 하나 씩 실습해보는 일지로 블로그를 활용해보고자 한다. 아마 내가 코딩에 대해 전혀 잘 모르는 초보라 이 글을 읽을 때, 다른 전문 글 보다 더 도움이 될 수도 있을 것 이다.
● 왜 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는 다음 글에서 배워보겠다 !
'미래걱정 > 주식' 카테고리의 다른 글
yfinance로 주가 저장 및 크롤링하기, csv저장, 그래프 그리기 등 (with chat gpt) (0) | 2023.01.26 |
---|---|
코딩 왕초보의 S&P500 그래프와 PER Band 그리기 -1 (with chat GPT) (2) | 2023.01.26 |
한상희 위원과 함께하는 2023년도 주식시장 전망 (삼프로TV, STEPS 리뷰) (0) | 2023.01.08 |
주식은 답이 아니다? 박석중 파트장님과 나의 생각 [삼프로TV 유튜브리뷰] (2) | 2023.01.04 |
흥미로운 달러 1250원 주식 매수 전략, [할 수 있다! 알고투자 유튜브 요약리뷰] (0) | 2023.01.03 |
댓글