5주에 걸친 코딩클럽이 드디어 마무리됐다
이번주에 배운 내용은 백테스팅을 활용하여 주식의 변동 추이를 확인하는 내용이었다
!pip install yfinance pandas-datareader finance-datareader
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
필요한 라이브러리들은 이렇게!
이젠 numpy, pandas, yfinance는 익숙해졌다ㅎㅎ
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['High'] > df['buy_at'], 'buy', '')
df['sell_at'] = df['Open'].shift(-1)
df = df[df['is_buy'] == 'buy']
df['return'] = df['sell_at'] / df['buy_at']
return df[['return']].cumprod().iloc[-1, -1] - 1
2018년도의 기업의 코드명을 입력하면 최종 수익률을 구해주는 함수이다
전날의 상한가 - 전날의 하한가에 k(0.4~0.6)을 곱한 변동성만큼 오늘 주가가 상승하면 사는 전략이다
get_return('005930', 0.4)
이러한 전략을 취했을 때 삼성전자의 최종 수익률은 2.245
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)
이번에는 이러한 전략 중 최적의 k를 찾는 함수이다
최적의 k는 0.4로 이 때의 수익률은 2.245이다
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])
cond2 = (df['Day'] == 'Monday') & (df['Day'].shift(-1) == 'Monday')
df = df.drop(index = df[cond2].index)
cond3 = (df['Day'] == 'Friday') & (df['Day'].shift(1) == 'Friday')
df = df.drop(index = df[cond3].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']
cond4 = (df['sell_at'] != 0) & (df['buy_at'] != 0)
df = df[cond4]
return df[['return']].cumprod().iloc[-1, -1] - 1
월요일에 주식을 구매해서 금요일에 파는 단순 전략을 취했을 경우 수익률을 계산해주는 함수이다
get_return_mf('005930')
삼성전자의 경우 위 전략을 실행했을 때 0.342의 수익률이 나온다
!pip install dart_fss
dart의 자료를 활용할 것이기 때문에 dart_fss를 불러온다
import dart_fss as dart_fss
import pandas as pd
api_key = 'f8fd5b8dff7df55cdac5b90b97da789fb3c447f3'
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()]
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)
dart에 공시된 기업을 월요일에 사서 금요일에 파는 전략을 취했을 경우의 수익률을 내림차순으로 정렬했다
가온칩스라는 회사의 수익률이 0.646으로 가장 높다
마지막 수업까지 완주해서 뿌듯하다
중간에 설날도 있고 개인적인 사정도 있어 끝까지 완주하지 못할 것을 걱정했는데 무사히 마무리해서 감사하다
'[데이터분석]SpartaCodingClub' 카테고리의 다른 글
넷째주_백테스팅 (0) | 2023.01.31 |
---|---|
Python 셋째주_DART 데이터 활용하기 (0) | 2023.01.19 |
Python 둘째주_해외주식 분석 (0) | 2023.01.16 |
Python 첫째주_파이썬 기초 (0) | 2023.01.04 |