반응형
클로드를 이용해 내가 관심있는 기업들의 최근 1년간 주가 변동폭을 그래프로 출력해봤다.
난 아직 코딩 1도 모른다.
그냥 프로그램 설치하고 챗GPT나 클로드 같은 곳에 요청사항을 전달해 출력된 코드를 입력할 뿐이다.
내가 요청한 사항
편집 안녕. 파이썬과 여러 라이브러리를 이용해서 다음 정보를 얻고 싶어
기업 티커 : AAPL, MSFT, NVDA, GOOG, META, PLTR 2. 위 기업들의 1년 주가 흐름을 그래프로 표시해주고 각 기업별 고점 대비 하락폭이 몇 %인지 표시해주면 좋겠어. 파이썬과 라이브러리(pandas,matplotlib,yfinance) 등을 이용해 코드를 짜줄래?
출력된 코드
#출력에 필요한 라이브러리(yfinance pandas matplotlib) 설치
pip install yfinance pandas matplotlib
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick
from datetime import datetime, timedelta
import numpy as np
# 분석할 기업 티커 리스트
tickers = ['AAPL', 'MSFT', 'NVDA', 'GOOG', 'META', 'PLTR']
# 날짜 설정 (오늘로부터 1년 전)
end_date = datetime.now()
start_date = end_date - timedelta(days=365)
# 각 티커의 주가 데이터를 저장할 빈 DataFrame 생성
df = pd.DataFrame()
# 각 티커별로 데이터 가져오기
for ticker in tickers:
try:
# 데이터 다운로드
data = yf.download(ticker, start=start_date, end=end_date)
if data.empty:
print(f"{ticker}: 데이터를 가져오지 못했습니다.")
continue
# 가능한 열 이름들
possible_columns = ['Adj Close', 'Close', 'adj close', 'close']
# 사용 가능한 열 찾기
column_found = False
for col in possible_columns:
if col in data.columns:
# 해당 열을 티커 이름으로 DataFrame에 추가
df[ticker] = data[col]
print(f"{ticker}: '{col}' 열을 사용합니다.")
column_found = True
break
# 열을 찾지 못한 경우 첫 번째 열 사용
if not column_found and len(data.columns) > 0:
df[ticker] = data[data.columns[0]]
print(f"{ticker}: 대안으로 '{data.columns[0]}' 열을 사용합니다.")
elif not column_found:
print(f"{ticker}: 적합한 열을 찾지 못했습니다. 사용 가능한 열: {data.columns.tolist()}")
except Exception as e:
print(f"{ticker} 처리 중 오류 발생: {str(e)}")
# 데이터가 비어있는지 확인
if df.empty:
print("모든 티커에서 데이터를 가져오지 못했습니다. 네트워크 연결을 확인하거나 다른 티커를 시도해보세요.")
else:
try:
# 혹시 모를 NaN 값 처리
df = df.dropna(how='all') # 모든 값이 NaN인 행 제거
# 유효한 데이터가 있는지 확인
if df.empty or df.isnull().all().all():
print("유효한 데이터가 없습니다.")
else:
# 가격 정규화 (첫날 가격을 100으로 설정하여 상대적 변화를 볼 수 있게 함)
normalized_df = df.div(df.iloc[0]) * 100
# NaN 값 제거
normalized_df = normalized_df.dropna(axis=1, how='any')
if normalized_df.empty:
print("정규화 후 유효한 데이터가 없습니다.")
else:
# 고점 대비 하락폭 계산
valid_columns = normalized_df.columns
peak_values = df[valid_columns].max()
current_values = df[valid_columns].iloc[-1]
drawdown_percentage = ((peak_values - current_values) / peak_values * 100).round(2)
# 그래프 그리기
plt.figure(figsize=(12, 8))
# 색상 목록 생성
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b']
# 정규화된 주가 그래프 그리기
for i, ticker in enumerate(valid_columns):
plt.plot(normalized_df.index, normalized_df[ticker],
label=f'{ticker}', linewidth=2, color=colors[i % len(colors)])
# 그래프 설정
plt.title('Changes in stock prices over the past year', fontsize=16) # 제목 변경
plt.xlabel('Year', fontsize=14)
plt.ylabel('Relative Stock Price (%)', fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter())
# 범례 추가 (고점 대비 하락폭 퍼센트만 표기)
legend_labels = [f'{ticker}: {drawdown_percentage[ticker]:.2f}%' for ticker in valid_columns] # 범례 변경
plt.legend(legend_labels, loc='best', fontsize=12)
# 날짜 형식 조정
plt.gcf().autofmt_xdate()
# 그래프 테두리 설정
plt.box(True)
# 최종 프로세싱된 데이터 출력
result_df = pd.DataFrame({
'Current Price': current_values,
'Peak Price': peak_values,
'Drawdown (%)': drawdown_percentage
})
print("\n==== 주요 기업 고점 대비 하락폭 분석 ====")
print(result_df)
# 그래프 보여주기
plt.tight_layout()
plt.show()
except Exception as e:
print(f"데이터 처리 중 오류 발생: {str(e)}")
print("오류 디버깅 정보:")
print(f"DataFrame 내용: {df.head() if not df.empty else '비어 있음'}")
print(f"DataFrame 열: {df.columns.tolist() if not df.empty else '없음'}")
출력물
확실히 matplotlib 같은 라이브러리를 이용해서 엑셀보다 시각적으로 우수한 그래프를 도출할 수 있다.
반응형
댓글