[목차]
#.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]
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)
'유용한정보 > 교육' 카테고리의 다른 글
컨텐츠 계획서(AI주식매매) - (1) (0) | 2023.01.20 |
---|---|
[스파르타 코딩클럽] 2강.파이썬 종합반 - 5주차(1) 개발일지 (0) | 2023.01.16 |
[스파르타 코딩클럽] 2강.파이썬 종합반 - 3주차(1) 개발일지 (0) | 2023.01.16 |
[스파르타 코딩클럽] 2강.파이썬 종합반 - 2주차(1) 개발일지 (0) | 2023.01.16 |
[스파르타 코딩클럽] 1강.웹개발 종합반 - 5주차(1) 개발일지 (0) | 2023.01.16 |