[데이터분석]SpartaCodingClub

마지막주_백테스팅(2)

dowon 2023. 2. 3. 12:24

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으로 가장 높다

 

마지막 수업까지 완주해서 뿌듯하다

중간에 설날도 있고 개인적인 사정도 있어 끝까지 완주하지 못할 것을 걱정했는데 무사히 마무리해서 감사하다