분석에 불필요한 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("완료")

‘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("완료")

정상성 검정 (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['종가'])

정상성 검정 (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['종가'])

정상성 보장을 위한 변환 (종가 → 일별 수익률)