01. Spring Framework의 개념 파악하기 맛보기 02. Maven 활용하기 03. Spring MVC 구성하기 04. IoC와 DI 개념 파악하기 05. Mybatis를 통한 DB 연동하기 06. AOP의 개념 파악하기 07. Spring Security 적용하기 08. 권한에 따른 처리 09. Django Framework의 개념 파악하기 10. 사이트 뼈대 구성하기 11. Django 모델 파악하기 12. Django Form과 View 13. Django 템플릿 알아보기 14. Admin Site 알아보기 15. 유저 인증과 Session
#.5-1 오늘 배울 것 01:36 #.5-2 변동성 돌파 전략 - 설명 03:35 #.5-3 주가 가져오기 01:55 #.5-4 사야하는 날, 파는 날 가격 구하기 11:11 #.5-5 최적의 k 구하고 나만의 전략 구현하기 06:30 #.5-6 요일 표기와 주별 가격 붙이기 14:06 #.5-7 최적화 종목 찾기 05:20 #.5-8 5주차 끝 & 숙제 설명 01:42
01.오늘 배울 것
백테스팅 연습하기
02.변동성 돌파 전략 - 설명
변동성 돌파 전략이란? - -
그림으로 이해하기
03.주가 가져오기
라이브러리 설치 - -
주가 가져오기
살펴보기
04.사야하는 날, 파는 날 가격 구하기
[사야하는 가격 구하기] - -
[사야하는 날 & 파는 가격 구하기]
[수익률 구하기]
05.최적의 k 구하고 나만의 전략 구현하기
[최적의 k 구하기] - 함수로 만들기 - k 값을 바꿔가며 최적의 값을 구하기
[나만의 전략 구현하기: 월-금 전략] - 어떤 것이든 전략이 될 수 있어요! - 오늘 다뤄볼 전략은
06.요일 표기와 주별 가격 붙이기
[요일 표기하기] - 주가 가져오기 - 요일 표기하기
[월,금요일만 남기기] - 월,금요일만 가져오기 - 처음 / 마지막 고려해주기 - 휴일 고려하기
#.4-1 오늘 배울 것 01:01 #.4-2 백테스팅 전략 세우기& 주가 가져오기 06:44 #.4-3 간단한 그래프 그려보기 03:53 #.4-4 이동평균값 만들기(3일) 02:23 #.4-5 buy & sell 표기 02:34 #.4-6 수익률 구하기(1) 13:24 #.4-7 단기/장기이평선 적용하기 07:00 #.4-8 4주차 끝 & 숙제 설명 02:16
01.오늘 배울 것
이동평균선이란? ⇒ 이전 며칠(3일, 5일, 20일, 50일 등) 간의 가격을 평균하여 움직이는 선! ⇒ 일수가 커질수록 곡선이 완만해질 수밖에 없겠죠!
우리가 쓸 전략 : 골든크로스, 데드크로스 전략 ⇒ 골든크로스 : 주가가 높아질 가능성이 있다는 신호 ⇒ 데드크로스 : 주가가 낮아질 가능성이 있다는 신호 ⇒ 그러면, “골든크로스 때는 사고, 데드크로스 때는 팔면 → 싸게 사서 비싸게 파는 것 아닐까?”
02.백테스팅 전략 세우기& 주가 가져오기
라이브러리 설치 - pandas-datareader 와 finance-datareader 라이브러리 > !pip install yfinance pandas-datareader finance-datareader
주가 가져오기 - 필요한 라이브러리들을 import 하고, 단 한줄로 가져올 수 있답니다. - 다른 코드를 넣으면, 종목 별로 모두 가져올 수 있죠! > from pandas_datareader import data as pdr > import yfinance as yf > yf.pdr_override() > import numpy as np > import pandas as pd > import FinanceDataReader as fdr > df = fdr.DataReader('005930','2018') > df.head()
살펴보기 - Open: 시초가High: 고가Low: 저가Close: 종가Volume: 거래량Change: 변동 - 아래와 같이 하면, 종가만 가져올 수 있겠죠! > df[['Close']]
- 변동이 20% 이상인 날들만 가져와보기 > df[abs(df['Change']) > 0.05]
키 넣고, 구동해보기 > import dart_fss as dart_fss > import pandas as pd > api_key = '여기에 API 키를 입력' > dart_fss.set_api_key(api_key=api_key) > corp_list = dart_fss.get_corp_list() > corp_list.corps
04. 종목 정리하기
상장, 비상장 종목을 정리해볼까요? > # 우선, 전체 종목을 보는 코드를 작성해봅니다. > all = dart_fss.api.filings.get_corp_code() > all[0] > # 이렇게 DataFrame 형태로 볼 수도 있습니다. > df = pd.DataFrame(all) > df > stock_code 가 있는 종목은 상장사, 없는 종목은 비상장사를 의미합니다. > df_listed = df[df['stock_code'].notnull()] > df_non_listed = df[df['stock_code'].isnull()]
> # 4. 배당 현황 > dart 에서 해당 내용을 찾아볼까요? (링크) > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') > pd.DataFrame(data['list'])
> # 5. 최대주주 현황 > 최대주주 중 몇 명이 주식을 샀는지 / 팔았는지도 알 수 있겠군요! > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011') > pd.DataFrame(data['list'])
dart api를 사용해보기(상장기업 재무정보) > # 재무제표의 3년 치 주요 정보를 얻을 수 있어요 > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011') > pd.DataFrame(data['list']) > # 이렇게 하면 모든 항목을 볼 수 있답니다. > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.finance.fnltt_singl_acnt_all(corp_code, '2021', '11011', 'CFS') > pd.DataFrame(data['list'])
dart api를 사용해보기(주주정보) > # 임원, 주요 주주 소유 보고 > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.shareholder.elestock(corp_code) > pd.DataFrame(data['list']) > # 특정 사람에 대해서만 볼까요? > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] > data = dart_fss.api.shareholder.elestock(corp_code) > df_temp = pd.DataFrame(data['list']) > df_temp[df_temp['repror'] == '김범수']
06. 상장 종목 분석하기(1)
한 종목에 대해 뽑아보기 > def get_salary_top(name): corp_code = df_listed[df_listed['corp_name'] == name].iloc[0,0] data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011') df_temp = pd.DataFrame(data['list']) df_temp = df_temp[['corp_name','nm','ofcps','mendng_totamt']] df_temp.columns = ['기업명','이름','역할','보수'] df_temp['보수'] = pd.to_numeric(df_temp['보수'].str.replace(',','')) df_temp = df_temp.sort_values(by='보수',ascending=False) return df_temp > get_salary_top('삼성전자') #삼성전자 > get_salary_top('카카오') #카카오
여러개 종목에 대해 뽑아보기 > names = ['삼성전자','LG에너지솔루션','SK하이닉스','NAVER','삼성바이오로직스','삼성전자우','카카오','삼성SDI','현대차','LG화학','기아','POSCO홀딩스','KB금융','카카오뱅크','셀트리온','신한지주','삼성물산','현대모비스','SK이노베이션','LG전자','카카오페이','SK','한국전력','크래프톤','하나금융지주','LG생활건강','HMM','삼성생명','하이브','두산중공업','SK텔레콤','삼성전기','SK바이오사이언스','LG','S-Oil','고려아연','KT&G','우리금융지주','대한항공','삼성에스디에스','현대중공업','엔씨소프트','삼성화재','아모레퍼시픽','KT','포스코케미칼','넷마블','SK아이이테크놀로지','LG이노텍','기업은행'] dfs = [] for name in names: try: df = get_salary_top(name) dfs.append(df) except: print(f'없음 - {name}') df_result = pd.concat(dfs) df_result.sort_values(by='보수',ascending=False) > df_result.sort_values(by='보수',ascending=False).head(30)
함수만들기1] 최대 주주의 주식 변동 모아보기 > # 1. 한 종목에 대해 해보기 > # 우선, 종목 코드를 가져와볼게요! 00258801 > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0] corp_code > # 다시, 주요 주주 지분율을 봅니다. > data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011') df = pd.DataFrame(data['list']) df > # 이제, 원하는 모양으로 만들어봅니다! > data = dart_fss.api.info.hyslr_sttus('00258801', '2021', '11011') df = pd.DataFrame(data['list']) df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']] df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고'] df = df[df['관계'].notnull()] df['기초지분율'] = pd.to_numeric(df['기초지분율']) df['기말지분율'] = pd.to_numeric(df['기말지분율']) df.sort_values(by='기초지분율',ascending=False).head(3) > # 역시, 함수로 만들 수도 있겠죠! > def get_shareholders(corp_code): data = dart_fss.api.info.hyslr_sttus(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df = df[['corp_name','nm','relate','bsis_posesn_stock_qota_rt','trmend_posesn_stock_qota_rt','rm']] df.columns = ['회사명','이름','관계','기초지분율','기말지분율','비고'] df = df[df['관계'].notnull()] df['기초지분율'] = pd.to_numeric(df['기초지분율']) df['기말지분율'] = pd.to_numeric(df['기말지분율']) return df.sort_values(by='기초지분율',ascending=False).head(3) > # 함수 호출 하기 > df_listed.sample(10)
> # 2. 상장 종목 중 10개만 추려내기 > df_listed.sample(10)
> # 3. 10개 종목에 대해 해보기! > # 우선, 10개 종목의 코드를 출력해보겠습니다. > corp_codes = list(df_listed.sample(10)['corp_code']) for corp_code in corp_codes: print(corp_code) > # 10개 기업을 붙여서 보기 > corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_shareholders(corp_code) dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result
> # 4. 조건을 추가하기 > # 증감이 큰 순서대로 정렬하기 > corp_codes = list(df_listed.sample(10)['corp_code']) dfs = [] for corp_code in corp_codes: try: df = get_shareholders(corp_code) dfs.append(df) except: print(f'error - {corp_code}') df_result = pd.concat(dfs) df_result['증감'] = df_result['기말지분율'] - df_result['기초지분율'] df_result.sort_values(by='증감',ascending=False)
함수만들기2] ‘돈 많이 번 회사’를 찾기 > # 1. 한 종목에 대해 해보기 > # 우선, 종목 코드를 가져와볼게요! 00258801 > corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0] data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011') pd.DataFrame(data['list'])
> # 3. 여러 기업에 대해 해보기 > # 마찬가지로 상장사 중 10개를 뽑아서 진행해보겠습니다! > names = list(df_listed.sample(10)['corp_name']) dfs = [] for name in names: try: df = get_profit(name) dfs.append(df) except: print(f'error - {name}') df_result = pd.concat(dfs) df_result > # 약간의 작업을 거쳐서 이익잉여금의 변화를 우선 표기해줍니다. > # 100개 대상으로 해보겠습니다. > names = list(df_listed.sample(100)['corp_name']) dfs = [] for name in names: try: df = get_profit(name) dfs.append(df) except: print(f'error - {name}') df_result = pd.concat(dfs) df_result.sort_values(by='증감율',ascending=False)
07. 비상장 종목 분석하기
한 종목에 대해 해보기 > # 배당 정보 가져오기 > corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0] data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df > corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0] data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') df = pd.DataFrame(data['list']) df
> # 배당 정보 다듬기 > corp_code = df_non_listed[df_non_listed['corp_name'] == '야놀자'].iloc[0,0] data = dart_fss.api.info.alot_matter(corp_code, '2021', '11011') df = pd.DataFrame(data['list'])
- 퀴즈 - 서울에 사는 사람 중 나이가 가장 많은 사람은 몇 살? > df[df['city'] == '서울']['age'].max() > 또는 > df[df['city'] == '서울'].sort_values(by='age',ascending=False).iloc[0,1]
조건문 (pbr < 1 & 시총 1조 이상 & per < 20 을 추려보기) > cond = (df['marketcap'] > 1000000000000) & (df['pbr'] < 1) & (df['per'] < 20) > df[cond] > # 시총이 큰 순서대로 보기 > df[cond].sort_values(by='marketcap', ascending=False) > # 평균, 표준편차 등의 정보를 보기 (함께하기) > df[cond].describe()
05.해외주식 다루기 - yfinance
yfinance 라이브러리 설치하기 > pip install yfinance
"런타임 다시 시작" 하기
yfinance 실행해보기 > import yfinance as yf > company = yf.Ticker('TSLA') > company.info
사이트 활용하기
기본정보 얻기 > # 회사명, 산업, 시가총액, 매출 > name = company.info['shortName'] > industry = company.info['industry'] > marketcap = company.info['marketCap'] > revenue = company.info['totalRevenue'] > print(name,industry,marketcap,revenue)
재무제표에서 3년치 데이터 얻기 > # 대차대조표, 현금흐름표, 기업 실적 > company.balance_sheet > company.cashflow > company.earnings
그 외 정보들 # 주주정보, 애널리스트 추천 등 > company.institutional_holders > company.recommendations > company.calendar > > news = company.news > for n in news: > print(n['title'])
06.분석하기(1) : 전략 세우기
[전략세우기] : 시작하기 : “1) 전략을 세우고 → 2) 데이터를 모으고 → 3) 모아진 데이터를 분석”
종목 별로 보고 싶은 정보를 모아봅시다!
우선, 위의 정보는 아래와 같이 만들 수 있겠죠! . 종목코드 ⇒ code . 회사명 ⇒ company.info[’shortName’] . 산업 ⇒ company.info[’industry’] . 설명 ⇒ company.info[’longBusinessSummary’] . 시가총액 ⇒ company.info[’marketCap’] . 현재 주가 ⇒ company.info[’currentPrice’] . 1년 후 예상 주가 ⇒ company.info[’targetMeanPrice’] . PER ⇒ company.info[’trailingPE’] . EPS ⇒ company.info[’trailingEps’] . PBR ⇒ company.info[’priceToBook’] . 매출 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기 . 순이익 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기 . 뉴스 ⇒ company.news ⇒ 최근 뉴스 1개 가져오기
우선, 위의 정보는 아래와 같이 만들 수 있겠죠! > ompany = yf.Ticker('TSLA') > code = 'TSLA' >name = company.info['shortName'] >industry = company.info['industry'] >marketcap = company.info['marketCap'] >summary = company.info['longBusinessSummary'] >currentprice = company.info['currentPrice'] >targetprice = company.info['targetMeanPrice'] >per = company.info['trailingPE'] >eps = company.info['trailingEps'] >pbr = company.info['priceToBook'] >print(code,name,industry,marketcap,summary,currentprice,targetprice,per,eps,pbr)