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
lambda를 row 단위로 활용 할 수 있다는 것을 알게 됨.OHLCV_data["PriceDirection"] = OHLCV_data.apply(lambda row: 1 if row["Close"] > row["Open"])
- 일일 투자 수익률 (Daily Return) = ((다음날종가/현재종가) - 1)*100
1. 수익률 수식을 이용하는 방식
(OHLCV_data["Close"]/OHLCV_data.shift(1) - 1)*100
2. pct_change - 행과 행 사이의 차이 계산
중요한 부분 : OHLCV 데이터는 여러 종목에 대한 데이터 이기때문에 반드시 .groupby('code')를 적용한 뒤 종가에 대한 pct_change()를 적용해야 한다.OHLCV_data["DailyReturn"] = OHLCV_data.groupby("code")["Close"].trasfrom(lambda x: x.pct_change()*100)
- 이동평균 (Moving Average) - Simple Moving Average
rolling(window = int)
note1. Moving Average는 Simple Moving Average와 Exponential Moving Average 두 가지가 있다.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())
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()
- .ewm(span=int, adjust=False).mean()
확인할 것 : merge에서 how= 파라미터에 들어가는 값(inner, left, etc.)에 따른 join 방식 한번 더 체크하기
'Upstage AI Lab 2기' 카테고리의 다른 글
Upstage AI Lab 2기 [Day069] ML Advanced - CH04 ML 기본모델 ~ CH05 ML 심화모델 (0) | 2024.03.21 |
---|---|
협업을 위한 깃 복습 (0) | 2024.03.21 |
Upstage AI Lab 2기 [Day067] ML Advanced - CH02. 파생 변수 생성 ~ CH03. 변수 선택 (0) | 2024.03.18 |
Upstage AI Lab 2기 [Day066] ML Advanced - CH01. 데이터 전처리 (0) | 2024.03.18 |
Upstage AI Lab 2기 [Day062] (0) | 2024.03.12 |