본문 바로가기

Upstage AI Lab 2기

Upstage AI Lab 2기 [Day067] ML Advanced - CH02. 파생 변수 만들기 실습(1)

Upstage AI Lab 2기
2024년 3월 19일 (화) Day_067

 

Yahoo Finance OHLCV를 이용한 파생변수 만들기 실습

 

Stpe 1. target 값 설정

이 실습은 다음날의 종가를 예측하는 것이 목표이다.

OHLCV_data["Target"] = OHLCV_data.groupby("code")["Close"].shift(-1)

shift(-1)를 이용해 하루 뒤 종가를 target 컬럼으로 만든다.

 

이 외에도 target으로 선택할 수 있는 것들은 다음과 같다.

 - 30일 뒤 종가

 - up/down 분류 (이진 분류 문제)

 - 상승 비율 등

 

Stpe 2. 파생 변수 생성

  • 가격 방향 (Price Direction) : if 'Close' > 'Open' then 1, else -1
    OHLCV_data["PriceDirection"] = OHLCV_data.apply(lambda row: 1 if row["Close"] > row["Open"])​​
    lambda를 row 단위로 활용 할 수 있다는 것을 알게 됨.

  • 일일 투자 수익률 (Daily Return)  = ((다음날종가/현재종가) - 1)*100
    1. 수익률 수식을 이용하는 방식
    (OHLCV_data["Close"]/OHLCV_data.shift(1) - 1)*100​​

    2. pct_change - 행과 행 사이의 차이 계산
    OHLCV_data["DailyReturn"] = OHLCV_data.groupby("code")["Close"].trasfrom(lambda x: x.pct_change()*100)
    중요한 부분 : OHLCV 데이터는 여러 종목에 대한 데이터 이기때문에 반드시 .groupby('code')를 적용한 뒤 종가에 대한 pct_change()를 적용해야 한다.

  • 이동평균 (Moving Average) - Simple Moving Average
    rolling(window = int)
    OHLCV_data["MA5d"] = OHLCV_data.groupby("code")["Close"].transform(lambda x: x.rolling(window=5).mean())
    OHLCV_data["MA20d"] = OHLCV_data.groupby("code")["Close"].transform(lambda x: x.rolling(window=20).mean())
    OHLCV_data["MA60d"] = OHLCV_data.groupby("code")["Close"].transform(lambda x: x.rolling(window=60).mean())
    OHLCV_data["MA120d"] = OHLCV_data.groupby("code")["Close"].transform(lambda x: x.rolling(window=120).mean())
    note1. Moving Average는 Simple Moving Average와 Exponential Moving Average 두 가지가 있다.
    note2. 이동평균을 구할 수 없는 구간 때문에 결측치가 생기기 때문에 이 실습에서는 다음과 같이 처리
    comp_data = OHLCV_data[OHLCV_data["code"] == "종목번호"].copy()
    
    comp_data = comp_data[
    	comp_data["MA5d"].notnull() & 
    	comp_data["MA20d"].notnull() & 
    	comp_data["MA60d"].notnull() & 
    	comp_data["MA120d"].notnull()
    ]​
    추후 보완할 내용 : 이동평균선 그리는 코드 - 다른 종목으로 직접 테스트해보고 싶음

 

  • 볼린저 밴드 (Bollinger bands)
    • 상단 볼린저 밴드 : 20일 이동평균 + (k × 표준편차)
    • 하단 볼린저 밴드 : 20일 이동평균 - (k × 표준편차)
      k = 2
      
      std = OHLCV_data.groupby("code")["Close"].transform(lambda x : x.rolling(20).std())
      
      OHLCV_data["UpperBollingerBand"] = OHLCV_data["MA20d"] + (k * std)
      OHLCV_data["LowerBollingerBand"] = OHLCV_data["MA20d"] - (k * std)​
      추후 보완할 내용 : 볼린저밴드 그리는 코드 - 다른 종목으로 직접 테스트해보고 싶음
      질문 : k는 내가 임의로 설정하는 값인지, 주식분석에서 사용하는 정해진 계수가 있는지.

 

  • MACD (Moving Average Convergence & Divergence) = 12일 지수이동평균 - 26일 지수이동평균
    지수이동평균 (Exponential Moving Average) : 최근 관측치에 대해 높은 가중치를, 과거 관측치에 낮은 가중치를
    • .ewm(span=int, adjust=False).mean()
      OHLCV_data["ShortEMA"] = OHLCV_data.groupby("code")["Close"].ewm(span=12, adjust=False).mean()
      OHLCV_data["LongEMA"] = OHLCV_data.groupby("code")["Close"].ewm(span=26, adjust=False).mean()

 

확인할 것 : merge에서 how= 파라미터에 들어가는 값(inner, left, etc.)에 따른 join 방식 한번 더 체크하기