如何用quantmod包getSymbols实现年度数据子集化并存储为新对象
Hey there! Let me break down how to use the getSymbols() function from the quantmod package to fetch financial data, subset it to a specific full year (like the previous calendar year), and store it as a new object. I'll cover both manual year specification and automatic previous-year handling, plus fix a small gotcha from your example code.
1. Set Up Required Packages
First, make sure you have quantmod (for data fetching) and dplyr (for filtering) installed and loaded. If you want to simplify automatic date calculations, lubridate is a handy addition too:
# Install packages if you haven't already install.packages(c("quantmod", "dplyr", "lubridate")) # Load the packages library(quantmod) library(dplyr) library(lubridate)
2. Fetch Data with getSymbols()
The getSymbols() function pulls financial data from sources like Yahoo Finance. Let's walk through your example for Indonesian stock MTDL.JK (weekly data), with notes on key parameters:
auto.assign = FALSE: Prevents the function from automatically creating a global variable with the ticker name (we want to assign it tomtdlmanually)src = "yahoo": Specifies Yahoo Finance as the data sourceperiodicity = "weekly": Fetches weekly instead of daily datana.omit(): Removes any rows with missing values
# Fetch weekly data for MTDL.JK and clean missing values mtdl <- na.omit(getSymbols("MTDL.JK", auto.assign = FALSE, src = "yahoo", periodicity = "weekly"))
Quick Note: xts Object Structure
getSymbols() returns an xts object (time-series data), where row names are dates. To use dplyr's filter() (like your example), we first need to convert the row names into a dedicated DATE column:
# Convert xts object to a data frame with a DATE column mtdl_df <- as.data.frame(mtdl) %>% mutate(DATE = index(mtdl))
3. Subset to a Specific Year
Option 1: Manual Year Specification (e.g., 2018)
If you know exactly which year you want, use hard-coded start/end dates with filter():
# Subset data to full 2018 calendar year week.year.mtdl <- mtdl_df %>% filter(DATE >= as.Date("2018-01-01") & DATE <= as.Date("2018-12-31"))
Option 2: Automatic Previous Year (No Hard-Coded Dates)
To dynamically fetch the complete previous calendar year (no need to update dates annually), calculate the start/end dates programmatically:
# Calculate start and end of the previous year last_year_start <- floor_date(Sys.Date(), "year") - years(1) last_year_end <- floor_date(Sys.Date(), "year") - days(1) # Subset to the previous year's data week.year.mtdl_last_year <- mtdl_df %>% filter(DATE >= last_year_start & DATE <= last_year_end)
Bonus: xts Native Subsetting (Simpler!)
If you prefer working directly with xts objects (no need to convert to a data frame), you can subset by year in one line:
# Directly subset xts object to 2018 data week.year.mtdl_xts <- mtdl["2018"] # For previous year, use: week.year.mtdl_last_year_xts <- mtdl[paste0(year(Sys.Date()) - 1)]
内容的提问来源于stack exchange,提问作者user9092800

