红利股票之美:用 R 代码分析韩国股市十大红利股票

大家好!今天我们来讨论一件令人兴奋的事情:红利投资。 您是否曾被每月源源不断的红利所诱惑?也许你还不清楚什么是红利投资?当你读完今天的文章时,你就会迷上红利投资的世界了!作为奖励,你还可以这样来想象它

배당주 투자 - 삼성전자
( 投资红利股票 - 三星电子 )

在本篇文章中,我们将使用 R 编程深入分析韩国股市中的 10 种股息股。 从股价走势、股息收益率到股票波动率,我们在本篇文章中提供了大量信息。让我们一起进入股息投资的世界吧。

投资红利股票:它们为何如此吸引人?

投资股息股是最受许多投资者欢迎的投资策略之一。 为什么?除了股价的涨跌之外,还因为公司将股息作为利润的一部分派发给股东。 提供稳定股息的股票被称为股息股。

但是,你能随便挑选一只股票进行投资吗? 不能。 挑选一只好的股息股票需要考虑很多因素。 今天,我们将使用 R 代码创建一个 韩国股票市场的 10 大红利股票,看看需要注意些什么。

SK텔레콤
( 投资红利股票 - SK 电讯 )

用 R 代码分析股息股票

现在是时候深入研究 R 代码了,如果它看起来有点长,不用担心。我们将逐段分解。

加载 # 先决条件库
library(quantmod)
函数库(ggplot2)
library(reshape2)
library(dplyr)
library(gridExtra)
library(scales)
library(furrr) # 并行处理库

为 # 分析设置股票信息
stocks_info <- data.frame(
  symbol = c("005930.KS", "017670.KS", "033780.KS", "000270.KS", "051910.KS"、
             "032640.KS"、"030200.KS"、"000810.KS"、"035250.KS"、"316140.KS")、
  name = c("三星电子"、"SK 电讯"、"KT"、"起亚"、"LG 化学
           "LG Uplus"、"KT&G"、"Samsung Fire"、"POSCO Holdings"、"Woori Financial")
)

代码评注

  1. 首先,加载必要的 R 软件包,用于库存数据收集、数据处理和可视化等。
  2. 股票信息 创建一个数据框架,存储您要分析的 10 只股票的代码和名称。这些公司都是韩国股票市场上知名的分红股票。

现在,我们将定义用于收集和分析股票数据的函数。

# 股票数据收集函数定义
get_stock_data <- function(symbol) {
  tryCatch({
    收集过去 10 年的 # 股票数据
    data <- getSymbols(
      symbol, src = "yahoo"、
      from = Sys.Date() - years(10)、
      to = Sys.Date()、
      auto.assign = FALSE
    )

    检查 # 数据
    if (is.null(data)) stop("No data retrieved.")

    # 删除当前日期之后的数据
    data <- data[index(data) <= Sys.Date()]

    # 转换为年度数据
    annual_close <- to.yearly(Cl(data))
    annual_open <- to.yearly(Op(data))
    annual_high <- to.yearly(Hi(data))
    annual_low <- to.yearly(Lo(data))
    annual_volume <- to.yearly(Vo(data))

    # 处理股息(如果没有,则填写 0)
    annual_dividends <- if ("Dividends" %in% colnames(data)) {
      to.yearly(data$Dividends)
    } else {
      xts(rep(0, nrow(annual_close)), order.by = index(annual_close))
    }

    } cbind(annual_open, annual_high, annual_low, annual_close、
          annual_volume, annual_dividends)
  }, error = function(e) {
    warning(paste("Data fetch failed for", symbol, ":", e$message))
    return(NULL)
  })
}

代码评注

  1. 获取库存数据 函数从雅虎财经获取指定股票代码过去 10 年的数据。
  2. 将数据转换为年度数据,包括开盘价、最高价、最低价、收盘价、成交量和股息信息。
  3. 错误处理可确保在数据收集失败时程序不会中断。

我们还可以创建一个函数,将收集到的数据可视化。

# 数据可视化功能
plot_stock_data <- function(data, stock_info) {
  如果 (is.null(data)) {
    warning(paste("No data available for", stock_info$name))
    return(NULL)
  }

  创建 # 数据框并计算指标
  df %
    mutate(
      DividendYield = (Dividends / Close) * 100, # Dividend Yield
      AnnualReturn = (Close / lag(Close) - 1)* 100,# 年收益率
      波动率范围 = 高 - 低 # 波动率范围
    )

  删除 # NA 值
  df <- na.omit(df)

  应用 # 趋势颜色
  close_colour <- "#1f77b4"
  dividend_color <- "#2ca02c"
  return_color <- "#d62728"
  波动率颜色 <- "#9467bd"
  volume_color <- "#8c564b"

  创建 # 股价和成交量图表
  p1 <- ggplot(df, aes(x = Year)) +
    geom_line(aes(y = 收盘价), color = close_color, size = 1) +
    geom_point(aes(y = 关闭), color = close_colour) +
    geom_text(aes(y = Close, label = round(Close, 0))、
              vjust = -0.6, size = 3) +
    geom_col(aes(y = Volume/max(Volume, na.rm = TRUE) * max(Close, na.rm = TRUE))、
             fill = volume_colour, alpha = 0.3) +
    scale_y_continuous(
      name = "价格(韩元)"、
      labels = scales::comma、
      sec.axis = sec_axis(~./max(df$Close, na.rm = TRUE) * max(df$Volume, na.rm = TRUE)、
                          name = "Volume")、
      expand = expansion(mult = c(0.05, 0.1))
    )
    labs(title = paste(stock_info$name, "(", stock_info$symbol, ")")、
         subtitle = "年度价格和成交量") +
    theme_minimal() +
    主题(
      plot.title = element_text(size = 14, face = "bold")、
      axis.title = element_text(size=10)、
      legend.position = "bottom"(
    )

  创建 # 返回图
  p2 <- ggplot(df, aes(x = Year)) +
    geom_line(aes(y = DividendYield, color = "Dividend Yield"), size = 1) +
    geom_point(aes(y = 股息收益率), color = dividend_color) +
    geom_text(aes(y = DividendYield, label = round(DividendYield, 1))、
              color = dividend_color, vjust = -0.6, size = 3) +
    geom_line(aes(y = AnnualReturn, color = "Annual Return"), size = 1) +
    geom_point(aes(y = AnnualReturn), color = return_colour) +
    geom_text(aes(y = AnnualReturn, label = round(AnnualReturn, 1))、
              color = return_color,vjust = 1.5,size = 3) +
    scale_colour_manual(values = c("Dividend Yield" = dividend_colour、
                                  "年回报率" = return_colour)) +
    labs(y = "Rate (%)",color = "Metrics") +
    scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) +
    theme_minimal() + theme
    theme(legend.position = "bottom")

  创建 # 波动率图表
  p3 <- ggplot(df, aes(x = 年份, y = 波动率范围)) +
    geom_line(color = volatility_color, size = 1) +
    geom_point(color = volatility_color) +
    geom_text(aes(label = round(VolatilityRange, 0))、
              vjust = -0.6, size = 3, color = volatility_color) +
    labs(y = "Volatility Range (High-Low)") +
    scale_y_continuous(labels = scales::comma、
                       expand = expansion(mult = c(0.05, 0.1))) +
    theme_minimal()

  绘制 # 图表
  gridExtra::grid.arrange(p1, p2, p3, ncol = 1、
                          heights = c(1.2, 1, 1))
}

代码评注

1. plot_stock_data 该函数获取股票数据并生成三个图表:

  • 股票价格和成交量图表
  • 股息收益率和年回报率图表
  • 波动范围图表

2. 使用 ggplot2 生成每个图表,并使用 gridExtra 将三个图表合并为一个图形。

3.每张图表都用颜色编码和标注,以便于阅读。

现在,我们将创建一个分析股票数据的函数。

# 股票数据分析函数
analyse_stocks <- function(stock_data, stocks_info) {
  results <- lapply(1:nrow(stocks_info), function(i) {
    if (is.null(stock_data[[i]])) return(NULL)

    symbol <- stocks_info$symbol[i]
    data <- stock_data[[i]]

    df <- data.frame(
      收盘价 = as.numeric(data[,4])、
      股息 = as.numeric(data[,6])
    )

    list(
      股票名称 = stocks_info$name[i]、
      符号 = symbol、
      MeanPrice = mean(df$Close, na.rm = TRUE)、
      PriceStdDev = sd(df$Close, na.rm = TRUE)、
      MeanDividend = mean(df$Dividends, na.rm = TRUE)、
      TotalReturn = (tail(df$Close, 1) / df$Close[1] - 1)* 100
    )
  })

  results <- results[!sapply(results, is.null)] # 删除 NULLs
  do.call(rbind, lapply(results, as.data.frame))
}

代码评注

是的,让我们继续进行代码评注。

  1. 分析股票 该功能可计算每只股票的平均价格、价格标准差、平均股息、总回报等。
  2. 为每只股票创建分析结果列表,将其转换为数据帧并返回。

现在是时候实际使用这些功能来收集和分析数据了!

# 主执行
计划(多会话) # 并行会话设置

收集并可视化 # 数据
stock_data <- future_map(1:nrow(stocks_info), function(i) {
  symbol <- stocks_info$symbol[i]
  data <- get_stock_data(symbol)
  if (!is.null(data)) {
    plot_stock_data(data, stocks_info[i,])
  }
  数据
})

输出 # 分析结果
analysis_results <- analyse_stocks(stock_data, stocks_info)
print(analysis_results)

代码评注

  1. 计划(多会话)来设置并行处理。这样我就可以同时从多只股票中收集数据,从而节省时间。
  2. 未来地图 功能来收集和可视化每个库存的数据。
  3. 最后 分析股票 函数获取并打印所有股票的分析结果。

投资红利股票,方法如下!

现在,我们已经用 R 代码分析了韩国股票市场上的 10 大股息股,我们想给您一些关于如何进行股息投资的建议。

  1. 查看股息率:"...... 股息率该值越高,您的投资就能获得越多的红利。
  2. 考虑股价波动: 波动范围波动率低的股票通常被认为是稳定的分红股票。
  3. 探索总回报: 总回报价值高的股票可能值得长期投资。
  4. 检查企业的财务健康状况虽然不包括在我们的代码中,但在投资分红股票时,查看公司的财务报表非常重要。盈利稳定的公司才能持续支付股息。
  5. 确定行业趋势每家公司所在行业的未来前景也很重要:高增长潜力行业的公司更有可能增加股息。

结束语:红利股票的吸引力

对于希望获得稳定收入的投资者来说,投资红利股票是一种极具吸引力的策略,但与所有投资一样,红利股票也存在风险。我们从 R 代码中获得的信息有助于我们做出投资决策,但这还不够。

在进行实际投资之前,要综合考虑深入分析、个人投资偏好和专业建议。红利股票的真正吸引力往往在于长期性。

为什么不用 R 代码创建自己的红利股票投资组合?投资世界博大精深。让我们一起学习,一起成长!

另请参阅我的 "用 Python 代码挑选红利股票 "一文。 我已经写了一篇,你可以将它与你现在看到的这篇文章进行比较,以便更好地了解应该购买哪些股票。

# 完整代码

加载 # 先决条件库
library(quantmod)
函数库(ggplot2)
library(reshape2)
library(dplyr)
library(gridExtra)
library(scales)
library(furrr) # 并行处理库

为 # 分析设置股票信息
stocks_info <- data.frame(
  symbol = c("005930.KS", "017670.KS", "033780.KS", "000270.KS", "051910.KS"、
             "032640.KS"、"030200.KS"、"000810.KS"、"035250.KS"、"316140.KS")、
  name = c("三星电子"、"SK 电讯"、"KT"、"起亚"、"LG 化学
           "LG Uplus"、"KT&G"、"Samsung Fire"、"POSCO Holdings"、"Woori Financial")
)

定义 # 股票数据收集函数
get_stock_data <- function(symbol) {
  tryCatch({
    收集过去 10 年的 # 股票数据
    data <- getSymbols(
      symbol, src = "yahoo"、
      from = Sys.Date() - years(10)、
      to = Sys.Date()、
      auto.assign = FALSE
    )
    
    检查 # 数据
    if (is.null(data)) stop("No data retrieved.")
    
    # 删除当前日期之后的数据
    data <- data[index(data) <= Sys.Date()]
    
    # 转换为年度数据
    annual_close <- to.yearly(Cl(data))
    annual_open <- to.yearly(Op(data))
    annual_high <- to.yearly(Hi(data))
    annual_low <- to.yearly(Lo(data))
    annual_volume <- to.yearly(Vo(data))
    
    # 处理股息(如果没有,则填写 0)
    annual_dividends <- if ("Dividends" %in% colnames(data)) {
      to.yearly(data$Dividends)
    } else {
      xts(rep(0, nrow(annual_close)), order.by = index(annual_close))
    }
    
    } cbind(annual_open, annual_high, annual_low, annual_close、
          annual_volume, annual_dividends)
  }, error = function(e) {
    warning(paste("Data fetch failed for", symbol, ":", e$message))
    return(NULL)
  })
}

# 数据可视化函数
plot_stock_data <- function(data, stock_info) {
  如果 (is.null(data)) {
    warning(paste("No data available for", stock_info$name))
    return(NULL)
  }
  
  创建 # 数据框架并计算指标
  df %
    mutate(
      DividendYield = (Dividends / Close) * 100, # Dividend Yield
      AnnualReturn = (Close / lag(Close) - 1)* 100,# 年收益率
      波动率范围 = 高 - 低 # 波动率范围
    )
  
  删除 # NA 值
  df <- na.omit(df)
  
  应用 # 趋势颜色
  close_colour <- "#1f77b4"
  dividend_color <- "#2ca02c"
  return_color <- "#d62728"
  波动率颜色 <- "#9467bd"
  volume_color <- "#8c564b"
  
  创建 # 股价和成交量图表
  p1 <- ggplot(df, aes(x = Year)) +
    geom_line(aes(y = 收盘价), color = close_color, size = 1) +
    geom_point(aes(y = 关闭), color = close_colour) +
    geom_text(aes(y = Close, label = round(Close, 0))、
              vjust = -0.6, size = 3) + # 调整 vjust 值
    geom_col(aes(y = Volume/max(Volume, na.rm = TRUE) * max(Close, na.rm = TRUE))、
             fill = volume_colour, alpha = 0.3) +
    scale_y_continuous(
      name = "价格(韩元)"、
      labels = scales::comma、
      sec.axis = sec_axis(~./max(df$Close, na.rm = TRUE) * max(df$Volume, na.rm = TRUE)、
                          name = "Volume")、
      expand = expansion(mult = c(0.05, 0.1)) # 增加顶边距
    )
    labs(title = paste(stock_info$name, "(", stock_info$symbol, ")")、
         subtitle = "年度价格和成交量") +
    theme_minimal() +
    主题(
      plot.title = element_text(size = 14, face = "bold")、
      axis.title = element_text(size=10)、
      legend.position = "bottom"(
    )
  
  创建 # 返回图
  p2 <- ggplot(df, aes(x = Year)) +
    geom_line(aes(y = DividendYield, color = "Dividend Yield"), size = 1) +
    geom_point(aes(y = 股息收益率), color = dividend_color) +
    geom_text(aes(y = DividendYield, label = round(DividendYield, 1))、
              color = dividend_color, vjust = -0.6, size = 3) + # 调整 vjust 值
    geom_line(aes(y = AnnualReturn, color = "Annual Return"), size = 1) +
    geom_point(aes(y = AnnualReturn), color = return_color) +
    geom_text(aes(y = AnnualReturn, label = round(AnnualReturn, 1))、
              color = return_color, vjust = 1.5, size = 3) +
    scale_colour_manual(values = c("Dividend Yield" = dividend_colour、
                                  "年回报率" = return_color)) +
    labs(y = "Rate (%)",color = "Metrics") +
    scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) + # 添加顶边距
    theme_minimal() + #
    theme(legend.position = "bottom")
  
  创建 # 波动率图表
  p3 <- ggplot(df, aes(x = 年份, y = 波动率范围)) +
    geom_line(color = volatility_color, size = 1) +
    geom_point(color = volatility_color) +
    geom_text(aes(label = round(VolatilityRange, 0))、
              vjust = -0.6, size = 3, color = volatility_colour) + # 调整 vjust 值
    labs(y = "波动率范围(高-低)") +
    scale_y_continuous(labels = scales::comma、
                       expand = expansion(mult = c(0.05, 0.1)) + # 添加顶边距
    theme_minimal()
  
  定位 # 图表
  gridExtra::grid.arrange(p1, p2, p3, ncol = 1、
                          heights = c(1.2, 1, 1))
}

# 股票数据分析函数
analyse_stocks <- function(stock_data, stocks_info) {
  results <- lapply(1:nrow(stocks_info), function(i) {
    if (is.null(stock_data[[i]])) return(NULL)
    
    symbol <- stocks_info$symbol[i]
    data <- stock_data[[i]]
    
    df <- data.frame(
      收盘价 = as.numeric(data[,4])、
      股息 = as.numeric(data[,6])
    )
    
    list(
      股票名称 = stocks_info$name[i]、
      符号 = symbol、
      MeanPrice = mean(df$Close, na.rm = TRUE)、
      PriceStdDev = sd(df$Close, na.rm = TRUE)、
      MeanDividend = mean(df$Dividends, na.rm = TRUE)、
      TotalReturn = (tail(df$Close, 1) / df$Close[1] - 1)* 100
    )
  })
  
  results <- results[!sapply(results, is.null)] # 删除 NULLs
  do.call(rbind, lapply(results, as.data.frame))
}

# 主要执行
plan(multisession) # 设置并行会话

收集并可视化 # 数据
stock_data <- future_map(1:nrow(stocks_info), function(i) {
  symbol <- stocks_info$symbol[i]
  data <- get_stock_data(symbol)
  if (!is.null(data)) {
    plot_stock_data(data, stocks_info[i,])
  }
  数据
})

输出 # 分析结果
analysis_results <- analyse_stocks(stock_data, stocks_info)
print(analysis_results)

类似文章