京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【R言語と米国株】S&P500指数が年初6ヶ月でマイナス20%以上だった年の後半戦、そして翌年はどうなるのか?

2007年9月-と2021年12月-の2つの GSPCプロットの重ね合わせ(2022年9月19日アップデート)

2007-2009年と2021-2022年のS&P500の株価を縮尺を合わせて、プロットを重ねています。 株価がピークであった、2007年9月と2021年12月とをスタートにしています。 2022年9月19日に結果をアップデートしました。

 

S&P500指数が、徐々に下がってきています。やはり9月22日のFOMCは鬼門ですね。

まずは、3650あたりを割れるかどうかを見守りましょうか。

Rコード: 2つのGSPCプロットの重ね合わせ

このRコードでは、plot、axis、axis.Date、mtext関数を使って、 「スケールが異なる、2つの折れ線グラフを重ねる」ということをやっています。

#ライブラリ準備
library(quantmod)

##データ準備
#2007-2009年 S&P 500【^GSPC】の株価取得
NN01 <- 2007
Date <- c(paste0(NN01, "-09-01"), paste0(NN01+2, "-12-31"))  
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                               auto.assign=FALSE, from = Date[1], to=Date[2])

#データフレームの作成
GSPC01 <- data.frame(Date=index(GSPC),
                    Close=as.numeric(GSPC[,c(4)]), 
                    Month=format(index(GSPC), "%m"), 
                    row.names=1:nrow(GSPC))

#2022年 S&P 500【^GSPC】の株価取得
NN01 <- 2021
Date <- c(paste0(NN01, "-12-01"), paste0(NN01+2, "-12-31"))  
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                               auto.assign=FALSE, from = Date[1], to=Date[2])

#データフレームの作成
GSPC02 <- data.frame(Date=index(GSPC),
                    Close=as.numeric(GSPC[,c(4)]), 
                    Month=format(index(GSPC), "%m"), 
                    row.names=1:nrow(GSPC))

##プロット作成
#2007-2009年【^GSPC】
Dat <- GSPC01
M <- max(Dat$Close) + abs(max(Dat$Close) - min(Dat$Close))*0.1
m <- min(Dat$Close) - abs(max(Dat$Close) - min(Dat$Close))*0.1

#プロット
par(mai=c(0.75, 1, 0.75, 1), family = "HiraKakuPro-W3")
plot(Dat$Date, Dat$Close, 
     ylim = c(m, M), 
     xlab = "", ylab = "", 
     type = "l", col = "#E98683", 
     lwd = 2,
     xaxt = "n",
     yaxt = "n")

#軸作成
axis(2, at = seq(600, 1600, by=100))
axis.Date(1, at=seq.Date(min(Dat$Date), max(Dat$Date)+30, by="month")[c(T,F)], format="%B")
mtext("2007-2009年 ^GSPC", side = 2, line=2.5)
mtext("2007年9月-", side = 1, line=2.5)

#2021-2022年【^GSPC】
par(new = TRUE)
Dat0 <- rbind(GSPC02, GSPC01[c((nrow(GSPC02)+1):nrow(GSPC01)),])
Dat0$Date <- GSPC01$Date
Dat0$Close[c((nrow(GSPC02)+1):nrow(GSPC01))] <- NA

Dat <- GSPC02
M <- max(Dat$Close) + abs(max(Dat$Close) - min(Dat$Close))*0.1
m <- min(Dat$Close)/2

#Dateのズレ
Dat0$Date <- Dat0$Date+90

#プロット
plot(Dat0$Date, Dat0$Close, 
     ylim = c(m, M), 
     xlab = "", ylab = "", 
     type = "l", col = "#73CACE", 
     lwd = 2,
     axes = FALSE)
axis(4, at = seq(1800, 5000, by=400))
axis.Date(3, at=(seq.Date(min(Dat0$Date), max(Dat0$Date)+30, by="month"))[c(T,F)], format="%B")
mtext("2021-2022年 ^GSPC", side = 4, line=2.5)  
mtext("2021年12月-", side = 3, line=2.5)  

#サポートライン
abline(h=3650, col="#5ac2c7", lwd=2)
text(Dat0$Date[length(Dat0$Date)]-20, 3650+(max(Dat0$Close, na.rm = T) - min(Dat0$Close, na.rm = T))*0.1, "3650", col="#5ac2c7")

#いったんの下値目処
abline(h=2800, col="#5ac2c7", lwd=2)
text(Dat0$Date[1]+20, 2800+(max(Dat0$Close, na.rm = T) - min(Dat0$Close, na.rm = T))*0.1, "2800", col="#5ac2c7")

#凡例
legend("topright", legend = c("2007-2009年", "2021-2022年"), 
       col = c("#E98683", "#73CACE"), lwd=2, lty = 1, cex=0.8)

年初より続く、S&P500指数の下落はかなり稀だった件

もうすぐ2022年8月も終わろうとしています。 S&P500指数のリターンは、2022年初来6カ月で、-20%以上の大きな下落を記録しました。

6月16日に記録した、3666ポイントが上半期の最安値でした。

https://kumes.github.io/Blog/SP500/GSPC/GSPC_2022.html

年初来、上半期のみで同じくらい下落したことは、過去に5度あったようです。。

1932年(-41.402%)、1940年(-20.982%)、1962年(-22.844%)、1970年(-21.806%)、 そして、今年2022年(-21.081%)です。つまり、52年ぶりの出来事ということです。

消費者物価指数(CPI)、要するに、インフレ率が高止まりしていて、 これほどまでにお金の価値がどんどん下がっているのは、1970年代以来のことらしいです。

消費者物価指数(CPI)についての注釈

消費者が購入する各種の消費やサービスの小売価格の変動を調査・算出した経済指標です。 ある時点を基準に、同等のものを購入した場合に費用がどのように変動したかを指数値で表したもので、物価そのものの変動を測定することを目的としています。 季節的な影響で価格が変動しやすい生鮮食品を除いた「コア指数」が特に注目されています。 世界各国で発表され、各国(地域)のインフレ動向を測る重要な経済指標として、生産者物価指数(PPI)とともにマーケットでも注目されています。

www.daiwa.jp

1970-1971年のS&P500指数のチャート

https://kumes.github.io/Blog/SP500/GSPC/GSPC_1970.html

1970年から1971年のチャートを眺めてみると、どうも1970年の年末ごろには、年初来±0%近くまでで戻っています。 このストーリーは、まだありえるのでしょうか?

それとも、まだまだ金利が上がっている最中で、これは無いのでしょうかね。

2008年のリーマン・ショック時に似ているチャートという噂もチラホラと。。。

https://kumes.github.io/Blog/SP500/GSPC/GSPC_2008.html

2008年のリーマン・ショックで暴落が起こった時のチャートに似てきた、、、そういった巷の噂がチラホラと聴こえてきています。

2008年からのチャートと、2022年のチャートを重ねてみると、どことなく、2022年のチャートはトレースしているように見えだしてきました。

2008年からのチャートと、2022年のチャートを重ねてみると

2008年8月以降の下げで、初めのボトムは11月あたりでした。 そして、2回目のボトムは翌年の5月あたりでした。 人気ユーチューバーが言ってることと同じ?、、、そんなことを勝手に思い巡らせている今日この頃です。

補足

^GSPC

^GSPCが、S&P 500のテッィカーコードです。

finance.yahoo.co.jp

Digital Color Meter.app をターミナルから開く

Digital Color Meter.appは、色のRGB値を抽出してくれるツールです。

ターミナルを起動します。以下をコピペして実行します。

open /System/Applications/Utilities/Digital\ Color\ Meter.app 

ggplotっぽい配色

#2色: シャープな赤色, 大人しい青緑色
col2 <- c( "#E98683", "#73CACE")

#3色
col3 <- c( "#e87d72", "#709bf8", "#53b74c")

#5色
col5 <- c( "#e87d72", "#a3a533", "#56bc82", "#50adf0", "#d972ec")

Rコード

パッケージの準備

quantmodとdygraphsのパッケージをセットアップします。あとは、好みで。

library(quantmod)
library(dygraphs)

S&P500 index: 1928から2022年までのデータを取得する

#S&P500 index 【^GSPC】の株価取得
GSPC.all <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                                 from = "1900-01-01", to="2023-01-01",
                                 auto.assign=FALSE)

#表示
head(GSPC.all)
#           GSPC.Open GSPC.High GSPC.Low GSPC.Close GSPC.Volume GSPC.Adjusted
#1927-12-30     17.66     17.66    17.66      17.66           0         17.66
#1928-01-03     17.76     17.76    17.76      17.76           0         17.76
#1928-01-04     17.72     17.72    17.72      17.72           0         17.72
#1928-01-05     17.55     17.55    17.55      17.55           0         17.55
#1928-01-06     17.66     17.66    17.66      17.66           0         17.66
#1928-01-09     17.50     17.50    17.50      17.50           0         17.50

#対象年
ALLYear <- 1928:2022
#結果の格納変数
Performance <- data.frame(Year=ALLYear, Performance=NA)

#実行
for(n in seq_len(length(ALLYear))){
#検索する年月日の定義
NN00 <- ALLYear[n]
Date <- c(paste0(NN00, "-01-01"), paste0(NN00, "-07-01"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#データフレームの作成
Dat00 <- data.frame(Date=index(GSPC), 
                    Close=as.numeric(GSPC[,c(4)]), 
                    Month=format(index(GSPC), "%m"), 
                    row.names=1:nrow(GSPC))

#7月データを外す
Dat01 <- Dat00[Dat00$Month != "07",]

#6ヶ月の変動を計算
Dat01$ClosePercent <- Dat01$Close/Dat01$Close[1]*100
Performance_6month <- round(Dat01$ClosePercent[nrow(Dat01)] - 100, 3)
Performance$Performance[n] <- Performance_6month
}

年初6ヶ月間で-20%変動の年を見つける

head(Performance)
#  Year Performance
#1 1928       7.770
#2 1929      10.480
#3 1930      -3.399
#4 1931      -6.435
#5 1932     -41.402
#6 1933      59.736

#-20%未満を抽出する
Performance00 <- Performance[Performance$Performance < -20,]

Performance00
#   Year Performance
#5  1932     -41.402
#13 1940     -20.982
#35 1962     -22.844
#43 1970     -21.806
#95 2022     -21.081

1932-1933年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_1932.html

#1932-1933年
NN01 <- Performance00$Year[1]
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01, "-", NN01+1)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

1940-1941年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_1940.html

#1940-1941年
NN01 <- Performance00$Year[2]
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01, "-", NN01+1)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

1962-1963年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_1962.html

#1962-1963年
NN01 <- Performance00$Year[3]
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01, "-", NN01+1)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

1970-1971年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_1970.html

#1970-1971年
NN01 <- Performance00$Year[4]
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01, "-", NN01+1)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

2022年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_2022.html

#2022年
NN01 <- Performance00$Year[5]
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

2008-2009年のS&P 500 index

https://kumes.github.io/Blog/SP500/GSPC/GSPC_2008.html

#2008-2009年
NN01 <- 2008
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  

#S&P 500【^GSPC】の株価取得
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                            auto.assign=FALSE, from = Date[1], to=Date[2])

#全体プロット
GSPC[,4] %>%
  dygraphs::dygraph(main = paste0("S&P 500 index: ", NN01, "-", NN01+1)) %>% 
  dygraphs::dySeries("GSPC.Close", label = "GSPC") %>%
  dygraphs::dyRangeSelector(height = 50)  %>%
  dygraphs::dyAxis(name="x", axisLabelFontSize = 12, axisLabelWidth = 70)  %>%
  htmltools::save_html(file=paste0("GSPC_", NN01, ".html"))

2008-2009年と2022年の2つのプロットの重ね合わせ

このRコードでは、plot、axis、axis.Date、mtext関数を使って、 「スケールが異なる、2つの折れ線グラフを重ねる」ということをやっています。

##データ準備
#2008-2009年 S&P 500【^GSPC】の株価取得
NN01 <- 2008
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+1, "-12-31"))  
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                               auto.assign=FALSE, from = Date[1], to=Date[2])
#データフレームの作成
GSPC01 <- data.frame(Date=index(GSPC),
                    Close=as.numeric(GSPC[,c(4)]), 
                    Month=format(index(GSPC), "%m"), 
                    row.names=1:nrow(GSPC))

#2022年 S&P 500【^GSPC】の株価取得
NN01 <- 2022
Date <- c(paste0(NN01, "-01-01"), paste0(NN01+2, "-12-31"))  
GSPC <- quantmod::getSymbols("^GSPC", src = "yahoo", verbose = T, 
                               auto.assign=FALSE, from = Date[1], to=Date[2])

#データフレームの作成
GSPC02 <- data.frame(Date=index(GSPC),
                    Close=as.numeric(GSPC[,c(4)]), 
                    Month=format(index(GSPC), "%m"), 
                    row.names=1:nrow(GSPC))

##プロット作成
#2008-2009年【^GSPC】
Dat <- GSPC01
M <- max(Dat$Close) + abs(max(Dat$Close) - min(Dat$Close))*0.1
m <- min(Dat$Close) - abs(max(Dat$Close) - min(Dat$Close))*0.1

#プロット
par(mai=c(0.75, 1, 0.5, 1), family = "HiraKakuPro-W3")
plot(Dat$Date, Dat$Close, 
     ylim = c(m, M), 
     xlab = "", ylab = "", 
     type = "l", col = "#E98683", 
     lwd = 2,
     axes = FALSE)
axis(2, at = seq(600, 1600, by=100))
mtext("2008-2009年 ^GSPC", side = 2, line=2.5)  
axis.Date(1, at=seq.Date(min(Dat$Date), max(Dat$Date)+30, by="month")[c(T,F)], format="%B")

#2022年【^GSPC】
par(new = TRUE)
Dat0 <- rbind(GSPC02, GSPC01[c((nrow(GSPC02)+1):nrow(GSPC01)),])
Dat0$Date <- GSPC01$Date
Dat0$Close[c((nrow(GSPC02)+1):nrow(GSPC01))] <- NA

Dat <- GSPC02
M <- max(Dat$Close) + abs(max(Dat$Close) - min(Dat$Close))*0.1
m <- min(Dat$Close)/2

#プロット
plot(Dat0$Date, Dat0$Close, 
     ylim = c(m, M), 
     xlab = "", ylab = "", 
     type = "l", col = "#73CACE", 
     lwd = 2,
     axes = FALSE)
axis(4, at = seq(1800, 5000, by=400))
mtext("2022年 ^GSPC", side = 4, line=2.5)  

#凡例
legend("topright", legend = c("2008-2009年", "2022年"), 
       col = c("#E98683", "#73CACE"), lwd=2, lty = 1, cex=0.8)

参考資料

skume.net

finance.yahoo.co.jp

multivariate-statistics.com

qiita.com

hira-labo.com

stats.biopapyrus.jp