분석에 불필요한 feature 제거
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
from numpy.ma.core import size
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import kpss
# csv 파일이 들어있는 폴더 경로
folder_path = '/Users/sungsupark/Desktop/24-2수업자료/ETF_통합'
# 삭제할 열 이름
columns_to_drop = ['전일비', '시가', '고가', '저가', '거래량']
# 폴더 내의 모든 csv 파일에 대해 반복
for filename in os.listdir(folder_path):
if filename.endswith('.csv'):
file_path = os.path.join(folder_path, filename)
# csv 파일 읽기
df = pd.read_csv(file_path)
# 열 삭제
df.drop(columns=[col for col in columns_to_drop if col in df.columns], inplace=True)
if '날짜' in df.columns:
df['날짜'] = pd.to_datetime(df['날짜'], errors='coerce') # 변환 불가능한 값은 NaT로 처리
# 날짜는 오름차순으로 정렬
df = df.sort_values(by='날짜')
# 수정된 데이터프레임을 같은 파일에 저장
df.to_csv(file_path, index=False)
print("완료")
- 분석에 필요한 ‘날짜’, ‘종가’를 제외한 모든 feature 제거
‘2021/09/01’부터 ‘2024/09/20’까지 Window 자르기
import numpy as np
import pandas as pd
import os
# csv 파일이 들어있는 폴더 경로
folder_path = '/Users/sungsupark/Desktop/24-2수업자료/ETF_통합'
# 최종 csv 파일을 저장할 폴더
output_folder = os.path.join(folder_path, 'ETF_최종')
# 최종 폴더가 존재하지 않으면 생성
os.makedirs(output_folder, exist_ok=True)
# 날짜 범위 설정
start_date = '2021-09-01'
end_date = '2024-09-20'
# 폴더 내의 모든 csv 파일에 대해 반복
for filename in os.listdir(folder_path):
if filename.endswith('.csv'):
file_path = os.path.join(folder_path, filename)
# csv 파일 읽기
df = pd.read_csv(file_path)
# '날짜' 열을 datetime 형식으로 변환
if '날짜' in df.columns:
df['날짜'] = pd.to_datetime(df['날짜'], errors='coerce') # 변환 불가능한 값은 NaT로 처리
# 변환 후 null이 있는 행을 제거
df = df.dropna(subset=['날짜'])
# 2021년 9월 1일 포함 여부 확인
if df['날짜'].dt.date.isin([pd.to_datetime('2021-09-01').date()]).any():
# 날짜 범위를 설정하여 필터링
df = df[(df['날짜'] >= start_date) & (df['날짜'] <= end_date)]
# 인덱스를 리셋하고 1부터 시작하도록 설정
df.reset_index(drop=True, inplace=True)
df.index += 1 # 인덱스를 1부터 시작하도록 조정
# 수정된 데이터프레임을 새로운 폴더에 저장
output_file_path = os.path.join(output_folder, filename)
df.to_csv(output_file_path, index=False) # index=True로 설정하여 인덱스 포함
print("완료")
- 앞서 ‘윈도우 크기 맞추기’분석을 통해 모든 ETF의 window를 (2021/09/01 ~ 2024/09/20)로 결정
- 해당 window size에 맞게 window 자르기
정상성 검정 (ADF Test)
def adf_test(timeseries):
print("ADF test 결과:")
dftest = adfuller(timeseries, autolag="AIC")
dfoutput = pd.Series(
dftest[0:4],
index=[
"Test Statistic",
"p-value",
"#Lags Used",
"Number of Observations Used",
],
)
for key, value in dftest[4].items():
dfoutput["Critical Value (%s)" % key] = value
print(dfoutput)
# # p-value 0.12이므로 5% 유의수준에서 귀무가설 accept. 정상성 없음
adf_test(df['종가'])
- 정상성 검정을 위한 함수 생성
- 시계열 데이터의 정상성을 검정하는 방법 중 하나인 ‘ADF Test’로 정상성 검정 진행
- ADF Test을 했을 때, 해당 데이터는 비정상 시계열 데이터라는 결론에 도달
정상성 검정 (KPSS Test)
def kpss_test(timeseries):
print("KPSS test 결과:")
kpsstest = kpss(timeseries, regression="c", nlags="auto")
kpss_output = pd.Series(
kpsstest[0:3], index=["Test Statistic", "p-value", "Lags Used"]
)
for key, value in kpsstest[3].items():
kpss_output["Critical Value (%s)" % key] = value
print(kpss_output)
# KPSS test는 ADF test과 결과 해석이 반대
# p-value 0.01이므로 5% 유의수준에서 귀무가설 reject. 정상성 없음
kpss_test(df['종가'])
- 정상성 검정을 위한 함수 생성
- 시계열 데이터의 정상성을 검정하는 방법 중 하나인 ‘KPSS Test’로 정상성 검정 진행
- KPSS Test을 했을 때, 해당 데이터는 비정상 시계열 데이터라는 결론에 도달
정상성 보장을 위한 변환 (종가 → 일별 수익률)