독수리 요새

R quantmod 패키지 본문

미분류

R quantmod 패키지

bravebird 2024. 12. 19. 23:52

2021-2023 사이 방송통신대 통계학과를 이수했었지만 이거 아무리 배워도 뭐 할 수가 없다고 생각했었다. 이유:

1. 데이터를 어디서 구하고, 어떻게 불러와 정리해야 할지 몰라 큰 어려움을 겪었다. 구해 놓은 데이터도 잘 불러와지지 않았다.

2. 교과서는 기본 문법서에 불과해, 내가 원하는 자료를 다루는 코드를 작성하는 데 전혀 도움이 되지 않았다.

3. 코드가 작동하지 않을 때, 문제의 원인을 파악하기도 어려웠고, 적절한 검색어를 설정하는 방법조차 알지 못했다.

4. 이 기술을 활용해 무엇을 만들 수 있는지, 어디까지 할 수 있는지 전혀 감이 오지 않았다. 심지어 내가 무엇을 만들고 싶은지조차 정의하기 어려웠다.

5. 차트 스타일을 약간 바꾸는 간단한 작업조차 일일이 코드를 작성해야 해서 비효율적으로 느껴졌다.

즉 배워봤자 효율이 너무 낮아서 결국은 엑셀을 쓰게 되더라고. 그러나 생성형 AI의 눈부신 발전으로 ChatGPT에게 질문을 던져가면서 R과 Python을 써보고 있는데 재미있네. 야후 파이낸스 데이터를 R로 불러들여서 이렇게 가지고 놀 수 있다. 

 

 

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# 데이터 가져오기
getSymbols("MSFT", src = "yahoo")  # Microsoft
getSymbols("^GSPC", src = "yahoo")  # S&P 500

# 2020년 1월 1일 이후 데이터 필터링
msft_filtered <- MSFT["2020-01-01::"]
sp500_filtered <- GSPC["2020-01-01::"]

# 누적 상승률 계산
msft_cum_return <- (Cl(msft_filtered) / as.numeric(Cl(msft_filtered)[1]) - 1) * 100
sp500_cum_return <- (Cl(sp500_filtered) / as.numeric(Cl(sp500_filtered)[1]) - 1) * 100

# 데이터 프레임 생성
msft_cum <- data.frame(date = index(msft_cum_return), return = as.numeric(msft_cum_return), symbol = "Microsoft")
sp500_cum <- data.frame(date = index(sp500_cum_return), return = as.numeric(sp500_cum_return), symbol = "S&P 500")

# 데이터 병합
all_cum_returns <- rbind(msft_cum, sp500_cum)

# 그래프 생성
ggplot(all_cum_returns, aes(x = date, y = return, color = symbol)) +
  geom_line(size = 1) +
  labs(
    title = "Microsoft와 S&P 500의 누적 상승률 비교 (2020년 1월 이후)",
    x = "날짜",
    y = "누적 상승률 (%)"
  ) +
  theme_minimal() +
  scale_color_manual(values = c("Microsoft" = "blue", "S&P 500" = "red"))

 

 

 

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# 데이터 가져오기
getSymbols("SCHD", src = "yahoo")  # SCHD
getSymbols("^DJI", src = "yahoo")  # DOW JONES

# 2020년 1월 1일 이후 데이터 필터링
schd_filtered <- SCHD["2010-01-01::"]
dowjones_filtered <- DJI["2010-01-01::"]

# 누적 상승률 계산
schd_cum_return <- (Cl(schd_filtered) / as.numeric(Cl(schd_filtered)[1]) - 1) * 100
dowjones_cum_return <- (Cl(dowjones_filtered) / as.numeric(Cl(dowjones_filtered)[1]) - 1) * 100

# 데이터 프레임 생성
schd_cum <- data.frame(date = index(schd_cum_return), return = as.numeric(schd_cum_return), symbol = "Schwab U.S. Dividend Equity ETF")
dowjones_cum <- data.frame(date = index(dowjones_cum_return), return = as.numeric(dowjones_cum_return), symbol = "Dow Jones Industrial Average")

# 데이터 병합
all_cum_returns <- rbind(schd_cum, dowjones_cum)

# 그래프 생성

ggplot(all_cum_returns, aes(x = date, y = return, color = symbol)+

geom_line(size = 1) +

labs( title = "SCHD와 Dow Jones 지수의 누적 상승률 비교 (2010년 1월 이후)", x = "날짜", y = "누적 상승률 (%)" ) +

theme_minimal(+

scale_color_manual(values = c("Schwab U.S. Dividend Equity ETF" = "blue", "Dow Jones Industrial Average" = "red")) +

theme( legend.position = "bottom" # 범례 위치를 아래로 설정 )

 

 

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# NVIDIA 주가 데이터 가져오기
getSymbols("NVDA", src = "yahoo")

# 2024년도 데이터 필터링
nvda_2024 <- NVDA["2024-01-01::2024-12-31"]

# 볼린저 밴드 계산
nvda_bbands <- BBands(Cl(nvda_2024), n = 20, sd = 2)  # 20일 기준, 표준편차 2배

# 볼린저 밴드 데이터 병합
nvda_with_bbands <- cbind(nvda_2024, nvda_bbands)

 

# 데이터 프레임 생성 (msft_bbands_df)
nvda_bbands_df <- data.frame(
  date = index(nvda_with_bbands),  # 날짜
  close = as.numeric(Cl(nvda_with_bbands)),  # 종가
  upper = as.numeric(nvda_with_bbands$up),  # 상한선
  lower = as.numeric(nvda_with_bbands$dn),  # 하한선
  middle = as.numeric(nvda_with_bbands$mavg)  # 이동평균선
)

# ggplot 시각화 (범례 추가)
ggplot(nvda_bbands_df, aes(x = date)) +
  geom_line(aes(y = close, color = "Close Price"), size = 1, linetype = "solid") +  # 종가
  geom_line(aes(y = upper, color = "Upper Band"), size = 1, linetype = "dashed") +  # 상한선
  geom_line(aes(y = lower, color = "Lower Band"), size = 1, linetype = "dashed") +  # 하한선
  geom_line(aes(y = middle, color = "Moving Average"), size = 1, linetype = "solid") +  # 이동평균선
  scale_color_manual(
    values = c("Close Price" = "blue", "Upper Band" = "red", "Lower Band" = "green", "Moving Average" = "orange")
  ) +
  labs(
    title = "NVIDIA 2024년 주가와 볼린저 밴드",
    x = "날짜",
    y = "주가 (USD)",
    color = "Legend"  # 범례 제목 설정
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")  # 범례를 그래프 아래로 이동

 

 

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# Microsoft 주가 데이터 가져오기
getSymbols("MSFT", src = "yahoo")

# 2024년도 데이터 필터링
msft_2024 <- MSFT["2024-01-01::2024-12-31"]

# 볼린저 밴드 계산
msft_bbands <- BBands(Cl(msft_2024), n = 20, sd = 2)  # 20일 기준, 표준편차 2배

# 볼린저 밴드 데이터 병합
msft_with_bbands <- cbind(msft_2024, msft_bbands)

# 데이터 프레임 생성 (msft_bbands_df)
msft_bbands_df <- data.frame(
  date = index(msft_with_bbands),  # 날짜
  close = as.numeric(Cl(msft_with_bbands)),  # 종가
  upper = as.numeric(msft_with_bbands$up),  # 상한선
  lower = as.numeric(msft_with_bbands$dn),  # 하한선
  middle = as.numeric(msft_with_bbands$mavg)  # 이동평균선
)

# ggplot 시각화 (범례 추가)
ggplot(msft_bbands_df, aes(x = date)) +
  geom_line(aes(y = close, color = "Close Price"), size = 1, linetype = "solid") +  # 종가
  geom_line(aes(y = upper, color = "Upper Band"), size = 1, linetype = "dashed") +  # 상한선
  geom_line(aes(y = lower, color = "Lower Band"), size = 1, linetype = "dashed") +  # 하한선
  geom_line(aes(y = middle, color = "Moving Average"), size = 1, linetype = "solid") +  # 이동평균선
  scale_color_manual(
    values = c("Close Price" = "blue", "Upper Band" = "red", "Lower Band" = "green", "Moving Average" = "orange")
  ) +
  labs(
    title = "Microsoft 2024년 주가와 볼린저 밴드",
    x = "날짜",
    y = "주가 (USD)",
    color = "Legend"  # 범례 제목 설정
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")  # 범례를 그래프 아래로 이동

 

 

 

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# 데이터 가져오기
getSymbols("NVDA", src = "yahoo")  # Nvidia
getSymbols("BTC-USD", src = "yahoo")  # Bitcoin USD

# 2020년 1월 1일 이후 데이터 필터링
nvda_filtered <- NVDA["2020-01-01::"]
btcusd_filtered <- `BTC-USD`["2020-01-01::"]  # 역따옴표로 변수 이름 처리

# 누적 상승률 계산
nvda_cum_return <- (Cl(nvda_filtered) / as.numeric(Cl(nvda_filtered)[1]) - 1) * 100
btcusd_cum_return <- (Cl(btcusd_filtered) / as.numeric(Cl(btcusd_filtered)[1]) - 1) * 100

# 데이터 프레임 생성
nvda_cum <- data.frame(date = index(nvda_cum_return), return = as.numeric(nvda_cum_return), symbol = "Nvidia")
btcusd_cum <- data.frame(date = index(btcusd_cum_return), return = as.numeric(btcusd_cum_return), symbol = "Bitcoin USD")

# 데이터 병합
all_cum_returns <- rbind(nvda_cum, btcusd_cum)

# symbol 열을 팩터로 변환
all_cum_returns$symbol <- as.factor(all_cum_returns$symbol)

# 그래프 생성
ggplot(all_cum_returns, aes(x = date, y = return, color = symbol)) +
  geom_line(size = 1) +
  labs(
    title = "Nvidia와 Bitcoin USD의 누적 상승률 비교 (2020년 1월 이후)",
    x = "날짜",
    y = "누적 상승률 (%)"
  ) +
  theme_minimal() +
  scale_color_manual(
    values = c("Nvidia" = "blue", "Bitcoin USD" = "red")
  )

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# 데이터 가져오기
getSymbols("^GSPC", src = "yahoo")        # S&P 500 지수
getSymbols("GC=F", src = "yahoo")        # 금 가격 (Gold Futures, USD)

# 2020년 1월 1일 이후 데이터 필터링
sp500_filtered <- GSPC["2020-01-01::"]
gold_filtered <- `GC=F`["2020-01-01::"]

# 일일 종가 데이터 추출
sp500_close <- Cl(sp500_filtered)
gold_close <- Cl(gold_filtered)

# 공통 날짜로 데이터 병합
merged_data <- merge(sp500_close, gold_close, all = FALSE)
colnames(merged_data) <- c("S&P 500", "Gold Price")

# 상관관계 계산
correlation <- cor(merged_data[, 1], merged_data[, 2], use = "complete.obs")
print(paste("S&P 500과 금 가격의 상관계수:", round(correlation, 2)))

# 산점도 시각화
ggplot(data = as.data.frame(merged_data), aes(x = `S&P 500`, y = `Gold Price`)) +
  geom_point(alpha = 0.5, color = "blue") +
  geom_smooth(method = "lm", color = "red", linetype = "dashed") +  # 회귀선 추가
  labs(
    title = "S&P 500 지수와 금 가격의 상관관계 (2020년 이후)",
    x = "S&P 500 지수 종가",
    y = "금 가격 종가 (USD)"
  ) +
  theme_minimal()

 

더보기

# 필요한 패키지 설치 및 로드
if (!require("quantmod")) install.packages("quantmod")
if (!require("ggplot2")) install.packages("ggplot2")
library(quantmod)
library(ggplot2)

# 데이터 가져오기
getSymbols("GC=F", src = "yahoo")        # 금 가격 (Gold Futures, USD)
getSymbols("BTC-USD", src = "yahoo")    # 비트코인 가격 (Bitcoin USD)

# 2020년 1월 1일 이후 데이터 필터링
gold_filtered <- `GC=F`["2020-01-01::"]
btc_filtered <- `BTC-USD`["2020-01-01::"]

# 일일 종가 데이터 추출
gold_close <- Cl(gold_filtered)
btc_close <- Cl(btc_filtered)

# 공통 날짜로 데이터 병합
merged_data <- merge(gold_close, btc_close, all = FALSE)
colnames(merged_data) <- c("Gold Price", "Bitcoin Price")

# 상관계수 계산
correlation <- cor(merged_data[, 1], merged_data[, 2], use = "complete.obs")
print(paste("금 가격과 비트코인 가격의 상관계수:", round(correlation, 2)))

# 산점도 시각화
ggplot(data = as.data.frame(merged_data), aes(x = `Gold Price`, y = `Bitcoin Price`)) +
  geom_point(alpha = 0.5, color = "blue") +
  geom_smooth(method = "lm", color = "red", linetype = "dashed") +  # 회귀선 추가
  labs(
    title = "금 가격과 비트코인 가격의 상관관계 (2020년 이후)",
    x = "금 가격 종가 (USD)",
    y = "비트코인 가격 종가 (USD)"
  ) +
  theme_minimal()

Comments