Search

파이썬 코드 (1)

# 설치 필요 라이브러리 (최초 1회 실행) # pip install yfinance pytrends pandas openpyxl matplotlib seaborn import pandas as pd import yfinance as yf from pytrends.request import TrendReq import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime, timedelta import os # 📥 1. 엑셀에서 티커 불러오기 tickers_df = pd.read_excel("tickers.xlsx") # <- 파일명에 맞게 수정 tickers = tickers_df['Ticker'].dropna().unique().tolist() # 📆 2. 수집 기간 설정 end_date = datetime.today() start_date = end_date - timedelta(days=365) # 📈 3. 주가 데이터 수집 price_df = yf.download(tickers, start=start_date, end=end_date)['Close'] price_df.dropna(inplace=True) # 🔍 4. Google Trends 데이터 수집 pytrends = TrendReq() keyword_map = { 'AAPL': 'Apple', 'NFLX': 'Netflix', 'PLTR': 'Palantir', 'META': 'Meta', 'AMZN': 'Amazon', # 필요한 종목 키워드 직접 추가 } search_df = pd.DataFrame() for ticker in tickers: keyword = keyword_map.get(ticker, ticker) pytrends.build_payload([keyword], cat=0, timeframe='today 12-m') trend = pytrends.interest_over_time().drop(columns='isPartial', errors='ignore') trend.rename(columns={keyword: ticker}, inplace=True) search_df = pd.concat([search_df, trend[ticker]], axis=1) # 🧪 5. 분석 시작 results = [] for ticker in tickers: df = pd.DataFrame({ 'price': price_df[ticker], 'search_volume': search_df[ticker] }).dropna() # 이벤트 스터디 event_window = 5 threshold = 85 event_dates = df[df['search_volume'] > threshold].index event_returns = [] for event_date in event_dates: window = pd.date_range(event_date - timedelta(days=event_window), event_date + timedelta(days=event_window)) window_data = df.loc[df.index.isin(window)] if len(window_data) == 2 * event_window + 1: base_price = window_data.iloc[event_window]['price'] returns = (window_data['price'] - base_price) / base_price * 100 returns.index = range(-event_window, event_window + 1) event_returns.append(returns) mean_return = pd.DataFrame(event_returns).mean() if event_returns else pd.Series(dtype=float) # 시차 상관 분석 max_lag = 5 best_lag = 0 best_corr = 0 for lag in range(max_lag + 1): shifted = df['search_volume'].shift(lag) corr = shifted.corr(df['price']) if corr > best_corr: best_corr = corr best_lag = lag # 요약 label = '밈형' if best_corr > 0.3 and len(mean_return) > 0 and mean_return.loc[1:].mean() > 1 else '버핏형' results.append({ 'Ticker': ticker, '이벤트 평균 수익률(1~5일)': round(mean_return.loc[1:].mean(), 2) if not mean_return.empty else None, '최고 상관 시차(days)': best_lag, '최고 상관계수': round(best_corr, 3), '분류': label }) # 💾 6. 결과 저장 result_df = pd.DataFrame(results) result_df.to_excel("분석결과_요약.xlsx", index=False) print("✅ 분석 완료! '분석결과_요약.xlsx' 파일을 확인하세요.")
Python
복사

데이터 수집 단계

1. 티커(Ticker) 리스트 불러오기

tickers.xlsx 파일에서 'Ticker' 컬럼을 읽어와서 리스트로 변환해.
빈 값은 제거하고, 유니크한 값만 사용.

2. 수집 기간 설정

오늘 날짜 기준 최근 1년 (365일) 동안의 데이터를 수집해.

3. 주가 데이터 수집

yfinance를 이용해 종목들의 '종가(Close price)' 를 가져옴.
중간에 빈 데이터가 있으면 (dropna) 삭제함.

4. Google Trends 검색량 수집

pytrends 라이브러리로 각 종목에 대응하는 키워드 검색량 수집.
종목에 대응하는 키워드는 keyword_map 딕셔너리로 매칭함.
트렌드 데이터는 모두 합쳐서 search_df에 저장.

분석 단계

5. 이벤트 스터디 (검색량 급등 시 주가 반응 분석)

검색량이 85 이상인 시점을 이벤트로 정의.
이벤트 발생일 기준으로 앞뒤 5일 윈도우 설정.
이벤트 발생 전후 주가 수익률(%)을 계산해서 평균값을 구함.

6. 시차 상관관계 분석 (Lag Correlation)

0~5일까지 검색량을 시프트해서 주가와 상관계수 계산.
가장 높은 상관계수를 가지는 시차(lag)와 그 값을 저장.

분류 기준

종목을 두 가지로 분류:
'밈형':
검색량과 주가의 상관계수 > 0.3 이고
이벤트 스터디에서 1~5일 수익률 평균 > 1% 인 경우
'버핏형': 그 외 경우.