5  標準偏差は株のリスクの指標として活用できる

本書はデータ分析勉強会で学んだ成果をまとめたものです。

5.1 株の平均収益率とは何か?

 株価の変動を利用して得られる収益は「キャピタルゲイン」と呼ばれます。キャピタルゲインを目当てとした株取引で重要になる指標のひとつに「収益率」があります。毎月の終値が前月の終値に対して、値上がった、または、値下がった率を「月次収益率」といいます。「月次平均収益率」は、月次収益率の一年間(十二ヶ月)単位で平均した値になります。
 

5.2 平均収益率だけでは、優良な投資かどうかは判断できない

 1980年台の株価の月次収益率です。年数の頭にXがついているのは、Rでは変数名は英数字から始まらなければならないからです。

図表5-3 株の月次平均収益率
"./data/P56_ 図表5-3.csv" %>% 
  read.csv() %>% 
  df_print()

 
 図表5-2は株の月次平均収益率ですので、図表5-3の株の月次収益率から簡単に計算することができます。

図表5-2 株の月次平均収益率
"./data/P56_ 図表5-3.csv" %>% 
  read.csv() %>% 
  dplyr::summarise_if(is.numeric, mean) %>% 
  round(digits = 2) %>% 
  df_print()

 
 同様に図表5-4の標準偏差(S.D)も図表5-3から求めることができます。

図表5-3 月次平均収益率の標準偏差
"./data/P56_ 図表5-3.csv" %>% 
  read.csv() %>% 
  dplyr::summarise_if(is.numeric, SD) %>% 
  round(digits = 2) %>% 
  df_print()

 
この二つの統計量(平均値、標準偏差)から月次の収益率はどの程度の範囲になるのかを可視化したものが下図です。テキストのように1981年の月次収益率は\(2.46 \pm 9.11\%\)の範囲になることは普通に考えるべきというのが分かります。

::: {.cell code^fold=‘true’}

月次平均収益率と標準偏差を可視化する
"./data/P56_ 図表5-3.csv" %>% 
  read.csv() %>% 
  tidyr::pivot_longer(-, names_to = "年", values_to = "月次収益率") %>% 
  dplyr::group_by() %>% 
  dplyr::summarise(月次平均収益率 = mean(月次収益率),
                   標準偏差 = SD(月次収益率)) %>% 
  ggplot2::ggplot(ggplot2::aes(x = , y = 月次平均収益率)) + 
    ggplot2::geom_bar(stat = "identity", position = "dodge") + 
    ggplot2::geom_errorbar(ggplot2::aes(ymax = 月次平均収益率 + 標準偏差,
                                        ymin = 月次平均収益率 - 標準偏差),
                           position = "dodge", width = 0.2)

:::

 

5.3 ボラティリティが意味するところ

 ボラティリティ(予想変動率)とは標準偏差、つまり平均値からのブレ(バラツキ)のことです。例えば1981年の月次平均収益率は\(2.46\%\)、標準偏差は\(9.11\%\)なので、概ね下図のマゼンタ色のラインの間で変動していると想定できます。

1981年の月次収益率
"./data/P56_ 図表5-3.csv" %>% 
  read.csv() %>% 
  dplyr::mutate(= forcats::fct_inorder()) %>% 
  ggplot2::ggplot(ggplot2::aes(x = , y = X1981年)) + 
    ggplot2::geom_bar(stat = "identity") + 
    ggplot2::geom_hline(yintercept = 2.46, colour = "lightskyblue") + 
    ggplot2::geom_hline(yintercept = c(2.46 + 9.11, 2.46 - 9.11),
                        colour = "magenta")

練習問題

 (省略)

 

実際の株価で計算してみる

 実際に株探というサイトから某社の月次株価一覧を取得して月次平均収益率を計算してみます。

サイトから取得した株価データ
stock <- "./data/sample/株価の月次推移_2022-06-15.csv" %>% 
  read_csv()
stock %>% df_print()

 
 月次収益率の十二ヶ月平均が月次平均収益率になりますので、データがそろっている年の月次平均収益率と標準偏差を算出します。

月次平均収益率と標準偏差を求める
stock %>% 
  dplyr::mutate(= lubridate::year(日付)) %>% 
  dplyr::filter( >= 2010 &  <= 2021) %>% 
  dplyr::group_by() %>% 
  dplyr::summarise(月次平均収益率 = mean(月次収益率),
                   標準偏差 = SD(月次収益率)) %>% 
  round(digits = 2) %>% 
  df_print()

 
 上記を可視化します。

月次平均収益率と標準偏差を可視化する
stock %>% 
  dplyr::mutate(= lubridate::year(日付)) %>% 
  dplyr::filter( >= 2010 &  <= 2021) %>% 
  dplyr::group_by() %>% 
  dplyr::summarise(月次平均収益率 = mean(as.numeric(月次収益率)) %>% 
                            round(digits = 2),
                   標準偏差 = SD(月次収益率)) %>% 
  ggplot2::ggplot(ggplot2::aes(x = , y = 月次平均収益率)) + 
    ggplot2::geom_bar(stat = "identity", position = "dodge") + 
    ggplot2::geom_errorbar(ggplot2::aes(ymax = 月次平均収益率 + 標準偏差,
                                        ymin = 月次平均収益率 - 標準偏差),
                           position = "dodge", width = 0.2)

 
 月次平均収益率だけを見ていても儲けられる株かどうかの判断が難しいので、参考までに隔月の終値の変動を可視化します。

終値の変動を可視化する
stock %>% 
  ggplot2::ggplot(ggplot2::aes(x = 日付, y = 終値)) + 
    ggplot2::geom_line()

直近三年の月次収益率の変動を可視化する
stock %>% 
  dplyr::mutate(= lubridate::year(日付), 月 = lubridate::month(日付)) %>% 
  dplyr::filter( >= 2019 &  <= 2021) %>% 
  dplyr::mutate(= as.factor()) %>% 
  ggplot2::ggplot(ggplot2::aes(x = , y = 月次収益率, fill = )) +
    ggplot2::geom_bar(stat = "identity", position = "dodge")

 

5.3.1 複数の株を比較する

 複数の同業種銘柄を比較してみます。どの株が儲かりそうでしょうか?

6銘柄の月次平均収益率と標準偏差を可視化する(改良板)
stock_n <- "./data/sample/6銘柄の株価の月次推移_2022-06-15.csv" %>% 
  read_csv()

stock_n %>% df_print()
6銘柄の月次平均収益率と標準偏差を可視化する(改良板)
stock_n %>% 
  dplyr::mutate(dplyr::across(.cols = tidyselect::starts_with("X"),
                              .fns = readr::parse_guess)) %>% 
  dplyr::mutate(date = lubridate::as_date(日付),
                year = lubridate::year(date),
                code = as.character(code)) %>% 
  dplyr::filter(year >= 2010 & year <= 2021) %>% 
  dplyr::group_by(code, year) %>% 
  dplyr::summarise(mean = mean(`前月比%`), sd = sd(`前月比%`)) %>% 
  # print() %>% 
  ggplot2::ggplot(ggplot2::aes(x = year, y = mean, fill = code)) + 
    ggplot2::geom_bar(stat = "identity", position = "dodge") + 
    ggplot2::geom_errorbar(ggplot2::aes(ymax = mean + sd,
                                        ymin = mean - sd),
                           position = "dodge", width = 0.5, size = 0.25) + 
    ggplot2::facet_wrap(~ code)