日本国債の金利(の期間構造、イールドカーブ)の時系列推移を可視化してみた
前に書いた記事(βはいかにして時系列推移するのか? - My Life as a Mock Quant)で可視化といふなるものを学習したので調子にのりましてもうちょいやってみようと。
今回は財務省がココに出している日本の国債金利の期間構造、つまりイールドカーブ、これの時系列推移を可視化してみた。
データが1974年から日次で手に入るんだけど、日次で可視化するの重たいから月次で表示。
値の入ってない年限に関しては
- 直近の年限(9Yがないなら8Yの値)の値で外挿入
- ↑がだめなら同年限の直近値
と補間してます(コードでは”na.locf(t(na.locf(t(coredata(jgb.xts)))))”なってる箇所)
結果はこんなかんじ。
・・・動きが気持ちわるっ!そして言うまでもなく昔は金利が高かったのがよくわかる。
これ作るためのソースは↓。コピペすれば動くはず。
主に財務省のデータを捌くのがめんどくさかった、和暦やめて・・・
実行するには前回同様Rのxts、animationパッケージ、それからImageMagick(別途インストール)が必要です。
library(xts) #Source of JGB curve source.jgb <- NULL source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/data/jgbcm_1974-1979.csv" source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/data/jgbcm_1980-1989.csv" source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/data/jgbcm_1990-1999.csv" source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/data/jgbcm_2000-2009.csv" source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/data/jgbcm_2010.csv" source.jgb[[length(source.jgb) + 1]] <- "http://www.mof.go.jp/jgbs/reference/interest_rate/jgbcm.csv" #From Japanese era To ChristianEra ToChristianEra <- function(x) { era <- substr(x, 1, 1) year <- as.numeric(substr(x, 2, nchar(x))) if(era == "H"){ year <- year + 1988 }else if(era == "S"){ year <- year + 1925 } as.character(year) } #Down load yield curve and convert to xts object GetJGBYield <- function(source.url) { jgb <- read.csv(source.url, stringsAsFactors = FALSE) #Extract date only jgb.day <- strsplit(jgb[, 1], "\\.") #stop warning warn.old <- getOption("warn") options(warn = -1) #From Japanese era To ChristianEra jgb.day <- lapply(jgb.day, function(x)c(ToChristianEra(x[1]), x[2:length(x)])) #From date string to date object jgb[, 1] <- as.Date(sapply(jgb.day, function(x)Reduce(function(y,z)paste(y,z, sep="-"),x))) #Convert data from string to numeric jgb[, -1] <- apply(jgb[, -1], 2, as.numeric) options(warn = warn.old) as.xts(read.zoo(jgb)) } #Download JBG yield jgb.list <- lapply(source.jgb, GetJGBYield) #convert one xts object jgb.xts <- Reduce(rbind, jgb.list) #Interpolate(nearest value) coredata(jgb.xts) <- na.locf(t(na.locf(t(coredata(jgb.xts))))) #to monthly jgb.xts <- jgb.xts[endpoints(jgb.xts, on="months",k = 1)] #Label for x-axis label.term <- paste(gsub("X", "", colnames(jgb.xts)), "Y", sep="") #The range of y y.max <- c(min(jgb.xts), max(jgb.xts)) #plot one image Snap <- function(val){ term.structure <- coredata(val) index.date <- index(val) par(xaxt="n") plot(t(term.structure),type="l",lwd=3, col = 2, xlab = "Term", ylab = "Rate", ylim = y.max) par(xaxt="s") axis(1, 1:length(label.term), label.term) text(0.5, y.max[2], as.character(index.date), pos = 4) } #save as gif library(animation) saveGIF({ for(i in 1:nrow(jgb.xts)){Snap(jgb.xts[i])} },interval = 0.01)