Data Analysis/Python for DA 17

[Machine Learning] train_test_split, Scaler, 데이터 불균형처리

1. train_test_split() 함수의 stratify 옵션데이터의 비율을 유지하면서 훈련/테스트 세트를 나누도록 해주는 기능 1) stratify 없는 경우 x_train, x_test, y_train, y_test = train_test_split( iris.drop('class', axis =1), iris['class'], test_size = 0.2, random_state=1000) 소수 클래스가 훈련 또는 테스트 셋에 거의 안 들어갈 수도 있음 2) stratify 있는 경우x_train, x_test, y_train, y_test = train_test_split( iris.drop('class',axis=1), iris['class'], te..

[Machine Learning] 이상치(Outliers)

1. 이상치 탐색1) IQR이란?IQR은 데이터에서 중간 50%의 범위를 나타내는 값으로, Q3 (3사분위수)에서 Q1 (1사분위수)를 뺀 값.IQR = Q3 - Q1Q1 (1사분위수): 전체 데이터를 작은 순서대로 정렬했을 때, 하위 25% 지점의 값Q3 (3사분위수): 전체 데이터 중 상위 75% 지점의 값2) 이상치 판별 기준IQR을 이용해서 이상치 경계 잡기:하한 (Lower bound) = Q1 - 1.5 × IQR상한 (Upper bound) = Q3 + 1.5 × IQR이 범위 밖의 값들을 이상치로 본다. 1.5라는 계수는 보통 사용되는 기준이지만, 더 민감하거나 덜 민감하게 하고 싶으면 값을 조절할 수 있음 (예: 2.0, 3.0 등). 3) 이상치 판별 코드1. 박스플랏 사용해서 이상치 ..

[Machine Learning] 비지도학습(군집화 중 K-Means)

1. K-Means 이론 설명Random Initialization Trap 문제로 K-Means++ 방법을 씀최적의 K를 찾기 위해 Elbow Method를 사용함     2. K-Means 코드 흐름1) 비지도 학습은 정답이 없는 데이터이기 때문에 데이터셋에 있는 열들을 모두 독립변수 X로 가져온다X = dataset.iloc[:, :].values# X = dataset.values# X = dataset.to_numpy() # 공식 홈페이지 권장 2) 전체 데이터 분포를 확인한다.plt.scatter(X[:, 0], X[:, 1]) # x축 : hour, y축 : scoreplt.title('Score by hours')plt.xlabel('hours')plt.ylabel('score')plt.s..

[Machine Learning] 지도학습(회귀/분류)

출처: 나도코딩 '머신러닝' 1. Linear Regression 1) 기본X = dataset.iloc[:, :-1].values # 처음부터 마지막 컬럼 직전까지의 데이터 (독립 변수 - 원인)y = dataset.iloc[:, -1].values # 마지막 컬럼 데이터 (종속 변수 - 결과)from sklearn.linear_model import LinearRegressionreg = LinearRegression() # 객체 생성reg.fit(X, y) # 학습 (모델 생성)y_pred = reg.predict(X) # X 에 대한 예측 값# 값들 확인하는 방법reg.predict([[9]]) #9시간 공부했을 때 예상 점수 reg.coef_ # 기울기 (m)reg.intercept_ # y 절..

[Invest Class] 5. Relative Momentum 전략 함수 생성

1. Relative Momentum 전략 매달 모든 종목의 수익률을 계산하여 수익률 기준 상위 n개 종목을 고르고, 그 상위권에 들어온 종목은 신호 발생이라고 보고 매수 대상이 된다. 다음 달에도 그 종목이 상위권에 계속 포함되면 매수를 유지하고 상위권에서 탈락하면 매도한다. *os.listdir('./DATA')files = glob('./DATA/*.csv')첫쨰줄 : 폴더 안에 있는 모든 파일과 폴더 이름을 리스트 형태로 출력 ex) ['AAPL.csv', 'TSLA.csv', 'MSFT.csv']둘째줄 : glob()은특정 패턴에 맞는 파일 이름들을 리스트로 반환하는 함수 ex) ['./DATA/AAPL.csv', './DATA/TSLA.csv', './DATA/MSFT.csv']for file..

[Invest Class] 4. Absolute Momentum 전략 함수 생성

1. Absolute Momentum 전략자산의 절대적인 수익률을 기준으로 투자 여부를 결정하는 방식으로 특정 자산의 과거 수익률이 양이면 매수하고, 음이면 매수하지 않는다.여기에서는 '전월의 수정종가 / 전년도의 수정종가) - 1'를 인덱스로 설정하고 0보다 클때 매수하는 전략 *try-except 구조test_df = pd.DataFrame()for year in range(1980, 2026): # 년도를 반복 for month in range(1, 13): # 월을 반복 try: idx = f"{year}-{month}" df2 = df.loc[idx].tail(1) test_df = pd.concat( [test_df,..

[Invest Class] 3. Halloween 투자 전략 함수 생성

1. Halloween 투자 전략11월 첫날에 시작 각격으로 구매하여 4월 마지막날에 종가로 판매하는 투자 전략(투자 전략이랄 것도 없는 ㅎㅎ..!) 재미용으로 봐주세요! *시계열 데이터에서 시간을 합하는 방법from dateutil.relativedelta import relativedeltastart = datetime(year = 2000, month=11, day=1)start + relativedelta(months=5) * datime객체를 다시 문자열로 바꿔서 loc을 걸어주는 이유halloween_df = pd.DataFrame()for i in range(2000, 2011): start = datetime(year = i, month =11, day =1) end = star..

[Invest Class] 2. Bollinger 함수 생성

1. bollinger 밴드 투자 전략하단 밴드보다 이하로 가격이 떨어지면 매수, 상단 밴드보다 이상으로 가격이 오르면 매도하는 투자 전략 *이동 평균선 생성하기1) 반복문 이용하기df2['center'] = np.nanfor i in range(19, len(df2)): mean_data = df2.iloc[i-19:i+1,0].mean() df2.iloc[i, 1] = mean_datadf2주의할 것!! 오류 났던 이유: df2.iloc[i-19:i,0] 이라고 적었었음 slicing[start:end]는 end가 exclusive 함!!즉 df.iloc[row , column] 이고 row랑 column을 슬라이싱으로 표현할 때 a: b 라면 a부터 b-1까지 포함  2) rolling(..

[Invest Class] 1. buyandhold 함수 생성

1. buyandhold : 매수 후 일정 기간 동안 유지한 뒤 매도하여 수익률 구하기 * Adj Close를 사용하는 이유:adjusted close는 기업의 주식 분할, 배당금 지급 등의 이벤트를 반영해서 조정한 가격이다. 과거 주식의 수익률을 계산하거나 시계열 데이터 분석 및 포트폴리오 수익률 계산 시 사용되어지고 배당과 주식분할 등의 이벤트를 반영한 '실제 투자자가 체감한 수익률 기준'의 가격이다. *  일별 수익률 구할때 주의점:오늘의 수정종가/ 전날의 수정종가 식으로 구할때 첫번째 데이터는 이전날의 데이터가 없기때문에 결측치 발생->AAPL['daily_rtn'] = \ (AAPL['Adj Close'] / AAPL['Adj Close'].shift()).fillna(1) * 수익률/ 누..

[pymysql] SQL과 Python 연결

1. _db =pymysql.connect( host = os.getenv('host'), port = int(os.getenv('port')), user= os.getenv('user'), db = os.getenv('db_name')) host : MySQL 서버가 실행 중인 컴퓨터 주소(IP 또는 도메인)port : MySQL이 사용하는 네트워크 포트 (기본값: 3306)user :MySQL에 접속할 때 사용할 사용자 계정 (예: root, admin 등)charset : 문자 인코딩 방식 (한글 지원을 위해 utf8mb4 권장)  2. cursorcursor = _db.cursor(pymysql.cursors.DictCursor)cursor.execute(select_sql)..