[목차]

#.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)

 

+ Recent posts