python5

o__o·2022년 6월 1일
0

python

목록 보기
5/5

<백테스팅 순서>

⇒ (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 + 오늘 시작가

  1. 여기서 0.5는 k 값이라고 불리는데, 적당히 넣어준다. (통상 0.4~0.6)
  2. 즉, 105,000 + 10,000 = 115,000원이 되면 산다. 오르는 분위기 라고 판단.
  3. 역시 오르는가 싶더니 오늘 마감 때 130,000원이 됐다.
  4. 내일 바로 판다.

→ 수익: 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

<함수:최적의 K값 구하기>

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

⇒ k가 0.4부터 0.6까지 0.01씩 상승하는걸 반복!

for k in np.arange(0.4,0.6,0.01):
  print(round(k,2), get_return('005930',k))

⇒ dataframe 만들어서 내림차순 정렬하기

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']]

⇒ date를 date속성으로 바꾸기

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,:] (마지막줄 날리기)

cf. 휴일 고려하기

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

<엣지 케이스 없애기:inf나온다!(무한대)>

⇒ 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

<dart fss 최적화 종목 찾기>

* 종목 가져오기

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])

* dataframe만들기

 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)

과제

5주차 과정 총 정리!

  • 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 + 오늘 시작가

0개의 댓글