Search

24.08.23 유한양행과 렉라자

본 글은 데이터 분석 방법론을 설명하기 위해 작성되었으며, 어떠한 형태로도 투자 권유를 목적으로 하지 않습니다. 제공된 분석 기술은 수익을 보장하지 않으며, 본 글에 언급된 어떠한 종목도 투자를 권유하는 것이 아님을 명시합니다. 분석 내용의 적용으로 인한 모든 결과에 대한 책임은 독자 본인에게 있습니다.
오늘 수행하는 분석을 수행하기 위해서는 StartUP QUANT의 Class 04까지 완료가 되어 있어야 합니다.
오늘(2024년 8월 23일) 전체적으로 알 수 없는 시장의 흐름속에, 유한양행이 급등하고 있습니다.
유한양행 관련해서는 폐암약 렉라자가 미FDA에서 통과된 것으로 기사가 나왔습니다.
기사는 몇 일 전에 본 것 같은데 주가는 오늘 급등을 했습니다.
왜? 호재가 나온날 오르지 않고 지금 올랐을까요.
주식 관련해서는, 우리가 정보를 아는 순간 이미 늦은거란 말이 있습니다.
뭐 어쨋든, 호재와 주가의 흐름을 살펴 보는 것에 목표가 있습니다.
우선 구글 트렌드를 통해 렉라자 검색 트렌드를 확인해봅니다.
오늘 일자로 최근 90일간의 ‘렉라자’ 검색 트렌드를 분석해보면 다음과 같습니다.
가장 관심이 높았던 날은 24년 8월 20일이네요. 눈에 뛰는 건, 6월에도 트렌드 수치가 올랐었다는 점입니다.
트렌드 결과를 다운로드 합니다.
다운로드 받은 파일의 컬럼 헤더를 Date와 trend로 수정해서 저장합니다.
Date의 첫 글자를 대문자 D로 처리 필요합니다.(주가 데이터와 Merge를 위해)
수정한 파일을 아래 첨부합니다.
20240823_렉라자_구글트렌드.csv
1.3KB
위에서 첨부한 csv 파일을 다운로드 합니다.
Class01에서 만든 파이썬 프로젝트(myStartUPQuant)에 20240823_유한양행_렉라자.py 파일을 신규로 생성합니다.
20240823_유한양행_렉라자.py의 기본 골격은 Class 04의 preprocessingMA.py와 같습니다.
20240823_유한양행_렉라자.py의 코드를 다음과 같이 작성합니다.
주의! 해당 파이썬 파일이 존재하는 경로에, 위에 첨부한 20240823_렉라자_구글트렌드.csv 파일이 같이 존재해야 합니다.
# QUANTLive\20240823_유한양행_렉라자.py # Class04의 prepreocessingMA 의 내용을 기본으로 합니다. import pandas as pd import fdrCommon import matplotlib.pyplot as plt import numpy as np # 과학 계산을 위해 사용, 대규모 다차원 배열과 행렬 연산에 최적화된 기능을 제공 pd.set_option('display.max_columns', None) # df(Dataframe) 출력시 모든 컬럼 출력하도록 처리 pd.set_option('display.width', 1000) # df(Dataframe) 출력시, 한 로우가 따로 출력되지 않도록 충분한 길이 설정 def preprocessing_MA(df): # 현재 df의 Date 컬럼이 인덱스이자 Date 형태 값으로 구성되어 있음 # 이 경우, 차트로 그릴때 휴일을 알아서 건너뛰고 나오므로, Date를 일부러 문자로 변환 처리 # 인덱스는 순번으로 재처리 df.index = df.index.strftime('%Y-%m-%d') # 'Date' 인덱스를 문자열로 변환 df.reset_index(drop=False, inplace=True) # 인덱스는 순번 재처리(Date 컬럼이 일반 컬럼으로 변경됨) df['MA20'] = df['Close'].rolling(window=20).mean() # 20일 이동평균 df['MA60'] = df['Close'].rolling(window=60).mean() # 60일 이동평균 df['MA120'] = df['Close'].rolling(window=120).mean() # 120일 이동평균 df['MA200'] = df['Close'].rolling(window=200).mean() # 200일 이동평균 return df # 변경: df_google 추가함. def DrawChart(df, showDays): # df의 내용을 시각화합니다. df = df.tail(showDays).copy() # df에서 최근 몇 개의 데이터만 잘라냅니다. # 차트와 서브플롯 생성 fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': [4, 1]}) # 'Close' 및 이동평균을 ax1에 표시 ax1.plot(df['Date'], df['Close'], label='Close', color='black') ax1.plot(df['Date'], df['MA20'], label='MA20', color='red', alpha=0.7) ax1.plot(df['Date'], df['MA60'], label='MA60', color='green', alpha=0.7) ax1.plot(df['Date'], df['MA120'], label='MA120', color='blue', alpha=0.7) ax1.plot(df['Date'], df['MA200'], label='MA200', color='purple', alpha=0.7) ax1.legend(loc='upper left') ax1.set_title('Stock Price and Moving Averages') ax1.set_ylabel('Price') # 변경-5: ax1_twin에 구글 트렌드를 같이 그려주기 ax1_twin = ax1.twinx() ax1_twin.plot(df['Date'],df['trend'],label='Google Trend',color='orange') ax1_twin.legend(loc='lower left') # 'Volume'을 ax2에 표시 ax2.bar(df['Date'], df['Volume'], color='gray', alpha=0.8) ax2.set_ylabel('Volume') # xtick이 너무 많아서 안보이므로 10개만 보이도록 처리. day_xticks = np.linspace(0, len(df['Date']) - 1, 10, dtype=int) ax1.set_xticks(day_xticks) ax1.set_xticklabels(df['Date'].iloc[day_xticks]) ax2.set_xticks(day_xticks) ax2.set_xticklabels(df['Date'].iloc[day_xticks]) plt.show() # 변경-1: Symbol을 유한양행의 종목코드로 변경 symbol = "000100" # 유한양행 df = fdrCommon.getPriceHistory(symbol, '', 200) # fdr공통모듈을 통해 티커의 주가 정보 가져오기 df_MA = preprocessing_MA(df) print(df_MA.head(10)) # 변경-2: 20240823_렉라자_구글트렌드.csv 파일 읽어들이기. df_google = pd.read_csv('20240823_렉라자_구글트렌드.csv', encoding='cp949') print(df_google.head(10)) # 변경-3: df_MA와 df_google을 Date 컬럼을 기준으로 병합 # how='left'는 df_MA의 모든 데이터를 유지하고 해당하는 df_google의 데이터를 추가함 # on='Date'는 두 DataFrame이 'Date' 컬럼을 기준으로 병합됨을 의미함 df_MA_merged = df_MA.merge(df_google[['Date', 'trend']], on='Date', how='left') print(df_MA_merged.head()) # 병합된 데이터의 처음 몇 줄을 출력하여 확인 # 변경-4: df_MA_merged 를 넘기도록 변경 DrawChart(df_MA_merged, 200)
SQL
복사
위 파이썬 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다.
오렌지 색이 구글 트렌드 수치입니다.
이처럼 파이썬을 이용하면 생각보다 쉽게(?) 구글 트렌드와 주가 흐름을 겹쳐서 확인할 수 있습니다.