# 1주차
NameError
: name 'name1' is not defined
KeyError: 'name1'


# 2주차

 

 

기술·공학 >> 정보통신 >> 정보기술 >> 정보기술개발 >> 응용SW엔지니어링

 

통합 구현(Spring, Django)


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주차 최종 결과물

  • 배포 체크 리스트

[목차]

#.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. 요일 표기와 주별 가격 붙이기

  • [요일 표기하기]
    - 주가 가져오기
    - 요일 표기하기
  • [월,금요일만 남기기]
    - 월,금요일만 가져오기
    - 처음 / 마지막 고려해주기
    - 휴일 고려하기
  • [수익률 구하기]
    - 주가 모으기
    - 수익률 구하기
    - 함수로 만들기

07. 최적화 종목 찾기

  • dart-fss 라이브러리 사용하기

  • 최적화된 종목를 찾기

[목차]

#.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-datareaderfinance-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]

03. 간단한 그래프 그려보기

  • 주가 그래프 그려보기
    - 엄청 쉽답니다! .plot(y=['컬럼명'])
    > df = fdr.DataReader('005930','2018')
    > df.plot(y=['Close'])

    - 좀 더 크게 그려볼까요?
    > df.plot(y=['Close'],figsize=(15,8))

    - 격자 추가하기
    > df.plot(y=['Close'],figsize=(15,8),grid=True)

  • 종목 두 개의 주가 변동 그래프를 그려보기
    - 삼성전자와 LG전자 최근 100일 기준
    > df_1 = fdr.DataReader('005930','2018')
    > df_2 = fdr.DataReader('066570','2018')
    > df_tot = pd.DataFrame()
    > df_tot['Samsung'] = df_1[['Change']]
    > df_tot['LG'] = df_2[['Change']]
    > df_tot.tail(100).plot(figsize=(15,8))

04. 이동평균값 만들기(3일)

  • 3일마다 평균 값을 구하기
    > df = fdr.DataReader('005930','2018')
    > df = df[['Close']]
    > df['ma'] = df.rolling(3).mean()
    > df

05. buy & sell 표기

  • buy & sell 표기하기
    > df = fdr.DataReader('005930','2018')
    > df = df[['Close']]
    > df['ma'] = df.rolling(3).mean().shift(1)
    > df['action'] = np.where(df['Close'] > df['ma'], 'buy', 'sell')
    > df

06. 수익률 구하기

  • 함수 만들기
    > def get_return(code,n):
    > df = fdr.DataReader(code,'2018')
    > df = df[['Close']].copy()
    > df['ma'] = df.rolling(n).mean().shift(1)
    > df['action'] = np.where(df['Close'] > df['ma'], 'buy', 'sell')
    > df.iloc[-1,-1] = 'sell'
    > cond1 = (df['action'] == 'buy') & (df['action'].shift(1) == 'sell')
    > cond2 = (df['action'] == 'sell') & (df['action'].shift(1) == 'buy')
    > df_buy = df[cond1].reset_index()
    > df_buy.columns = ['날짜','종가(buy)','이평값','액션']
    > df_sell = df[cond2].reset_index()
    > df_sell.columns = ['날짜','종가(sell)','이평값','액션']
    > df_result = pd.concat([df_buy,df_sell],axis=1)
    > df_result['수익률'] = df_result['종가(sell)'] / df_result['종가(buy)']
    > return df_result[['수익률']].cumprod().iloc[-1,-1] - 1

  • 함수 호출하기
    > get_return('005930',3)
    > get_return('066570',6)

07. 단기/장기이평선 적용하기

  • 함수 만들기
    > def get_return_sl(code, short, long):
    > df = fdr.DataReader(code,'2018')
    > df = df[['Close']].copy()
    > df['ma1'] = df['Close'].rolling(short).mean().shift(1)
    > df['ma2'] = df['Close'].rolling(long).mean().shift(1)
    > df['action'] = np.where(df['ma1'] > df['ma2'], 'buy', 'sell')
    > df.iloc[-1,-1] = 'sell'
    > cond1 = (df['action'] == 'buy') & (df['action'].shift(1) == 'sell')
    > cond2 = (df['action'] == 'sell') & (df['action'].shift(1) == 'buy')
    > df_buy = df[cond1].reset_index()
    > df_buy.columns = ['날짜','종가(buy)','이평값1','이평값2','액션']
    > df_sell = df[cond2].reset_index()
    > df_sell.columns = ['날짜','종가(sell)','이평값1','이평값2','액션']
    > df_result = pd.concat([df_buy,df_sell],axis=1)
    > df_result['수익률'] = df_result['종가(sell)'] / df_result['종가(buy)']
    > df_final = (df_result[['수익률']].cumprod().tail(1) - 1)*100
    > df_final['단기'] = short
    > df_final['장기'] = long
    > return df_final

  • 함수 호출하기
    > get_return_sl('005930',3,30)

 

[목차]

#.3-1 오늘 배울 것 00:59
#.3-2 Dart OpenAPI 키 발급받기 01:58
#.3-3 Dart 라이브러리 활용하기 02:51
#.3-4 종목 정리하기 05:28
#.3-5 dart API 시용해보기 09:54
#.3-6 상장 종목 분석하기(1) 11:06
#.3-7 비상장 종목 분석하기 05:29
#.3-8 3주차 끝 & 숙제 설명 04:23

 

01. 오늘 배울 것

  • Dart OpenAPI 를 활용하기
    - Dart Open API를 활용하면 공시 정보를 ‘데이터 분석’에 활용할 수 있어요.
    - 이제 일일이 공시자료를 보러가지 않아도, 분석을 할 수 있답니다!

  • 상장, 비상장 종목을 분석하기
    - Dart에서 제공하는 자료들을 이용하여 종목을 분석합니다!
    - 최대 주주 지분율 변동이 큰 회사는?
    - 이익잉여금이 크게 상승한 회사는?

02. Dart OpenAPI 키 발급받기

  • Dart OpenAPI 키 발급

03. Dart 라이브러리 활용하기

  • Colab 구동하기
    - drive.google.com 에 접속하여 구동하기

  • Dart-fss 라이브러리 설치하기
    - https://dart-fss.readthedocs.io/en/latest/
    > !pip install dart-fss

  • 키 넣고, 구동해보기
    > 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()]

  • 엑셀로 저장해두기
    > .to_excel('파일명.xlsx') 만 붙이면 엑셀로 만들어준답니다. 판다스의 힘!
    > df_listed.to_excel('비상장사.xlsx')
    > df_non_listed.to_excel('상장사.xlsx')

05. dart API 시용해보기 

  • 한 개 종목을 정해서 코드를 찾기
    > corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
    > corp_code

  • dart api 를 사용해보기(사업보고서)
    > # 1.기업정보
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > dart_fss.api.filings.get_corp_info(corp_code)

    > # 2. 미등기임원 보수 총액
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.unrst_exctv_mendng_sttus(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 3. 증자(감자)현황
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.irds_sttus(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 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'])

    > # 6. 임원 사항
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.exctv_sttus(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 7. 직원 현황
    > # 남녀 평균 급여도 볼 수 있네요!
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.emp_sttus(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 8. 이사 보수
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.hmv_audit_indvdl_by_sttus(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 9. 연봉 top 5
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.indvdl_by_pay(corp_code, '2021', '11011')
    > pd.DataFrame(data['list'])

    > # 10. 타법인 출자 현황
    > corp_code = df_listed[df_listed['corp_name'] == '카카오'].iloc[0,0]
    > data = dart_fss.api.info.otr_cpr_invstmnt_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'])

    > # 2. 한 종목에 대해 표 그리기
    > corp_code = df_listed[df_listed['corp_name'] == '삼성전자'].iloc[0,0]
    data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')
    df = pd.DataFrame(data['list'])
    df = df[df['fs_div'] == 'CFS']
    df['name'] = '삼성전자'
    cond = df['account_nm'] == '이익잉여금'
    df = df[cond]
    df = df[['name','thstrm_amount','frmtrm_amount']]
    df.columns = ['이름','당기','전기']
    df['당기'] = pd.to_numeric(df['당기'].str.replace(',',''))
    df['전기'] = pd.to_numeric(df['전기'].str.replace(',',''))
    df['증감'] = df['당기'] - df['전기']
    df['증감율'] = abs(df['증감'])/abs(df['전기'])
    df
    > # 마찬가지로, 함수로 만들어봅니다.
    > def get_profit(corp_name):
      corp_code = df_listed[df_listed['corp_name'] == corp_name].iloc[0,0]
      data = dart_fss.api.finance.fnltt_singl_acnt(corp_code, '2021', '11011')
      df = pd.DataFrame(data['list'])
      df = df[df['fs_div'] == 'CFS']
      df['name'] = corp_name
      cond = df['account_nm'] == '이익잉여금'
      df = df[cond]
      df = df[['name','thstrm_amount','frmtrm_amount']]
      df.columns = ['이름','당기','전기']
      df['당기'] = pd.to_numeric(df['당기'].str.replace(',',''))
      df['전기'] = pd.to_numeric(df['전기'].str.replace(',',''))
      df['증감'] = df['당기'] - df['전기']
      df['증감율'] = abs(df['증감'])/abs(df['전기'])
      return df

    > # 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[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']]
    df.columns = ['기업명','2021','2020','2019']
    df

    > # 함수로 만들기
    > def get_earning(name):
      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[df['se'] == '(연결)당기순이익(백만원)'][['corp_name','thstrm','frmtrm','lwfr']]
      df.columns = ['기업명','2021','2020','2019']
      return df

 

 

[목차]

#.2-1 오늘 배울 것 03:36
#.2-2 Pandas 기초 07:50
#.2-3 엑셀 가져오기 02:23
#.2-4 Pandas 실전 05:24
#.2-5 해외주식 다루기 - yfinance 08:59
#.2-6 분석하기(1) : 전략 세우기 16:03
#.2-7 분석하기(2) : 분석하기 07:06

 

01. 오늘 배울 것

  • 데이터분석의 친구, Pandas  DataFrame 과 친해지기

데이터 형태

02. Pandas 기초

  • 기본 DataFrame 만들어보기

  • DataFrame 다루기 - 기초
    - 행추가하기
      > doc = { 'name':'세종', 'age':14, }
      > df = df.append(doc,ignore_index=True)

    - Colums 추가하기
      > df['city'] = ['서울','부산','부산','서울','서울']

    - 특정 Column만 뽑아보기
      > df[['name','city']]

    - 원하는 조건에 맞는 행만 뽑아보기
      > df[df['age'] < 20]

    - 특정 행에서의 뽑아보기
      > df.iloc[-1,0] # 마지막 행
      > df.iloc[0,0] # 첫 행

  • DataFrame 다루기 - 연산
    - 열 정렬하기
      > df.sort_values(by='age',ascending=True)

    - 조건에 맞는 열을 추가하기
      > np.where(df['age'] > 20,'성인','청소년')
      > df['is_adult'] = np.where(df['age'] > 20,'성인','청소년')

    - 평균, 최대값, 최소값, 갯수 구하기
      > df['age'].mean()
      > df['age'].max()
      > df['age'].min()
      > df['age'].count()

    - 퀴즈 - 서울에 사는 사람 중 나이가 가장 많은 사람은 몇 살?
      > df[df['city'] == '서울']['age'].max()
      > 또는
      > df[df['city'] == '서울'].sort_values(by='age',ascending=False).iloc[0,1]

03. 엑셀 가져오기

  • 실제 데이터 import 해보기
    - 엑셀파일을 끌어다가 colab에 붙여볼게요!

엑셀 import

  • 엑셀을 DataFrame으로 읽기
    > df = pd.read_excel('종목데이터.xlsx')
    > df.head()
    > df.tail()
    > df = pd.read_excel('종목데이터.xlsx')     # 소수점둘째자리

04. Pandas 실전

  • 어제 오른 종목들만 골라보기
    > df[df['change_rate'] > 0]
  • per가 0 인 종목들을 제거하기
    > df = df[df['per'] > 0]
  • 순이익, 종가를 추가하기
    > # per = 시가총액 / 순이익 = 주가 / 주당순이익
    > df['earning'] = df['marketcap'] / df['per']
    > df['close'] = df['per'] * df['eps']
  • date 컬럼을 없애기
  • 조건문 (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)
  • 여기에 매출, 순이익을 더해보겠습니다.
    > # 최근 3년 매출, 순이익 더하기
    > rev2021 = company.earnings.iloc[-1,0]
    > rev2020 = company.earnings.iloc[-2,0]
    > rev2019 = company.earnings.iloc[-3,0]
    > ear2021 = company.earnings.iloc[-1,1]
    > ear2020 = company.earnings.iloc[-2,1]
    > ear2019 = company.earnings.iloc[-3,1]

  • 1) 빈 DataFrame을 만들기
    > pd.options.display.float_format = '{:.2f}'.format
    > # 데이터를 모을 빈 DataFrame 생성
    > import pandas as pd
    > df = pd.DataFrame()

  • 2) 리마인드 - DataFrame에 데이터를 넣는 법
    > # 딕셔너리 생성 및  “append” 정의
    > doc = { 'name':'bob', 'age':26, }
    > df.append(doc,ignore_index=True)

  • 3) 데이터 모으기 (TSLA정보 추출)
    > doc = {
        'code':code,
        'name':name,
        'industry':industry,
        'bussiness':bussiness,
        'marketCap':marketCap/1000,
        'currentPrice':currentPrice,
        'targetPrice':targetPrice,
        'per':per,
        'eps':eps,
        'pbr':pbr,
        'news':news,
        'rev2021':rev2021/1000,
        'rev2020':rev2020/1000,
        'rev2019':rev2019/1000,
        'ear2021':ear2021/1000,
        'ear2020':ear2020/1000,
        'ear2019':ear2019/1000,
    }
    > df.append(doc,ignore_index = True)

  • 4) 전체 데이터 모으기!
    > # 전체 종목을 모으기 위한 첫 단계!
    > def add_company(code):
      company = yf.Ticker(code)
      name = company.info['shortName']
      industry = company.info['industry']
      bussiness = company.info['longBusinessSummary']
      marketCap= company.info['marketCap']
      currentPrice= company.info['currentPrice']
      targetPrice= company.info['targetMeanPrice']
      per = company.info['forwardPE']
      eps = company.info['forwardEps']
      pbr = company.info['priceToBook']
      rev2021 = company.earnings.iloc[-1,0]
      rev2020 = company.earnings.iloc[-2,0]
      rev2019 = company.earnings.iloc[-3,0]
      ear2021 = company.earnings.iloc[-1,1]
      ear2020 = company.earnings.iloc[-2,1]
      ear2019 = company.earnings.iloc[-3,1]

      doc = {
        'code':code,
        'name':name,
        'industry':industry,
        'bussiness':bussiness,
        'marketCap':marketCap/1000,
        'currentPrice':currentPrice,
        'targetPrice':targetPrice,
        'per':per,
        'eps':eps,
        'pbr':pbr,
        'rev2021':rev2021/1000,
        'rev2020':rev2020/1000,
        'rev2019':rev2019/1000,
        'ear2021':ear2021/1000,
        'ear2020':ear2020/1000,
        'ear2019':ear2019/1000,
      }
      return doc


  • 5) 전체 데이터 모으기 (10개 社)
    > codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA']
    > df = pd.DataFrame()
    codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA']
    for code in codes:
      print(code)
      try:
        row = add_company(code)
        df = df.append(row, ignore_index = True)
      except:
        print(f'error - {code}')
    df

07. 분석하기(2) : 분석하기

  • 1) eps 순서대로 정렬해보기
    > df.sort_values(by='eps',ascending=False)

  • 2) 특정 per 이하만 보기
    > df[df['per'] < 30].sort_values(by='per',ascending=False)

  • 3) 현재가격 - 1년 후 가격의 비율 차이가 큰 종목들을 추려내기
    > df[['code','name','currentPrice','targetPrice']]
    > new_df = df[['code','name','currentPrice','targetPrice']].copy()
    > new_df['gap'] = new_df['targetPrice'] / new_df['currentPrice'] -1
    > new_df.sort_values(by='gap',ascending=False)

  • 4) 3년 연속 순수익이 오른 기업을 표기하기
    > import numpy as np
    > new_df2 = df[['code','name','ear2021','ear2020','ear2019']].copy()
    > cond = (new_df2['ear2021'] > new_df2['ear2020']) & (new_df2['ear2020'] > new_df2['ear2019'])
    > new_df2['is_target'] = np.where(cond,'O','X')
    > new_df2[new_df2['is_target'] == 'O']

+ Recent posts