⇒ (1) 원하는 종목의 주가 데이터를 가져오고
⇒ (2) 주가 데이터를 원하는 형태로 가공하기
⇒ (3) 사고 → 파는 시점을 적어두기
⇒ (4) 종가를 이용해서 수익률을 구하기
⇒ (5) 이 것을 여러 종목 또는 파라미터를 바꿔서 수행하기
: ⇒ 주식이 막 오르는 것 같다면? 일단 사자! → 그리고 내일 바로 팔자
⇒ 예) k = 0.5 라고 할 때.
1. 어제 삼성전자의 주가가 최고 120,000원 ~ 최저 100,000원 이었다.
2. 오늘 삼성전자의 주가가 105,000원으로 시작했다.
3. 오늘 (120,000 - 100,000) ⇒ 20,000원 x 0.5 = 10,000원 오르면 산다.
⇒ 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가
k 값이라고 불리는데, 적당히 넣어준다. (통상 0.4~0.6)분위기 라고 판단.→ 수익: 130,000 - 115,000원 =15,000원
→ 수익률: 15,000 / 115,000원 = 13%
즉, 어제 변동한 것의 특정 비율만큼 오늘 올랐으면, Buy → 내일 열자마자 Sell
라이브러리 :
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()
- 사는 가격
⇒ 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가
cf. 어제의 High 를 나타낸 열 추가해보기
df['High2'] = df['High'].shift(1)
df = fdr.DataReader('005930','2018')
k = 0.4
df['buy_at'] = (df['High'].shift(1) - df['Low'].shift(1))*k + df['Open']
* 사야하는 날
⇒ high와 buy_at을 비교한다! high 이하 값에 buy_at이 있어야함!
df['is_buy'] = np.where(df['buy_at'] < df['High'],'buy','')
* 파는 시점
⇒ 샀으면 다음날 장이 열리자마자 파는 것입니다!(다음날의 open가격)
cf. 한칸 땡키키 : shift(-1)
df['sell_at'] = df['Open'].shift(-1)
* 수익률
⇒ is_buy 있는 행들만 추리기
df = df[df['is_buy'] == 'buy']
⇒ buy_at, sell_at 만 추리기
df = df[['buy_at','sell_at']]
⇒ 수익률 열을 추가해주기(return)열
⇒ return = sell_at / buy_at
df['return'] = df['sell_at']/df['buy_at']
⇒ 누적곱
df[['return']].cumprod().iloc[-1,-1] -1
def get_return(code,k):
df = fdr.DataReader(code,'2018')
df['buy_at'] = (df['High'].shift(1) - df['Low'].shift(1))*k + df['Open']
df['is_buy'] = np.where(df['buy_at'] < df['High'],'buy','')
df['sell_at'] = df['Open'].shift(-1)
df = df[df['is_buy'] == 'buy']
df = df[['buy_at','sell_at']]
df['return'] = df['sell_at']/df['buy_at']
return df[['return']].cumprod().iloc[-1,-1] -1
for k in np.arange(0.4,0.6,0.01):
print(round(k,2), get_return('005930',k))
df = pd.DataFrame()
for k in np.arange(0.4,0.6,0.01):
doc = {
'k':k,
'return':get_return('005930',k)
}
df = df.append(doc,ignore_index=True)
df.sort_values(by='return',ascending=False)
: 월요일에 사서 금요일에 파는 전략 만들기
* 요일 표기하기
⇒ date값이 처음에 index로 들어가있어서, reset후 재설정 해줘야함
df = fdr.DataReader('005930','2018')
df = df.reset_index()
df = df[['Date','Open']]
df['Date'] = pd.to_datetime(df['Date'])
df['Day'] = pd.to_datetime(df['Date']).dt.day_name()
cond = (df['Day'] == 'Monday') | (df['Day'] == 'Friday')
⇒ 월요일로 시작해서 금요일로 끝나게끔 설정
if df.iloc[0,2] == 'Friday':
df = df.iloc[1:,:] (첫번째줄 날리기)if df.iloc[-1,2] == 'Monday':
df = df.iloc[:-1,:] (마지막줄 날리기)
cond = (df['Day'] == 'Monday') & (df['Day'].shift(-1) == 'Monday')
df = df.drop(index = df[cond].index)
cond = (df['Day'] == 'Friday') & (df['Day'].shift(1) == 'Friday')
df = df.drop(index = df[cond].index)
df['Open_fri'] = df['Open'].shift(-1)
df = df[df['Day']=='Monday'].copy()
df = df[['Open','Open_fri']]
df.columns = ['buy_at','sell_at']
⇒ cumprod()
df['return'] = df['sell_at'] / df['buy_at']
df[['return']].cumprod().iloc[-1,-1] - 1
⇒ buy_at 이 0인 경우가 있었던 걸까? 0 아닌애들만 가져오기!
cond = (df['sell_at'] != 0) & (df['buy_at'] != 0)
df = df[cond]
df[['return']].cumprod().iloc[-1,-1] - 1
def get_return_mf(code):
df = fdr.DataReader(code,'2018')
df = df.reset_index()
df = df[['Date','Open']]
df['Day'] = pd.to_datetime(df['Date']).dt.day_name()
cond = (df['Day'] == 'Friday') | (df['Day'] == 'Monday')
df = df[cond]
if df.iloc[0,2] == 'Friday':
df = df.drop(index = df.index[0])
if df.iloc[-1,2] == 'Monday':
df = df.drop(index = df.index[-1])
cond = (df['Day'] == 'Monday') & (df['Day'].shift(-1) == 'Monday')
df = df.drop(index = df[cond].index)
cond = (df['Day'] == 'Friday') & (df['Day'].shift(1) == 'Friday')
df = df.drop(index = df[cond].index)
df['Open_fri'] = df['Open'].shift(-1)
df = df[df['Day']=='Monday']
df = df[['Open','Open_fri']]
df.columns = ['buy_at','sell_at']
df['return'] = df['sell_at'] / df['buy_at']
cond = (df['sell_at'] != 0) & (df['buy_at'] != 0)
df = df[cond]
return df[['return']].cumprod().iloc[-1,-1] - 1
import dart_fss as dart_fss
import pandas as pd
api_key = 'API키 입력하기'
dart_fss.set_api_key(api_key=api_key)
all = dart_fss.api.filings.get_corp_code()
df = pd.DataFrame(all)
df_listed = df[df['stock_code'].notnull()]
for row in df_listed.sample(10)[['stock_code','corp_name']].itertuples():
print(row[1], row[2])
df = pd.DataFrame()
for row in df_listed.sample(10)[['stock_code','corp_name']].itertuples():
try:
doc = {
'name' : row[2],
'return' : get_return_mf(row[1])
}
df = df.append(doc, ignore_index = True)
except:
print(f'error - {row[2]}')
df.sort_values(by='return', ascending=False)
- 1주차: Colab, 파이썬 문법
구글 Colab 이란?: 온라인에서 파이썬 데이터분석을 학습할 수 있는 환경!
파이썬: 가장 직관적인 문법을 가진 언어!
크롤링 기본 코드: requests 로 정보를 가져와서 (enter 치는 라이브러리), BeautifulSoup으로 분석하기 좋게! 만드는 것이랍니다.(잘 솎아내는 라이브러리)
- 2주차: yfinance 활용한 해외주식 분석
Pandas 판다스: 파이썬에서 데이터를 쉽게 다룰 수 있게 해주는 라이브러리
yfinance:yahoo finance를 통해 해외주식 분석
데이터를 모을 빈 DataFrame 만들기> 정보 모아서 딕셔너리 변환> 딕셔너리 형태로 append: df.append(doc,ignore_index = True)
- 3주차: dart-fss 라이브러리 활용한 국내주식 분석
OpenAPI 란?: 데이터를 가져다 쓸 수 있게 서버의 ‘창구’를 열어둔 것!
Dart-fss 라이브러리: Dart의 OpenAPI를 쉽게 사용할 수 있도록 만들어둔 코드
- 4주차: 백테스팅 기초(1) : 골든/데드크로스 전략 구현
백테스팅이란?: 이전 주가의 추이에 전략을 대입해보는 것
이동평균선:이전 며칠(3일, 5일, 20일, 50일 등) 간의 가격을 평균하여 움직이는 선!,일수가 커질수록 곡선이 완만해질 수밖에
골든크로스: 단기이평선이 장기이평선 뚫고올라올때! 주가가 높아질 가능성이 있다는 신호
데드크로스: 단기이평선이 장기이평선 뚫고내려올떄! 주가가 낮아질 가능성이 있다는 신호
shift를 가지고 열을 맞춰보기
- 5주차: 백테스팅 기초(2) : 변동성 돌파 전략 / 월-금 전략
<백테스팅 순서>(1) 원하는 종목의 주가 데이터를 가져오고 (2) 주가 데이터를 원하는 형태로 가공하기 (3) 사고 → 파는 시점을 적어두기 (4) 종가를 이용해서 수익률을 구하기 (5) 이 것을 여러 종목 또는 파라미터를 바꿔서 수행하기
변동성 돌파전략: 주식이 막 오르는 것 같다면? 일단 사자! → 그리고 내일 바로 팔자: 사야하는 가격 = (어제 최고가 - 어제 최저가) * k + 오늘 시작가