After reviewing the stochastic scenario generator, I wanted to look at the deterministics. Per VM-20; the deterministic reserve should be run on scenario 12 from the SERT scenarios. These are generated in the same workbook from the NAIC as the 10,000 scenarios, just with a different setting. More info from the VM: Scenario 12 – Deterministic scenario for valuation There are uniform downward shocks each month for 20 years, sufficient to get down to the one standard deviation point (84%) on the distribution of 20-year shocks. After 20 years, shocks are zero.
# Read in baseline data; full curve
BaseTreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output - base Deterministic/UST - format.csv", header=TRUE)
Up300TreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output +300 Derministic/UST - format.csv", header=TRUE)
Dn300TreasCurve <- read.csv("C:/Users/15733/Documents/Practicum II/Generator output -dn300 Deterministic/UST - format.csv", header=TRUE)
Base scenarios
summary(BaseTreasCurve[,3:12])
## X0.25 X0.5 X1 X2
## Min. :0.00060 Min. :0.00190 Min. :0.00390 Min. :0.00730
## 1st Qu.:0.00929 1st Qu.:0.00989 1st Qu.:0.01097 1st Qu.:0.01276
## Median :0.01048 Median :0.01107 Median :0.01216 Median :0.01395
## Mean :0.01086 Mean :0.01148 Mean :0.01258 Mean :0.01441
## 3rd Qu.:0.01356 3rd Qu.:0.01410 3rd Qu.:0.01507 3rd Qu.:0.01668
## Max. :0.01740 Max. :0.01794 Max. :0.01892 Max. :0.02054
## X3 X5 X7 X10
## Min. :0.00970 Min. :0.01260 Min. :0.01440 Min. :0.01520
## 1st Qu.:0.01416 1st Qu.:0.01613 1st Qu.:0.01741 1st Qu.:0.01859
## Median :0.01535 Median :0.01732 Median :0.01860 Median :0.01979
## Mean :0.01583 Mean :0.01783 Mean :0.01913 Mean :0.02031
## 3rd Qu.:0.01793 3rd Qu.:0.01970 3rd Qu.:0.02085 3rd Qu.:0.02191
## Max. :0.02181 Max. :0.02361 Max. :0.02476 Max. :0.02584
## X20 X30
## Min. :0.01931 Min. :0.01900
## 1st Qu.:0.02018 1st Qu.:0.02073
## Median :0.02138 Median :0.02192
## Mean :0.02196 Mean :0.02249
## 3rd Qu.:0.02334 3rd Qu.:0.02383
## Max. :0.02728 Max. :0.02778
looper <-c(3:12)
for (val in looper)(
print(sd(BaseTreasCurve[,val])))
## [1] 0.003648638
## [1] 0.003553678
## [1] 0.003399769
## [1] 0.003148534
## [1] 0.00296775
## [1] 0.002737975
## [1] 0.002596389
## [1] 0.002496025
## [1] 0.002279975
## [1] 0.002252383
Up 300 bps
summary(Up300TreasCurve[,3:12])
## X0.25 X0.5 X1 X2
## Min. :0.02351 Min. :0.02427 Min. :0.02564 Min. :0.02791
## 1st Qu.:0.02422 1st Qu.:0.02502 1st Qu.:0.02647 1st Qu.:0.02886
## Median :0.02603 Median :0.02689 Median :0.02840 Median :0.03090
## Mean :0.02736 Mean :0.02813 Mean :0.02951 Mean :0.03181
## 3rd Qu.:0.02986 3rd Qu.:0.03066 3rd Qu.:0.03210 3rd Qu.:0.03441
## Max. :0.03589 Max. :0.03644 Max. :0.03742 Max. :0.03905
## X3 X5 X7 X10
## Min. :0.02969 Min. :0.03220 Min. :0.03382 Min. :0.03532
## 1st Qu.:0.03072 1st Qu.:0.03332 1st Qu.:0.03499 1st Qu.:0.03653
## Median :0.03281 Median :0.03545 Median :0.03711 Median :0.03863
## Mean :0.03359 Mean :0.03611 Mean :0.03774 Mean :0.03923
## 3rd Qu.:0.03617 3rd Qu.:0.03866 3rd Qu.:0.04023 3rd Qu.:0.04170
## Max. :0.04032 Max. :0.04260 Max. :0.04440 Max. :0.04525
## X20 X30
## Min. :0.03734 Min. :0.03803
## 1st Qu.:0.03856 1st Qu.:0.03924
## Median :0.04064 Median :0.04132
## Mean :0.04129 Mean :0.04197
## 3rd Qu.:0.04363 3rd Qu.:0.04426
## Max. :0.04940 Max. :0.04900
looper <-c(3:12)
for (val in looper)(
print(sd(Up300TreasCurve[,val])))
## [1] 0.003681132
## [1] 0.003603407
## [1] 0.003468861
## [1] 0.003287979
## [1] 0.003178809
## [1] 0.003068052
## [1] 0.003032775
## [1] 0.00299616
## [1] 0.003112672
## [1] 0.003086868
Down 300 bps
summary(Dn300TreasCurve[,3:12])
## X0.25 X0.5 X1 X2
## Min. :0.00010 Min. :0.000100 Min. :0.000100 Min. :0.000100
## 1st Qu.:0.00010 1st Qu.:0.000100 1st Qu.:0.000950 1st Qu.:0.002990
## Median :0.00010 Median :0.000520 Median :0.001690 Median :0.003600
## Mean :0.00112 Mean :0.001397 Mean :0.002322 Mean :0.004115
## 3rd Qu.:0.00054 3rd Qu.:0.001170 3rd Qu.:0.002300 3rd Qu.:0.004160
## Max. :0.01230 Max. :0.012260 Max. :0.012180 Max. :0.012040
## X3 X5 X7 X10
## Min. :0.000100 Min. :0.000100 Min. :0.000100 Min. :0.000100
## 1st Qu.:0.004590 1st Qu.:0.006850 1st Qu.:0.008310 1st Qu.:0.009670
## Median :0.005100 Median :0.007210 Median :0.008580 Median :0.009840
## Mean :0.005513 Mean :0.007493 Mean :0.008771 Mean :0.009959
## 3rd Qu.:0.005610 3rd Qu.:0.007660 3rd Qu.:0.008970 3rd Qu.:0.010170
## Max. :0.011930 Max. :0.011790 Max. :0.011690 Max. :0.011600
## X20 X30
## Min. :0.00010 Min. :0.00010
## 1st Qu.:0.01148 1st Qu.:0.01206
## Median :0.01148 Median :0.01211
## Mean :0.01155 Mean :0.01210
## 3rd Qu.:0.01162 3rd Qu.:0.01221
## Max. :0.01200 Max. :0.01257
looper <-c(3:12)
for (val in looper)(
print(sd(Dn300TreasCurve[,val])))
## [1] 0.002384278
## [1] 0.002396203
## [1] 0.002233322
## [1] 0.001813209
## [1] 0.001493467
## [1] 0.001068267
## [1] 0.000829648
## [1] 0.0006676462
## [1] 0.0006226544
## [1] 0.0006624745
The goal of these plots is to visualize some of the variance (or lack therof) found above. I set the y axis manually to show scale
p <-ggplot(BaseTreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
geom_line(aes(x=Month, y=X2, color = "#942568"))+
geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
geom_line(aes(x=Month, y=X7, color = "#16217d"))+
geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
geom_line(aes(x=Month, y=X30, color = "#942568"))+
xlab("Month") + #ylab("Interest Rate") +
scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
ggtitle("Int Rates By Tenor & Month, Curr Environment") +
theme(legend.position = "none")
ggplotly(p)
q <-ggplot(Up300TreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
geom_line(aes(x=Month, y=X2, color = "#942568"))+
geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
geom_line(aes(x=Month, y=X7, color = "#16217d"))+
geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
geom_line(aes(x=Month, y=X30, color = "#942568"))+
xlab("Month") + #ylab("Interest Rate") +
scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
ggtitle("Int Rates By Tenor & Month, +300bps Env.") +
theme(legend.position = "none")
ggplotly(q)
r <-ggplot(Dn300TreasCurve, aes(x=Month, y=X0.25, color = "#16217d"))+
geom_line(aes(x=Month, y=X0.5, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X1, color = "#9a2637"))+
geom_line(aes(x=Month, y=X2, color = "#942568"))+
geom_line(aes(x=Month, y=X3, coor = "#49bd2e"))+
geom_line(aes(x=Month, y=X5, color = "#28c1a3"))+
geom_line(aes(x=Month, y=X7, color = "#16217d"))+
geom_line(aes(x=Month, y=X10, color = "#6f2c65"))+
geom_line(aes(x=Month, y=X20, color = "#9a2637"))+
geom_line(aes(x=Month, y=X30, color = "#942568"))+
xlab("Month") + #ylab("Interest Rate") +
scale_y_continuous(name="Interest Rate", labels = scales::percent, limits = c(0, 0.06)) +
ggtitle("Int Rates By Tenor & Month, -300bps Env.") +
theme(legend.position = "none")
ggplotly(r)