cs

Intro.

힘들고 피곤하구만. 

연차인데 회사에서 담주에 할 업무들이 눈에 아른거리고, 새로운거 생기고, 계획처럼 되는건 없고, 모두가 힘들고 (왜 그를까, 무슨생각일까 진짜 정말루?)

마라톤 하려고, 일부러 숙소잡고 왔는데, 개판이고 돈날리고, (낼 뛰면서 다 스트레스 풀려라, 마라톤 후기 까먹지 말자)

연말인데 이게 뭔가 싶기도하고? (외로워서 그른가)

꽃집, 카페, 빵집, 맥날 차리고싶다

 

좋은날은 언제 올까?..

어떤게 좋은날일까~

 


 

지난 시간에 우린 데이터를 모으고, 예측하는 방식도 살짝 맛도 봤다. 

 

예측은 일단 담에 해보고, 데이터를 통해서 한번 보고싶은게 생겼다. 

 

트럼프 재선과 S&P500의 섹터별 움직임을 한번 들여다보고 천천히 나아가보자. 

 

데이터 셋은 그대로 전에 가지고 온 데이터 셋을 활용할거다. 

https://simbbo-blog.tistory.com/239

 

[Python_stock] S&P 500 주가 데이터 수집

Intro. 드디어 이제야 정상적인 글을 쓴다.역시 스터디 해야 공부하지.혼자는 안대안대... 이번 주제는 주식이니 만큼 최대한 힘내보자.자, 다시 돌아와라... 블로그의 본질 S&P 500 주가 데이터 수

simbbo-blog.tistory.com

 

이아름답고 이쁜 데이터 프래임 가지고 한번 놀아보자

 

 

 

1. 데이터프레임에 수익률 추가하기

일단 수익률을 각 일자별로 볼수도 있어서 각 행마다 수익률을 추가시켜줬다. 

# 데이터프레임에 수익률 추가
def add_returns_to_dataframe(df):
    # 각 Ticker별로 이전 Adj Close와 비교하여 일별 수익률을 계산
    df['Daily Return (%)'] = df.groupby('Ticker')['Adj Close'].pct_change() * 100
    return df

# 수익률 추가
sp500_data['index'] = pd.to_datetime(sp500_data['index'])  # 날짜를 datetime으로 변환
sp500_data = add_returns_to_dataframe(sp500_data)
sp500_data

pct_change() 를 사용해 전일 대비 수익률을 계산하고, 이를 Daily Return (%) 컬럼으로 추가했다. 

 

 

Adj Close를 기반으로 수익률을 계산했고, 가격이랑 일별 수익률 봤을땐 잘 맞게 들어간것같댜.

 

아 그리고, 첫행은 NaN이다. 

 

왜? 전날이 없어성 수익률이 없잖앙. 

 

 

2. 대통령 임기 플래그 추가하기

트럼프 재선 이후가 궁금해서 보는거지만, 분명 우리는 이전 트럼프 임기 기간도 볼것이고. 

 

바이든때랑 비교할수도 있다. 

 

일단 필요할것같은 컬럼은 추가해두자 이거야.

 

# 미국 대통령 임기 기간 정의
def assign_president(date):
    if date < pd.Timestamp('2017-01-20'):
        return 'Obama'
    elif date <= pd.Timestamp('2021-01-20'):
        return 'Trump'
    else:
        return 'Biden'

# 'President' 플래그 추가
sp500_data['President'] = sp500_data['index'].apply(assign_president)

 

이전 트럼프 임기기간이 2017/1/20부터 시작해서 2021/01/20에 끝났기 때문에 날짜를 플래깅 하자. 

오바마 바이든 잘 나온다, 아직은 바이든이 대통령이다.

 

 

3. 섹터별 수익률과 트렌드 계산하고 시각화하기

자, 트럼프 재선 확정이 된 지난 11월, 섹터별로 어떻게 수익률이 변했는지 확인해봅시댜.

def calculate_sector_returns_and_trends(df, start_date, end_date):
    """
    섹터별 평균 수익률과 일별 주가 트렌드를 계산.
    - df: 데이터프레임 (S&P500 데이터)
    - start_date, end_date: 분석 기간
    """
    # 날짜 변환
    df['index'] = pd.to_datetime(df['index'])
    
    # 분석 기간 필터링
    filtered_data = df[(df['index'] >= start_date) & (df['index'] <= end_date)]
    
    # 종목별 수익률 계산
    first_prices = filtered_data.groupby('Ticker').first()['Adj Close'].rename('Start Price')
    last_prices = filtered_data.groupby('Ticker').last()['Adj Close'].rename('End Price')
    stock_returns = ((last_prices - first_prices) / first_prices * 100).rename('Return (%)')
    
    # 섹터별 평균 수익률 계산
    ticker_sector_map = filtered_data[['Ticker', 'Sector']].drop_duplicates().set_index('Ticker')
    stock_returns = stock_returns.to_frame().join(ticker_sector_map)
    sector_avg_returns = stock_returns.groupby('Sector')['Return (%)'].mean().sort_values(ascending=False).rename('Avg Return (%)')
    
    # 섹터별 일별 주가 트렌드 계산
    sector_daily_trends = filtered_data.groupby(['Sector', 'index']).agg(
        Avg_Daily_Price=('Adj Close', 'mean')
    ).reset_index()
    
    return sector_avg_returns, sector_daily_trends

# 기준 날짜와 종료 날짜 설정
start_date = "2024-11-01"
end_date = "2024-11-30"

# 섹터별 평균 수익률과 트렌드 계산
sector_average_returns, sector_daily_prices = calculate_sector_returns_and_trends(sp500_data, start_date, end_date)
sector_average_returns

 

 

조금 아쉬우니까 시각화도 하자고

import matplotlib.pyplot as plt

# 섹터별 트렌드 시각화
plt.figure(figsize=(14, 8))
for sector in sector_daily_prices['Sector'].unique():
    sector_data = sector_daily_prices[sector_daily_prices['Sector'] == sector]
    plt.plot(sector_data['index'], sector_data['Avg_Daily_Price'], label=sector)

plt.title("Sector Daily Price Trends (November 2024)")
plt.xlabel("Date")
plt.ylabel("Average Adjusted Close Price")
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()


# 섹터별 평균 수익률 바 그래프
sector_average_returns.sort_values(ascending=False).plot(kind='bar', figsize=(12, 6), color='skyblue')
plt.title("Sector Average Returns (%) - November 2024")
plt.ylabel("Average Return (%)")
plt.xlabel("Sector")
plt.grid(axis='y')
plt.xticks(rotation=45)
plt.show()

이건 좀별루넹
바차트는 이쁜데

 

좋아 그럼 일단 상위/하위 3개씩만 집중해서 봐보자. 

 

import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter

# 상위 3개 및 하위 3개 섹터 선택
top_sectors = sector_average_returns.nlargest(3).index
bottom_sectors = sector_average_returns.nsmallest(3).index

# 그래프 생성: 상위 3개 섹터
for sector in top_sectors:
    sector_data = sector_daily_prices[sector_daily_prices['Sector'] == sector]
    
    plt.figure(figsize=(12, 6))
    plt.plot(sector_data['index'], sector_data['Avg_Daily_Price'], label=sector, color='blue', marker='o')
    plt.title(f"Top Sector: {sector} - Daily Price Trend (November 2024)")
    plt.xlabel("Date")
    plt.ylabel("Average Adjusted Close Price")
    plt.grid()
    plt.xticks(rotation=45)
    
    # 11월 6일 강조
    plt.axvline(x=pd.Timestamp("2024-11-06"), color='red', linestyle='--', label="Trump Re-election Confirmed")
    plt.legend()
    plt.tight_layout()
    plt.show()

# 그래프 생성: 하위 3개 섹터
for sector in bottom_sectors:
    sector_data = sector_daily_prices[sector_daily_prices['Sector'] == sector]
    
    plt.figure(figsize=(12, 6))
    plt.plot(sector_data['index'], sector_data['Avg_Daily_Price'], label=sector, color='green', marker='o')
    plt.title(f"Bottom Sector: {sector} - Daily Price Trend (November 2024)")
    plt.xlabel("Date")
    plt.ylabel("Average Adjusted Close Price")
    plt.grid()
    plt.xticks(rotation=45)
    
    # 11월 6일 강조
    plt.axvline(x=pd.Timestamp("2024-11-06"), color='red', linestyle='--', label="Trump Re-election Confirmed")
    plt.legend()
    plt.tight_layout()
    plt.show()

 

 

웃긴건 헬스케어 빼고 다 우상향 그래프네...

근데 오른 폭을 보면 (y축을 보면 좀 차이는있다)

 

 

11월 한달동안 수익률이 좋았던 섹터는 Energy, Financials, Communication Services 섹터 순이다.

11개 섹터중 가장 저조한 수익률?(마이너슨 아님) 하위 세개 섹터는 Health Care, Materials, Consumer Staples 순이다. 

 

 

일단 여섯개의 섹터를 살짝 어떤건지 보고 가볼까? 


에너지 (Energy) 

  • 정의: 석유, 가스, 석탄 등 에너지 자원을 생산, 유통하는 기업.
  • 트럼프와의 관련성:
    • 긍정적: 에너지 독립과 화석 연료 생산 확대는 석유 및 가스 기업의 매출 증가에 기여 가능
    • 부정적: 국제적 비판과 지속 가능성을 중시하는 글로벌 트렌드와의 갈등이 예상

 

금융 (Financials) 

  • 정의: 은행, 보험, 자산 관리 등 금융 서비스를 제공하는 기업.
  • 트럼프와의 관련성:
      • 긍정적: 세금 감면, 규제 완화, 경제 성장 촉진 공약은 금융 기업의 수익성을 높일 가능성이 큼
      • 부정적: 무역 전쟁으로 인한 경제 불확실성 증가는 금융 시장의 변동성을 확대할 수도 있음

커뮤니케이션 서비스 (Communication Services) 

  • 정의: 통신, 미디어, 엔터테인먼트 등 정보 전달과 관련된 기업.
  • 트럼프와의 관련성:
    • 긍정적: 규제 완화는 미디어 기업들의 이익률 개선에 도움을 줄 수 있음
    • 부정적: 정치적 논란은 미디어 기업의 브랜드 이미지와 주가 변동성을 증가시킬 수 있음..

 

헬스케어 (Health Care)

  • 정의: 제약, 의료 기기, 병원 등 헬스케어 관련 기업.
  • 트럼프와의 관련성:
    • 긍정적: 규제 완화와 약가 인하 정책은 기업들의 연구 개발 비용을 줄이고, 약품 접근성을 개선할 수 있지..
    • 부정적: 낙태 관련 법률 변화 및 사회적 논란은 일부 기업의 이미지와 수익성에 영향을 줄 수 있음

 

기초소재 (Materials)

  • 정의: 화학, 금속, 건축 자재 등 원재료를 생산하는 기업.
  • 트럼프와의 관련성: 
    • 긍정적: 인프라 투자 확대는 건축 자재와 금속 수요 증가로 이어질 것 
    • 부정적: 국제 무역 마찰은 원자재 가격 변동성과 불확실성을 높일 수 있음

 

필수 소비재 (Consumer Staples) 

  • 정의: 식음료, 생활용품 등 필수 소비재를 생산하는 기업.
  • 트럼프와의 관련성:
    • 긍정적: 세금 감면으로 소비자들의 가처분 소득이 증가하면 필수 소비재 수요가 안정적일 가능성이 높음
    • 부정적: 무역 전쟁으로 인한 수입품 관세는 원자재 가격 상승으로 이어질 수 있음

섹터별로 긍부정인걸 대충 찌그려봤다. 

 

트럼프 되고나서 여러 리포트 나오고 슈카형도 이야기해주고 별별것들을 다 종합하면 확실히게 보이긴한다...

 

담번엔 추가로 더 디테일하게 해당 섹터에 대해서 분석을 해보겠다.

 

관련 기사도 한번 찾아보면 좋을것같고, 주요 종목도 봐도 재밌을듯.

 


 

 

+ Recent posts